【问题标题】:How to switch JPanels from different classes如何从不同的类切换 JPanel
【发布时间】:2013-07-03 20:50:35
【问题描述】:

我有三个类,一个 JFrame 类和两个 JPanel 类。我已经像这样将初始 JPanel 添加到 JFrame

 public JFrame() {

    add(new 1stPanel(this));


    setVisible(true);
    setLayout(null);
}

然后我想在第一个面板中的按钮上使用一个动作监听器来删除它并添加另一个类中的另一个面板。我尝试给每个类一个变量,并像这样使用简单的 remove() 和 add():

private 1stpanel 1p;
private 2ndpanel 2p;

btn.addActionListener((new ActionListener(){
        public void actionPerformed(ActionEvent  e)
            {
            remove(1p);
            add(2p);
            validate();
            repaint();
            }
        }));

这不起作用我也尝试过使用 JFrame.remove(1p) 但这也不起作用。当我执行 removeAll() 时,它会删除第一个面板 JPanel 中的所有内容,但随后我无法添加第二个面板。 我可以使用什么代码取出第一个面板或第一个面板类并添加另一个类中的第二个面板。 提前感谢您的帮助。

【问题讨论】:

  • yourframe.getContentPane()上尝试所有这些操作
  • setLayout(null); 不要那样做。 Java GUI 可能必须在多个平台、不同的屏幕分辨率和使用不同的 PLAF 上工作。因此,它们不利于组件的精确放置。要为强大的 GUI 组织组件,请改用布局管理器或它们的组合,以及用于空白空间的布局填充和边框。

标签: java swing jpanel


【解决方案1】:

尝试使用CardLayout 和交换卡(面板)。

你的问题可能是创建add(new 1stPanel(this))。您添加一个局部变量,然后使用类的字段。

【讨论】:

    【解决方案2】:

    你的代码行

            remove(1p);
            add(2p);
            validate();
            repaint();
    

    您在动作侦听器中调用的对象正在被我怀疑是 JPanel 本身的 this 对象上调用。如果是这样,在扩展 JFrame 的类中定义一个方法,将这些代码放在该方法中,并在动作事件中调用该方法。

    【讨论】:

    • 刚试过这个public void switchpanels(){ remove(1p); add(2p); validate(); repaint(); } btn.addActionListener((new ActionListener(){ public void actionPerformed(ActionEvent e) { switchpanels(); } }));
    • 结果如何。顺便说一句,switchpanels() 方法需要在扩展 JFrame 的类中。
    • 哦好的我把switch panel方法放进去看看会发生什么
    • 它要求将切换面板方法放在 1stpanel 类中
    • setLayout(null); 工作正常我只需要知道如何将什么代码放入 actionListener 以摆脱第一个面板并添加第二个面板。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    • 2014-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多