当前位置: 首页 > 知识库问答 >
问题:

JFrame与JPanel之间的通信

慕意致
2023-03-14
nestedPanel = new separateJPanel

有什么建议可以让我做到这一点吗?

共有1个答案

蒲德曜
2023-03-14

一种简单的方法是给您的JPanel类一个委派方法,允许其他类向感兴趣的按钮添加ActionListeners。例如:

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体系结构的程序。

 类似资料:
  • 问题内容: 我正在学习Java gui。我学会了创建窗口的方法是继承或扩展类,并且很好地使用它,因为它包含窗口的所有属性。现在,如果要在此窗口中添加一些内容,则需要使用方法。但是今天我碰到了一个窗口,我们可以通过添加东西。 两种方法有什么区别?它们之间有某种联系吗? 问题答案: 您不应不必要地扩展该类(仅当您向该类添加其他功能时) JFrame : 扩展和。 它是一个顶层容器,用于表示窗口的最低要

  • 我正在学习Java GUI。我学习创建窗口的方法是继承或扩展类,使用它是很好的,因为包含窗口的所有属性。现在如果我想在这个窗口中添加一些东西,我需要使用方法。但是今天我遇到了,它也创建了一个windows,我们可以通过添加内容。 这两种方法有什么区别?他们有什么关系吗?

  • 我想知道我们是否可以有一个布局不同于其父JFrame的JPanel。例如。如果我有JFrame与边框布局,我们有一个JPanel嵌入到它,它有不同的布局。有可能吗? 我正在努力做这件事。但是这样JPanel的组件就不会显示出来了。

  • 你好,我实际上正在尝试从jPanel切换到我的JFrame中的另一个jPanel。我已经更改了我的代码,下面是我遵循以下内容的样子:

  • 问题内容: 我已经编写了这段代码来显示面板上的一些颜色: 正确位置和正确尺寸的两个第一面板。但是最后一个将所有帧填充为蓝色。怎么了? 问题答案: 您必须使用适当的布局管理器。默认情况下,JFrame有一个。 查看本教程的LayoutManagers: http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html

  • 我使用子JPanel构造JScrollPane,然后尝试将JScrollPane添加到父JPanel中,希望有一个可滚动的自定义JPanel。 我有一个大的细白线前面的所有我的组件,他们是没有滚动。有什么想法吗?