Java 何时使用JFrame或JPanel

Java 何时使用JFrame或JPanel,java,swing,user-interface,Java,Swing,User Interface,我是Java GUI编程新手,对何时使用哪些工具有一些疑问 当我的应用程序运行时,会出现一个JFrame,它使用内容面板显示用户3个按钮。我想每个按钮显示不同的屏幕,但不是在一个单独的窗口打开。为了实现这一点,我目前正在处理当前的JFrame,并使用新内容创建一个新的JFrame。以下是我的问题 我应该为每个按钮点击创建一个新的JPanel,而不是创建一个新的JFrame吗?如果这个问题的答案是意见问题,那么是否有普遍接受的最佳做法 关闭JFrame或JPanel时,何时使用setVisible

我是Java GUI编程新手,对何时使用哪些工具有一些疑问

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

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

  • 关闭JFrame或JPanel时,何时使用setVisible(false)vs.dispose()合适

  • 您可以使用CardLayout切换到完全不同的视图 组件,也可以定义不同的JPanel(保留或 重新创造将基于他们互动的设计 带有或由)和添加和 根据需要,将其从机架上拆下。然而,CardLayout是 为此而设计,所以我建议首先研究一下

    创建一个新的JFrame应该会让用户感到困惑,特别是如果您 不要在监视器或显示器上跟踪帧的先前位置 用户设置的自定义大小。我还可以想象会有一个 一帧之前消失时会发生的闪烁 下一个将出现

  • 设置后,应该在JFrame上调用setVisible(true) 它的所有属性和已添加的所有组件 将添加。setVisible()的一部分,如方法中所示 文档说明它将对齐所有组件,因此如果 您调用它,然后在添加组件之后,您可能只看到其中的一些 您的组件是可见的

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

  • 您可以使用CardLayout切换到完全不同的视图 组件,也可以定义不同的JPanel(保留或 重新创造将基于他们互动的设计 带有或由)和添加和 根据需要,将其从机架上拆下。然而,CardLayout是 为此而设计,所以我建议首先研究一下

    创建一个新的JFrame应该会让用户感到困惑,特别是如果您 不要在监视器或显示器上跟踪帧的先前位置 用户设置的自定义大小。我还可以想象会有一个 一帧之前消失时会发生的闪烁 下一个将出现

  • 设置后,应该在JFrame上调用setVisible(true) 它的所有属性和已添加的所有组件 将添加。setVisible()的一部分,如方法中所示 文档说明它将对齐所有组件,因此如果 您调用它,然后在添加组件之后,您可能只看到其中的一些 您的组件是可见的

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


  • 我也会尝试解释一下

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


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

    我也将尝试解释它

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


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

    切换到其他屏幕后,按钮是否应保持在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);
      }
    
    }
    

    切换到其他屏幕后,按钮是否应保持在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);
      }
    
    }
    

    好的,多个jframes在这个字段中是一个nono,对于初学者来说,假设这就是你所说的那么,你真正需要做的就是使用Jframe中的remove()方法来切换你想要或不想要的Jframe,你永远不必创建一个全新的
    好的,多个jframes在这个字段中是一个nono,对于初学者来说…
    观点各不相同。对于初学者来说,多个Jframe在这个领域是不可能的,假设这就是你所说的那么,你真正需要做的就是使用Jframe中的remove()方法来切换你想要或不想要的Jframe,你永远不必创建一个全新的Jframe,多个jframes在这个领域是一个禁忌,对于初学者来说…观点各异。非常感谢您提供的信息。这似乎是一个简单的问题,但我很难找到一个好的答案。任何