【问题标题】:When to use JFrame or JPanel何时使用 JFrame 或 JPanel
【发布时间】:2015-03-11 12:41:40
【问题描述】:

我是 Java 的 GUI 编程新手,对于何时使用哪些工具有几个问题。

当我的应用程序运行时,我会出现一个 JFrame,并使用内容面板向用户显示 3 个按钮。我希望每个按钮显示不同的屏幕,但不在单独的窗口中打开。为此,我目前正在处理当前的 JFrame 并使用新内容创建一个新的 JFrame。这是我的问题。

  1. 我是否应该为每个按钮单击创建一个新的 JPanel 而不是创建一个新的 JFrame?如果这个问题的答案是意见问题,是否存在普遍接受的最佳做法?

  2. 在关闭 JFrame 或 JPanel 时,何时使用 setVisible(false) 与 .dispose() 比较合适?

【问题讨论】:

  • 好吧,对于初学者来说,多个 jframe 是这个领域的一个 nono,当然,假设这就是你所说的
  • 另外,您真正需要做的就是使用 Jframe 中的 remove() 方法来切换您想要或不想要的 jframe 上的内容,您永远不必创建品牌新的
  • Well, multiple jframes is a nono in this field, for starters... 意见不一。

标签: java swing user-interface


【解决方案1】:

切换到另一个屏幕后,按钮是否应该停留在 JFrame 上?如果是,请为 ContentPane 使用 BorderLayout,并将自己的 JPanel 上的 3 个按钮添加到 BorderLayout.NORTH。为您的自定义屏幕使用 3 个 JPanel 并将它们添加到 BorderLayout.CENTER。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ThreeButtonExample extends JFrame {

  private JPanel current;
  private JPanel screen1 = new JPanel();
  private JPanel screen2 = new JPanel();
  private JPanel screen3 = new JPanel();

  public ThreeButtonExample(String title) {
    super(title);
    setMinimumSize(new Dimension(400, 300));

    getContentPane().setLayout(new BorderLayout());

    JPanel buttonPane = new JPanel();

    JButton btnScreen1 = new JButton("Screen 1");
    JButton btnScreen2 = new JButton("Screen 2");
    JButton btnScreen3 = new JButton("Screen 3");

    btnScreen1.setActionCommand("Screen 1");
    btnScreen2.setActionCommand("Screen 2");
    btnScreen3.setActionCommand("Screen 3");

    buttonPane.add(btnScreen1);
    buttonPane.add(btnScreen2);
    buttonPane.add(btnScreen3);

    screen1.setBackground(Color.red);
    screen2.setBackground(Color.green);
    screen3.setBackground(Color.blue);

    btnScreen1.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        changePanel(e);
      }
    });

    btnScreen2.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        changePanel(e);
      }
    });

    btnScreen3.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        changePanel(e);
      }
    });

    getContentPane().add(buttonPane, BorderLayout.NORTH);
    current = screen1;
    getContentPane().add(screen1, BorderLayout.CENTER);

    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
  }

  public void changePanel(ActionEvent e) {
    getContentPane().remove(current);
    switch (e.getActionCommand()) {
      case "Screen 1":
        getContentPane().add(screen1, BorderLayout.CENTER);
        current = screen1;
        break;
      case "Screen 2":
        getContentPane().add(screen2, BorderLayout.CENTER);
        current = screen2;
        break;
      case "Screen 3":
        getContentPane().add(screen3, BorderLayout.CENTER);
        current = screen3;
        break;
    }
    this.revalidate();
    this.repaint();
  }

  public static void main(String[] args) {
    ThreeButtonExample tbe = new ThreeButtonExample("3 Button Test");
    tbe.pack();
    tbe.setVisible(true);
  }

}

【讨论】:

    【解决方案2】:
    1. 您可以使用 CardLayout 切换到完全不同的视图 组件,或者您也可以定义不同的 JPanel(保持或 重新创建将基于他们交互的设计 由或组成)并添加和 根据需要将它们从 JFrame 中删除。然而 CardLayout 是 为此设计的,所以我建议先研究一下。

      创建一个新的 JFrame 应该会让用户感到困惑,尤其是如果您 不要在他们的显示器上跟踪框架的先前位置或 用户设置的自定义尺寸。我也会想象会有一个 当一帧消失之前会发生的那种闪烁 下一个出现。

    2. 你应该在你的 JFrame 上调用 setVisible(true) 当你设置 它的所有属性,并添加了你所有的组件 将添加。如您在方法中看到的 setVisible() 的一部分 文档是它会对齐你的所有组件,所以如果 你调用它,然后在添加组件之后,你可能只会看到一些 您的组件可见。

      你不应该真的需要调用 setVisible(false),或者 在通常情况下使用 dispose()。

    【讨论】:

    • 非常感谢您提供的信息。这似乎是一个简单的问题,但我很难找到一个好的答案。对初学者 Java gui 编程的资源或书籍有什么推荐吗?
    • @ShaneA.Darr 官方的 Java 教程非常好,如果您对 Java 语言非常了解(就像您了解线程一样),那么您可以跳入一本关于 Swing 的好书,标题为“肮脏的富客户”。虽然 Swing 不再更新(它将继续存在),所有新的 GUI 工作都将转到一个名为 JavaFX 的不同 GUI 库。因此,如果您对 Java GUI 开发感兴趣,最好切换到它。从我的搜索来看,似乎没有一本从初学者开始的 JavaFX 好书。
    • @ShaneA.Darr 但是人们确实说 JavaFX 的 Java 教程非常好:docs.oracle.com/javase/8/javase-clienttechnologies.htm
    【解决方案3】:

    我也会试着解释一下。

    JFrame - 用来表示一个窗口应该有的东西。这包括边框(可调整大小的y/n?)、标题栏(应用程序名称或其他消息)、控件(允许最小化/最大化?)和各种系统事件的事件处理程序,如“窗口关闭”(允许应用程序退出吗?)。

    JPanel - 用于将其他元素聚集在一起的通用类。这对于使用可视布局或提供的布局管理器之一更为重要,例如gridbaglayout 等。例如,您有一个比您保留的区域大的文本框。将文本框放在滚动窗格中,然后将该窗格放入 JPanel。那么当你放置JPanel时,它在布局方面会更易于管理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-15
      • 2016-10-09
      • 2022-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多