我正在尝试在 JFrame 中显示 JPanel。 Jrame 可以工作,但我无法显示 JPanel。
今天我全类为此花了一个小时。包括老师。不是运气。 Eclipse 说没有错误有人可以提醒我我的错误吗?
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
// make a JFrame and bits
public class MySystemGUI extends JFrame implements ActionListener
{
private static final long serialVersionUID = 1L;
private JFrame myFrame;
private JTextField LLName, LLAddress, LLPhone, LLbankDeets;
private JButton sub1;
private JLabel LLNameT, LLAddressT, LLPhoneT, LLbankDeetsT;
private JPanel LLJP()
{
JPanel JP1 = new JPanel();
LLNameT = new JLabel ("Enter Landlord name");
LLName = new JTextField(30);
LLAddressT = new JLabel ("Enter Landlord Address ");
LLAddress = new JTextField(40);
LLPhoneT = new JLabel ("Enter Landlod Phone No.");
LLPhone = new JTextField(10);
LLbankDeetsT = new JLabel ("Enter Landlod Bank details");
LLbankDeets = new JTextField(10);
sub1 = new JButton("Submit");
JP1.add(LLNameT);
JP1.add(LLName);
JP1.add(LLAddressT);
JP1.add(LLAddress);
JP1.add(LLPhoneT);
JP1.add(LLPhone);
JP1.add(LLbankDeetsT );
JP1.add(LLbankDeets);
JP1.add(sub1);
//myFrame.add(JP1 );
return JP1;
}
// Set up frame
public MySystemGUI()
{
myFrame = new JFrame ();
JPanel myPanel = LLJP();
myFrame.add(myPanel,"South");
this.setLayout(new GridBagLayout());
this.setSize(700, 500);
this.setTitle("My System GUI");
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setBackground(Color.blue);
}
//run this bitch
public static void main (String[] args)
{
new MySystemGUI();
}
@Override
public void actionPerformed(ActionEvent e)
{
}
}
最佳答案
你有一个 JFrame 成员
private JFrame myFrame;
这是您要添加组件的地方。
myFrame.add(myPanel,"South");
但是你setVisible到class frame
public class MySystemGUI extends JFrame
...
this.setVisible(true); // `this` is class frame, not `myFrame`
取出所有的this.setXxx
和做myFrame.setXxx
,取出extends JFrame
public class MySystemGUI implements ActionListener {
...
public MySystemGUI() {
...
myFrame.setLayout(new GridBagLayout());
myFrame.setSize(700, 500);
myFrame.setTitle("My System GUI");
myFrame.setVisible(true);
...
}
}
其他注意事项
myFrame.add(myPanel,"South");
- “South”无关紧要,仅适用于 BorderLayout。您将布局设置为 GridBaglayout。
<this.setBackground(Color.blue);
您不想在框架可见后 设置背景吗?Swing 程序应该在事件调度线程上运行/启动。参见 Initial Threads .基本上,您可以将实例化包装在
中SwingUtilities.invokeLater
public static void main (String[] args) { SwingUtilities.invokeLater(new Runnable(){ public void run() { new MySystemGUI(); } }); }
更新
您还需要为包含标签和字段的面板使用不同的布局管理器。使用 FlowLayout(JPanel 的默认设置),每行都连续添加。花点时间在 Laying out Components Withing a Container 学习布局管理器
这是一个使用 GridLayout
的简单修复
import java.awt.Color;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class MySystemGUI implements ActionListener {
private static final long serialVersionUID = 1L;
private JFrame myFrame;
private JTextField LLName, LLAddress, LLPhone, LLbankDeets;
private JButton sub1;
private JLabel LLNameT, LLAddressT, LLPhoneT, LLbankDeetsT;
private JPanel LLJP() {
JPanel JP1 = new JPanel(new GridLayout(0, 2));
LLNameT = new JLabel("Enter Landlord name");
LLName = new JTextField(30);
LLAddressT = new JLabel("Enter Landlord Address ");
LLAddress = new JTextField(40);
LLPhoneT = new JLabel("Enter Landlod Phone No.");
LLPhone = new JTextField(10);
LLbankDeetsT = new JLabel("Enter Landlod Bank details");
LLbankDeets = new JTextField(10);
sub1 = new JButton("Submit");
JP1.add(LLNameT);
JP1.add(LLName);
JP1.add(LLAddressT);
JP1.add(LLAddress);
JP1.add(LLPhoneT);
JP1.add(LLPhone);
JP1.add(LLbankDeetsT);
JP1.add(LLbankDeets);
JP1.add(sub1);
return JP1;
}
public MySystemGUI() {
myFrame = new JFrame();
JPanel myPanel = LLJP();
myFrame.add(myPanel);
myFrame.setTitle("My System GUI");
myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
myFrame.setBackground(Color.blue);
myFrame.pack();
myFrame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new MySystemGUI();
}
});
}
@Override
public void actionPerformed(ActionEvent e){}
}
关于java - 我的 JPanel 不会显示。 Eclipse 说我没有错误。 java ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26485706/