java panel重画_程序运行时添加控件时的重画问题

程序运行时添加控件时的重画问题

/*

* @(#) 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);

就可以了

----------------解决方案--------------------------------------------------------

我的意思就是这样的,封歌真是厉害,小弟以后好好向封哥学习!

----------------解决方案--------------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值