程序运行时添加控件时的重画问题
/*
* @(#) 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()方法里应该怎么添加什么代码?怎么写? 程序其它地方是不是也有错误?
搜索更多相关的解决方案:
控件 运行
----------------解决方案--------------------------------------------------------
其实那些东西本来不应该由你来实现的
你只要把它加到你的容器里去
然后调用更新,JVM会自动把它画出来的
----------------解决方案--------------------------------------------------------
开始时,我也是在componentResized()方法中调用panel1.repaint()方法,但是不起作用。
----------------解决方案--------------------------------------------------------
是不是要用其它的什么Method?
----------------解决方案--------------------------------------------------------
将componentResized()方法里的代码改成下面的也不行
public void componentResized(ComponentEvent event) {
Graphics g = panel1.getGraphics();
panel1.update(g);
}
----------------解决方案--------------------------------------------------------
[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 完全不用去加的
----------------解决方案--------------------------------------------------------
两个Panel的颜色是不同的,Panel1是灰色的,Panel2是白色的。
我的本意是这样的:
当单击 Add Panel 按钮后,改变窗口的大小不会影响到Panel2(就是那个白色区域(0,0,200,100))还是正常显示。
存在的问题:
但是现在当添加Panel2后,改变一下窗口的大小,然后Panel2就变成Panel1上方中央一个很小的白色小块了。
----------------解决方案--------------------------------------------------------
原是你想那样是吧
你把
panel2.setPreferredSize(new Dimension(200, 100));
替换你的
panel2.setSize(200, 100);
就可以了
----------------解决方案--------------------------------------------------------
我的意思就是这样的,封歌真是厉害,小弟以后好好向封哥学习!
----------------解决方案--------------------------------------------------------