如何禁用JPanel在Java中执行任何操作

时间:2012-12-19 23:14:00

标签: java swing jpanel frame

我有一个问题,禁止JPanel在其中调用任何方法。我设置了一个带有2个JPanel的Frame来控制Frame的图形。问题是,如果我是一个新的JPanel到Frame并且我也删除了之前存在的旧JPanel,旧的JPanel中的paint方法仍然被调用。

以下是我用来测试此代码的代码:

Start类:

    import java.awt.Frame;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.awt.event.WindowEvent;
    import java.awt.event.WindowListener;

    public class Start implements WindowListener, KeyListener{
        public static void main(String[] args) {
            new Start();
        }

        Frame frame = new Frame("Frame");

        TestPanel P1 = new TestPanel();
        TestPanel P2 = new TestPanel();

        static boolean active = true;

        public Start() {
            frame.setSize(500,500);
            frame.setLocationRelativeTo(null);
            frame.addWindowListener(this);
            frame.addKeyListener(this);
            frame.setVisible(true);
            frame.add(P1);
            for (Object c : frame.getComponents()){
                System.out.println(c.toString());
            }
        }

        @Override
        public void keyPressed(KeyEvent e) {
            if (active){
                frame.remove(P1);
                    frame.add(P2);
            }else{
                frame.remove(P2);
                frame.add(P1);
            }
            active = !active;
            for (Object c : frame.getComponents()){
                System.out.println(c.toString());
            }
        }

        @Override
        public void windowClosing(WindowEvent e) {
            System.exit(0);
        }

        public void windowOpened(WindowEvent e) {}
        public void windowClosed(WindowEvent e) {}
        public void windowIconified(WindowEvent e) {}
        public void windowDeiconified(WindowEvent e) {}
        public void windowActivated(WindowEvent e) {}
        public void windowDeactivated(WindowEvent e) {}
        public void keyTyped(KeyEvent e) {}
        public void keyReleased(KeyEvent e) {}
    }

TestPanel类:

    import java.awt.Graphics;
    import javax.swing.JPanel;


    public class TestPanel extends JPanel{
        boolean active = Start.active;

        @Override
        public void paint(Graphics g) {
            System.out.println(active);
        }
    }

此程序始终打印“true”,显示只有对象P1处于活动状态且P2即使在屏幕上显示也无效。

所以我要问的是如何让P1对象停止获取当它不在屏幕上时调用的paint方法,并让P2对象在显示时调用其paint方法。

3 个答案:

答案 0 :(得分:2)

让我们从

开始
TestPanel P1 = new TestPanel();
TestPanel P2 = new TestPanel();

P1P2是同一个类的单独实例。

看看

static boolean active = true;

// From TestPane
public void paint(Graphics g) {
    System.out.println(active);
}

因此,无论屏幕上显示哪个面板,它都会始终显示active的值。

你没有提供实际识别对象不同实例的方法,所以,你怎么知道P1实际上是开始调用的?

答案 1 :(得分:1)

每个面板中的局部变量“active”不是引用,它是原始的。它的值设置为在创建面板时在“开始”类中设置的静态值。对于两个Panel实例,您在代码中显示的是“true”。这解释了为什么“true”始终由您的代码打印。

就显示问题而言,请注意删除功能的JavaDoc:

  

注意:如果已从已经过的容器中删除了某个组件   显示,必须在该容器上调用validate()以反映   变化。如果要删除多个组件,则可以进行改进   通过在所有组件之后只调用一次validate()来提高效率   已被删除。

答案 2 :(得分:1)

可能是因为Frame的remove方法适用于MenuComponent。 http://docs.oracle.com/javase/6/docs/api/java/awt/Frame.html#remove%28java.awt.MenuComponent%29 ...正确的方法是使用frame.getContentPane()。add(P1)添加组件。尝试使用frame.getContentPane()。remove(P1)来查看它是否有效。