Java 何时使用JFrame或JPanel
我是Java GUI编程新手,对何时使用哪些工具有一些疑问 当我的应用程序运行时,会出现一个JFrame,它使用内容面板显示用户3个按钮。我想每个按钮显示不同的屏幕,但不是在一个单独的窗口打开。为了实现这一点,我目前正在处理当前的JFrame,并使用新内容创建一个新的JFrame。以下是我的问题Java 何时使用JFrame或JPanel,java,swing,user-interface,Java,Swing,User Interface,我是Java GUI编程新手,对何时使用哪些工具有一些疑问 当我的应用程序运行时,会出现一个JFrame,它使用内容面板显示用户3个按钮。我想每个按钮显示不同的屏幕,但不是在一个单独的窗口打开。为了实现这一点,我目前正在处理当前的JFrame,并使用新内容创建一个新的JFrame。以下是我的问题 我应该为每个按钮点击创建一个新的JPanel,而不是创建一个新的JFrame吗?如果这个问题的答案是意见问题,那么是否有普遍接受的最佳做法 关闭JFrame或JPanel时,何时使用setVisible
我也会尝试解释一下 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在这个领域是一个禁忌,对于初学者来说…观点各异。非常感谢您提供的信息。这似乎是一个简单的问题,但我很难找到一个好的答案。任何