Мой JPanel не появится. Затмение говорит, что у меня нет ошибок. Ява
Я пытаюсь отобразить JPanel в JFrame. Jrame работает, но я не могу получить JPanel для отображения.
Сегодня весь мой класс потратил на это целый час. Включая учителя. Не повезло. Затмение говорит, что нет никаких ошибок может кто-то, пожалуйста, предупредить меня о моей ошибке?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)
{
}
}
2 ответа:
У вас есть член 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");
- "Юг" не имеет значения, только для пограничников. Вы устанавливаете макет в GridBaglayout.
this.setBackground(Color.blue);
не хотите ли вы установить фон после рамка видна?Программы Swing должны выполняться / запускаться в потоке отправки событий. СмотритеНачальные Потоки . В принципе, вы можете обернуть экземпляр в
SwingUtilities.invokeLater
public static void main (String[] args) { SwingUtilities.invokeLater(new Runnable(){ public void run() { new MySystemGUI(); } }); }
Обновить
Вы также захотите использовать различные менеджеры компоновки для панели, содержащей метки и поле. С 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
и вместо этого использовать локальные переменные. Этот последний фокусом предпочтительнее:
- Почему бы вам не расширить JFrame и другие компоненты?
- расширяет JFrame против создания его внутри the программа
Сегодня весь мой класс потратил на это целый час. Включая учителя. Нет удача.Просто найдите другого учителя.