[英]My JPanel won't show. Eclipse says I have no errors. Java
我正在嘗試在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");
但是你設置對類框架可見
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程序應在事件調度線程上運行/啟動。 請參閱初始線程 。 基本上,您可以將實例化包裝在SwingUtilities.invokeLater
public static void main (String[] args) { SwingUtilities.invokeLater(new Runnable(){ public void run() { new MySystemGUI(); } }); }
UPDATE
您還將要對持有標簽和字段的面板使用不同的布局管理器。 使用FlowLayout(JPanel的默認設置)時,eveerytyhing連續添加。 花一些時間在使用容器布置組件上學習布局管理器
這是使用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){}
}
您有一個隱藏框架的本地框架,它實際上是一個JFrame
:
public class MySystemGUI extends JFrame implements ActionListener { // class signature
...
public MySystemGUI() {
...
myFrame = new JFrame (); // local variable
...
myFrame.add(myPanel,"South");
...
}
...
}
您的面板將添加到此本地框架而不是您的班級,因此它將不可見。 您可以使用this.add(...)
擺脫此局部變量並添加面板,或者避免擴展JFrame
並改用局部變量。 最好使用最后一種方法:
今天我全班都花了一個小時。 包括老師。 不走運
只是找另一位老師。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.