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

何时使用JFrame或JPanel

益富
2023-03-14

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

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

>

  • 我应该为每一次按钮点击创建一个新的JPanel,而不是创建一个新的JFrame吗?如果这个问题的答案是一个意见问题,是否有普遍接受的最佳实践?

    当关闭JFrame或JPanel时,何时使用setVisible(false)vs是合适的。dispose()?

  • 共有3个答案

    闻人凯泽
    2023-03-14

    切换到其他屏幕后,按钮是否应保持在JFrame上?如果是,请为ContentPane使用BorderLayout,并将自己的JPanel上的3个按钮添加到BorderLayout。北为自定义屏幕使用3个JPanel,并将其添加到BorderLayout。居中

    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);
      }
    
    }
    
    太叔烨霖
    2023-03-14

    我也会解释一下。

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

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

    仇征
    2023-03-14

    >

  • 您可以使用CardLayout切换到完全不同的组件视图,也可以定义不同的JPanel(保留或创建新的JPanel将基于它们与之交互或由其组成的设计),并根据需要在JFrame中添加和删除它们。然而,CardLayout就是为此而设计的,所以我建议先研究一下。

    创建一个新的JFrame应该会让用户感到困惑,尤其是如果您没有跟踪帧在其监视器上的先前位置或用户设置的自定义大小。我还可以想象,当一帧在下一帧出现之前消失时,会出现某种闪烁。

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

    通常情况下,您不应该真正需要调用setVisible(false)或dispose()。

  •  类似资料:
    • 问题内容: 现在的示例中,我有一个包含jtable的主框架,显示所有客户信息,并且有一个create按钮来打开一个新的JFrame,允许用户创建新客户。我不希望用户可以打开多个创建框架。任何swing组件或API都能做到吗?或如何禁用主机?类似于JDialog。 问题答案: 我建议您将新客户对话框设置为模态,以便在应用程序可见时,不允许其他对话框/框架中的输入。请查看模态教程以了解详细信息。

    • 我正在使用一个独立的星火集群,一个主和两个工人。我真的不明白如何明智地使用SPARK_CLASSPATH或sparkcontext.addjar。我两个都试过了,看起来addJar并不像我以前认为的那样起作用。 在我的例子中,我尝试在闭包中或外部使用一些joda-time函数。如果我将SPARK_CLASSPATH设置为joda-time jar的路径,那么一切正常。但如果我删除SPARK_CLA

    • 我需要弄清楚一些事情。我一直在寻找这个问题的答案,但我似乎找不到一个好的答案来回答我的具体问题(例如,这个问题是对答案的蚕食:servlet和web服务之间的区别)。 据我所知,在“面向MVC”的web应用程序中,有不同的方法可以实现“请求处理”,也就是“控制器”,其中两种方法是: null null [编辑]:强调的关键词

    • 问题内容: 我试图在弹出新框架时禁用“主” 。我想要它,所以您不能在该框架上单击或拖动任何东西。我尝试将新框架设为a ,但这并没有禁用其他框架。我还查看了有关此的另一篇文章,建议将其设置为a,但仍然无法正常工作。我真的需要帮助。谢谢。这是我正在使用的代码,他们有什么问题吗? 代表“主”框架。 问题答案: 您已经设置了JDialog#setModal或JDialog#ModalityTypes,可能

    • 问题内容: 我已经开始学习Java的并发和线程。我知道同步的基础知识(即它的作用)。从概念上讲,我知道它提供了对Java中具有多个线程的共享资源的互斥访问。但是,当面对下面的示例时,让我感到困惑的是同步它是否是一个好主意。我知道代码的关键部分应该同步,并且不应过度使用此关键字,否则会影响性能。 问题答案: 假设每个线程通过 不同的数组, 则不需要同步,因为其余变量是局部的。 相反,如果您触发所有调

    • 问题内容: 因此,我试图用()移动矩形,并且每当我尝试按下键时,矩形都不会移动。 绘制了矩形,但是每当我按和键时,都不会发生任何事情。我有两个类,一个是我的带有keyEvents和frame的主类,另一个是绘制矩形并保存用于移动矩形的函数。 这是我的代码: 现在是第二堂课: 请告诉我如何移动矩形。提前致谢! 问题答案: 矩形没有移动,因为使用不正确。您必须分配给而不是忽略实例化的对象。 @MadP