【问题标题】:Communication between JFrame and JPanelJFrame 和 JPanel 之间的通信
【发布时间】:2015-02-06 18:34:28
【问题描述】:

我在 NetBeans 中使用 JFrame Form 创建了 JFrame。在这个 JFrame 中,我有 JPanel 和第二个 JPanel 嵌套。然后我有单独的 JPanel 类(我扩展了 JPanel)。

我想将这个单独的 JPanel 用作 JFrame 中的嵌套 JPanel。当我单击一个 JButton 时,我想通知 JFrame,该按钮已被单击。

到目前为止,我已经设法使用 JFrame 的 initComponents() 中的以下内容将单独的 JPanel 获取到 JFrame:

nestedPanel = new separateJPanel

但现在我不知道如何发送按钮已被点击的信息。

我有什么技巧可以做到这一点吗?

【问题讨论】:

  • 将 IDE 置于设计模式。单击您创建的按钮。在左侧,您应该在属性下看到一个名为事件的选项卡。如果您单击其中一个,则会在面板中创建一个方法,该按钮是嵌套的。

标签: java swing jframe jpanel


【解决方案1】:

你可以给框架一个面板属性,给面板一个框架属性,在内存中将它们绑定在一起。通过这种方式,您可以轻松地将数据通过实例字段相互传递。

public MyPanel extends JPanel {

    MyFrame frame;

    MyPanel(MyFrame frame) {
        this.panel = panel;
    }
}

【讨论】:

  • 虽然它会起作用,但我个人不喜欢以这种方式将类公开给其他类(面板真的应该能够更改框架的属性吗?)。一般来说,我更喜欢使用描述两个类之间契约的接口,但这只是我;)
【解决方案2】:

一种简单的方法是为您的 JPanel 类提供一个委托方法,该方法允许其他类将 ActionListener 添加到感兴趣的按钮。例如:

public void addButton1ActionListener(ActionListener listener) {
   button1.addActionListener(listener);
}

这样,如果 JFrame 持有 JPanel 的实例,它可以调用此方法将侦听器传递给 JButton。例如:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class Foo {
   private static void createAndShowGui() {
      Frame1 frame = new Frame1();
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

// I almost never extend JFrame
class Frame1 extends JFrame {
   private Panel1 panel1 = new Panel1();
   private JLabel label = new JLabel(" ", SwingConstants.CENTER);

   public Frame1() {
      super("Foo");
      setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      add(panel1, BorderLayout.CENTER);
      add(label, BorderLayout.SOUTH);
      pack();
      setLocationByPlatform(true);

      panel1.addButton1ActionListener(new ActionListener() {

         @Override
         public void actionPerformed(ActionEvent e) {
            label.setText("Button pressed");
         }
      });
   }
}

class Panel1 extends JPanel {
   private JButton button1 = new JButton("Button");

   public Panel1() {
      add(button1);
   }

   public void addButton1ActionListener(ActionListener listener) {
      button1.addActionListener(listener);
   }
}

请注意,此解决方案适用于简单的玩具程序,但如果您的想法是创建一个真正的大型应用程序,那么这将无法很好地扩展,因为它会增加代码的耦合并降低内聚性。在这种情况下,更好的办法是努力创建一个使用更多模型-视图-控制或 MCV 架构的程序。

【讨论】:

  • 谢谢,这就是我要找的。​​span>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
  • 2012-12-20
  • 1970-01-01
  • 2012-02-10
  • 1970-01-01
  • 2021-06-04
相关资源
最近更新 更多