java - 在两个 JPanel 对象之间发送消息

标签 java oop swing user-interface jpanel

我有一个包含 JPanel 的 Java JFrame。在该 JPanel 中,有两个独立的 JPanel。当用户单击第一个 JPanel 中的按钮时,需要向另一个 JPanel 发送一条消息,通知它单击了哪个按钮。在这样的对象之间发送消息的最简单方法是什么?

最佳答案

对于 mKorbel(和原始海报):
我推荐的是更松散的耦合,一个 JPanel 不知道另一个 JPanel,并且所有连接都是通过某种控件完成的。例如,借用你的一些代码:

复制TextNorthPanel2.java

import java.awt.*;
import javax.swing.*;

public class CopyTextNorthPanel2 extends JPanel {

   private static final long serialVersionUID = 1L;
   public JTextField northField;

   public CopyTextNorthPanel2() {
      northField = new JTextField("Welcome World");
      northField.setFont(new Font("Serif", Font.BOLD, 20));
      northField.setPreferredSize(new Dimension(300, 25));
      add(northField);
   }

   public String getNorthFieldText() {
      return northField.getText();
   }
}

复制TextSouthPanel2.java

import java.awt.event.*;
import javax.swing.*;

public class CopyTextSouthPanel2 extends JPanel {

   private static final long serialVersionUID = 1L;
   private JTextField firstText = new JTextField("Desired TextField");
   private JButton copyButton = new JButton("Copy text from JTextFields");
   private CopyTextControl2 control;

   public CopyTextSouthPanel2() {
      copyButton.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            if (control != null) {
               control.copyAction();
            }
         }
      });

      add(firstText);
      add(copyButton);
   }

   public void setControl(CopyTextControl2 control) {
      this.control = control;
   }

   public void setFirstText(String text) {
      firstText.setText(text);
   }
}

CopyTextControl2.java

public class CopyTextControl2 {
   private CopyTextNorthPanel2 northPanel;
   private CopyTextSouthPanel2 southPanel;

   public void copyAction() {
      if (northPanel != null && southPanel != null) {
         southPanel.setFirstText(northPanel.getNorthFieldText());
      }
   }

   public void setNorthPanel(CopyTextNorthPanel2 northPanel) {
      this.northPanel = northPanel;
   }

   public void setSouthPanel(CopyTextSouthPanel2 southPanel) {
      this.southPanel = southPanel;
   }

}

复制文本2.java

import java.awt.*;
import javax.swing.*;

public class CopyText2 {

   private static void createAndShowUI() {
      CopyTextNorthPanel2 northPanel = new CopyTextNorthPanel2();
      CopyTextSouthPanel2 southPanel = new CopyTextSouthPanel2();
      CopyTextControl2 control = new CopyTextControl2();

      southPanel.setControl(control);
      control.setNorthPanel(northPanel);
      control.setSouthPanel(southPanel);

      JPanel mainPanel = new JPanel(new BorderLayout());
      mainPanel.add(northPanel, BorderLayout.NORTH);
      mainPanel.add(Box.createRigidArea(new Dimension(100, 100)), BorderLayout.CENTER);
      mainPanel.add(southPanel, BorderLayout.SOUTH);

      JFrame frame = new JFrame("Copy Text");
      frame.getContentPane().add(mainPanel);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            createAndShowUI();
         }
      });
   }
}

关于java - 在两个 JPanel 对象之间发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7053283/

相关文章:

java - @Valid 失败时自动返回输入表单

java - 顺序运行 jbehave 故事

java - 从绘图对象中清除窗口

java - 如何将 JTextField 动态添加到 JScrollPane 中?

java - JTextArea 中的 ScrollPane

java - 当 ConnectTimeout 和 ReadTimeout 无限时出现 SocketTimeoutException?

java - 序列化模拟抛出异常

java - 将字段限制为类的实例并同时实现接口(interface)

java - 将java中的货币从 float 转换为整数

c++ - 用 C++ 编写多平台实现