| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1129 人关注过本帖
标题:程序运行时添加控件时的重画问题
只看楼主 加入收藏
liugy52
Rank: 1
等 级:新手上路
帖 子:89
专家分:0
注 册:2006-10-1
收藏
 问题点数:0 回复次数:8 
程序运行时添加控件时的重画问题

/*
* @(#) AddPanel.java
*/

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class AddPanel extends JFrame implements ActionListener {
private JPanel panel1;
private JPanel panel2;
private JButton button;

public AddPanel() {
panel1 = new JPanel();
panel1.setBackground(Color.gray);
Panel1Handler handler = new Panel1Handler();
panel1.addContainerListener(handler);
panel1.addComponentListener(handler);
add(panel1, BorderLayout.CENTER);

panel2 = new JPanel();
panel2.setBackground(Color.white);
panel2.setSize(200, 100);

button = new JButton("Add Panel");
button.addActionListener(this);
add(button, BorderLayout.SOUTH);

setSize(400, 300);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public void actionPerformed(ActionEvent event) {
panel1.add(panel2);
}

class Panel1Handler implements ContainerListener, ComponentListener {
public void componentAdded(ContainerEvent event) {
System.out.println("componentAdded");
panel1.repaint();
}

public void componentRemoved(ContainerEvent event) {
System.out.println("componentRemoved");
}

public void componentHidden(ComponentEvent event) {
System.out.println("componentHidden");
}

public void componentMoved(ComponentEvent event) {
System.out.println("componentMoved");
}

public void componentResized(ComponentEvent event) {
System.out.println("componentResized");
}

public void componentShown(ComponentEvent event) {
System.out.println("componentShown");
}
}

public static void main(String[] args) {
AddPanel application = new AddPanel();
}
}

注意:用JDK5.0版本编译执行。

程序运行后,单击 Add Panel 按钮后,可以正常添加并显示Panel2,但是当改变窗口大小后,Panel2就不能正常显示了,componentResized()方法里应该怎么添加什么代码?怎么写? 程序其它地方是不是也有错误?

搜索更多相关主题的帖子: 控件 运行 
2006-12-17 13:42
千里冰封
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:灌水之王
等 级:版主
威 望:155
帖 子:28477
专家分:59
注 册:2006-2-26
收藏
得分:0 
其实那些东西本来不应该由你来实现的
你只要把它加到你的容器里去
然后调用更新,JVM会自动把它画出来的

可惜不是你,陪我到最后
2006-12-17 15:05
liugy52
Rank: 1
等 级:新手上路
帖 子:89
专家分:0
注 册:2006-10-1
收藏
得分:0 
开始时,我也是在componentResized()方法中调用panel1.repaint()方法,但是不起作用。

我在大家热情的帮助下进步,谢谢你们!
2006-12-17 15:19
liugy52
Rank: 1
等 级:新手上路
帖 子:89
专家分:0
注 册:2006-10-1
收藏
得分:0 
是不是要用其它的什么Method?

我在大家热情的帮助下进步,谢谢你们!
2006-12-17 15:20
liugy52
Rank: 1
等 级:新手上路
帖 子:89
专家分:0
注 册:2006-10-1
收藏
得分:0 

将componentResized()方法里的代码改成下面的也不行
public void componentResized(ComponentEvent event) {
Graphics g = panel1.getGraphics();
panel1.update(g);
}


我在大家热情的帮助下进步,谢谢你们!
2006-12-17 15:24
千里冰封
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:灌水之王
等 级:版主
威 望:155
帖 子:28477
专家分:59
注 册:2006-2-26
收藏
得分:0 

[CODE]import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.ContainerEvent;
import java.awt.event.ContainerListener;
public class AddPanel extends JFrame implements ActionListener {
private JPanel panel1;
private JPanel panel2;
private JButton button;
public AddPanel() {
panel1 = new JPanel();
panel1.setBackground(Color.gray);
Panel1Handler handler = new Panel1Handler();
panel1.addContainerListener(handler);
panel1.addComponentListener(handler);
add(panel1, BorderLayout.CENTER);

panel2 = new JPanel();
panel2.setBackground(Color.white);
panel2.setSize(200, 100);
button = new JButton("Add Panel");
button.addActionListener(this);
add(button, BorderLayout.SOUTH);

setSize(400, 300);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void actionPerformed(ActionEvent event) {
panel1.add(new JButton("新加的"));
SwingUtilities.updateComponentTreeUI(this);
}
class Panel1Handler implements ContainerListener, ComponentListener {
public void componentAdded(ContainerEvent event) {
System.out.println("componentAdded");
panel1.repaint();
}
public void componentRemoved(ContainerEvent event) {
System.out.println("componentRemoved");
}
public void componentHidden(ComponentEvent event) {
System.out.println("componentHidden");
}
public void componentMoved(ComponentEvent event) {
System.out.println("componentMoved");
}
public void componentResized(ComponentEvent event) {
System.out.println("componentResized");
}
public void componentShown(ComponentEvent event) {
System.out.println("componentShown");
}
}
public static void main(String[] args) {
AddPanel application = new AddPanel();
}
}[/CODE]

看看吧,你之所以会出现那个问题是因为JPanel本来就不是很明显的东西.加了和没加一样,我现在加的是一个按钮,然后调用了刷新整个组件树的方法,这样就可以立即看到了
你那个ContainerListener, ComponentListener 完全不用去加的


可惜不是你,陪我到最后
2006-12-17 15:32
liugy52
Rank: 1
等 级:新手上路
帖 子:89
专家分:0
注 册:2006-10-1
收藏
得分:0 

两个Panel的颜色是不同的,Panel1是灰色的,Panel2是白色的。

我的本意是这样的:
当单击 Add Panel 按钮后,改变窗口的大小不会影响到Panel2(就是那个白色区域(0,0,200,100))还是正常显示。

存在的问题:
但是现在当添加Panel2后,改变一下窗口的大小,然后Panel2就变成Panel1上方中央一个很小的白色小块了。


我在大家热情的帮助下进步,谢谢你们!
2006-12-17 16:05
千里冰封
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:灌水之王
等 级:版主
威 望:155
帖 子:28477
专家分:59
注 册:2006-2-26
收藏
得分:0 

原是你想那样是吧

你把
panel2.setPreferredSize(new Dimension(200, 100));
替换你的
panel2.setSize(200, 100);
就可以了


可惜不是你,陪我到最后
2006-12-17 17:05
liugy52
Rank: 1
等 级:新手上路
帖 子:89
专家分:0
注 册:2006-10-1
收藏
得分:0 
我的意思就是这样的,封歌真是厉害,小弟以后好好向封哥学习!

我在大家热情的帮助下进步,谢谢你们!
2006-12-17 17:10
快速回复:程序运行时添加控件时的重画问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016849 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved