我目前正在 Uni 学习软件工程,我正在努力了解如何将 JPanel 正确添加到 JFrame 上。我的 JPanel 有几个按钮和一个 JLabel,它通过单击其中一个按钮并使用 ActionListener 进行更改。
我知道有几种方法可以做到这一点,这是我一直在尝试的方法,但我终究无法弄清楚!
我知道我做错了,但这是什么?
这是我的代码:
UIPanelOne:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.event.*;
public class UIPanelOne extends JPanel implements ActionListener {
private JButton yes, no, cancel;
private JPanel panel;
private JLabel l1, l2;
UIPanelOne() {
super();
setVisible(true);
//label dec
panel = new JPanel();
//buttons
yes = new JButton("Yes");
no = new JButton("No");
cancel = new JButton("Cancel");
//label dec
l1 = new JLabel("Hello");
//button dec
panel.setLayout(new BorderLayout());
panel.add(yes);
panel.add(no);
panel.add(cancel);
panel.add(l1);
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == yes) {
l1.setText("OK then!");
}else if (e.getSource() == no){
l1.setText("Goodbye then!");
}else if(e.getSource() == cancel){
System.exit(0);
}
}
public JComponent getGUI(){
return panel;
}
}
用户界面框架:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class UIFrame extends JFrame{
//constructor
public UIFrame(){
//layout
super("Can I help you?");
setSize(400,600);
setLayout(new BorderLayout());
setVisible(true);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
UIPanelOne hello = new UIPanelOne();
getContentPane().add(hello.getGUI());
}
}
UI 测试:
public class UITest {
public static void main(String[] args){
UIFrame frame = new UIFrame();
frame.pack();
}
}
我知道很多这可能是错误的,我是一个完全的业余爱好者,但我希望在一些帮助下变得更好!
最佳答案
由于您的 UIPanelOne
扩展了 JPanel
类,您可以在该面板上添加您的组件(无需创建新面板),创建一个新实例并将该实例传递给添加JFrame
方法:
add(new UIPanelOne());
或
UIPanelOne hello = new UIPanelOne();
add(hello,BorderLayout.CENTER);
或
setContentPane(hello);
避免使用 swing 组件扩展你的类,除非你想为它们定义新方法(创建自定义组件)或者你不想覆盖它们的某些方法。
您不必为 JFrame
设置 BorderLayout
,因为它是 JFrame
的默认布局(已设置)。
在添加组件后调用 JFrame
的 setVisible
方法。
此外,请阅读 Concurrency in Swing
关于java - 如何正确地将 JPanel 放置到 JFrame 上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19250540/