java - 如何禁止 JPanel 在 Java 中执行任何操作

标签 java swing jpanel frame

我在禁用 JPanel 以在其内部调用任何方法时遇到问题。我设置了一个带有 2 个 JPanel 的框架来控制框架的图形。问题是,如果我将一个新的 JPanel 添加到 Frame 并且我还删除了之前存在的旧 JPanel,那么旧 JPanel 中的 paint 方法仍然会被调用。

这是我用来测试的代码:

开始类:

    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) {}
    }

测试面板类:

    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 是 Activity 的,而 P2 什么也不做,即使它显示在屏幕上也是如此。

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

最佳答案

让我们开始

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 实际上开始调用了??

关于java - 如何禁止 JPanel 在 Java 中执行任何操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13962831/

相关文章:

java - Swing 问题绘制 2 个图像

java - Codility PermMissingElem 给出了奇怪的结果

java - JPA如何使用级联删除删除作为onetoone目标的实体

java - 枚举静态数组和注解值混淆

java - 使用yearTF.setText(String.format ("%.0f",year))时防止我的 double 向上舍入

java - 如何将 Icon 放置在 JPanel 的顶部和底部

java - Vaadin - 在表格内单击触发按钮

java - 无法添加 ActionListener 来添加组件

java - JPanel 重绘无法正常工作

java - 在java中的分割 Pane 上添加jpanels