Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JFrame与JPanel之间的通信_Java_Swing_Jframe_Jpanel - Fatal编程技术网

Java JFrame与JPanel之间的通信

Java JFrame与JPanel之间的通信,java,swing,jframe,jpanel,Java,Swing,Jframe,Jpanel,我在NetBeans中使用JFrame表单创建了JFrame。在这个JFrame中,我有一个嵌套了第二个JPanel的JPanel。然后我有单独的JPanel类(我扩展了JPanel) 我想使用这个单独的JPanel作为JFrame中的嵌套JPanel。当我点击一个JButton时,我想通知JFrame这个按钮被点击了 到目前为止,我已经在JFrame的initComponents()中使用以下命令将单独的JPanel获取到JFrame: nestedPanel = new separateJP

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

我想使用这个单独的JPanel作为JFrame中的嵌套JPanel。当我点击一个JButton时,我想通知JFrame这个按钮被点击了

到目前为止,我已经在JFrame的
initComponents()
中使用以下命令将单独的JPanel获取到JFrame:

nestedPanel = new separateJPanel
但现在我不知道如何发送已单击按钮的信息


有什么技巧可以实现这一点吗?

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

public MyPanel extends JPanel {

    MyFrame frame;

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

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

public void addButton1ActionListener(ActionListener listener) {
   button1.addActionListener(listener);
}
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);
   }
}
这样,如果JFrame持有JPanel的实例,它可以调用此方法将侦听器传递到JButton。例如:

public void addButton1ActionListener(ActionListener listener) {
   button1.addActionListener(listener);
}
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体系结构的程序。

将IDE置于设计模式。单击您创建的按钮。在左侧,您应该看到“属性”下一个名为“事件”的选项卡。如果单击其中一个按钮,将在面板中创建一个方法,该按钮是嵌套的。虽然它可以工作,但我个人不喜欢以这种方式向其他类公开类(面板是否真的能够更改框架的属性?)。一般来说,我更喜欢使用一个接口来描述两个类之间的契约,但这只是我;)谢谢,这就是我要找的。