Почему мои вещи не отображаются в JFrame?

Я довольно новичок в JFrame, и я хочу знать, почему мои объекты не отображаются в окне. Я знаю, что у меня нет ActionHandler, но я просто хочу, чтобы мое текстовое поле появилось в моем окне. Вот мой код:

import java.awt.Font; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPasswordField; import javax.swing.JTextField; public class FirstGUI extends JFrame{ public void GUI(){ setTitle("Welcome"); setResizable(false); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); setSize(600,600); JLabel title = new JLabel(); title.setText("Apple Inc. Member Login Port"); title.setFont(new Font("Arial", Font.PLAIN, 24)); JTextField login = new JTextField("Login",10); JPasswordField pass = new JPasswordField("Password"); add(title); add(login); add(pass); } public static void main(String[] args){ FirstGUI a = new FirstGUI(); a.GUI(); } } 

но когда я запускаю его, я получаю следующее:

введите описание изображения здесь

но когда я запускаю его, я получаю следующее:

Вы получаете пустой экран, потому что вы добавляете компоненты в кадр после просмотра frameworks.

  1. Как уже было предложено, вам необходимо использовать соответствующий менеджер макетов. FlowLayout проще всего начать.
  2. invoke setVisible(true) ПОСЛЕ добавления компонентов в фрейм.

Таким образом, код должен быть больше похож:

 panel.add(...); panel.add(...); add(panel); pack(); setVisible(true); 

Диспетчер компоновки по умолчанию для JFrameBorderLayout .

Это означает, что ваши компоненты по существу все добавлены друг к другу.

Попробуйте изменить диспетчер компоновки на что-то вроде FlowLayout (например) …

введите описание изображения здесь

Более подробную информацию см. В разделе «Визуальное руководство для менеджеров макетов» и « Управление макетами».

Также избегайте setSize где это возможно, вместо этого используйте Window#pack

Обновить

Я также хотел бы представить вам начальные streamи, которые должны использоваться для запуска вашего кода пользовательского интерфейса …

Я согласен с предложениями MadProgrammer (+1)

Ну, давайте взглянем на вашу программу, хотя

Фактически вы создали JFrame с компонентами в нем. Его работа также прекрасна, но ваш вопрос «почему мои предметы не появляются в JFrame» не потому, что вы сделали что-то не так, а потому что пропустили что-то, то есть revalidate ()

Пытаться:

 public static void main(String[] args){ FirstGUI a = new FirstGUI(); a.GUI(); a.revalidate(); } 

Я не говорю, что это даст вам идеальный интерфейс. То, что я пытаюсь сказать, это поможет вам лучше понять Swing. Узнайте о менеджерах Swing Layout, а затем поработайте над своим пользовательским интерфейсом, чтобы получить лучшие результаты

revalidate (): Этот компонент и все родители над ним отмечены как необходимо выложить. Это означает, что Менеджер макета попытается перестроить компоненты. Часто используется после удаления компонентов. Возможно, что некоторые действительно острые люди могут пропустить это. Я бы подумал, что вы это узнаете, только если вы используете Swing.

Единственная причина:

 setVisible(True); method for the frame should be put on the end of the code. 

если вы укажете эту строку в верхней части кода, который создается при создании фрейма. Это вызовет эту проблему.

Не добавляйте компоненты непосредственно в фрейм. Вместо этого добавьте в панель содержимого , где JFrame хранит все компоненты, которые он рисует. Обычно это JPanel.

Вот пример:

 public class GUI { private JPanel content; public void GUI { /*Other code*/ content = new JPanel(); add(content); //make content the content pane content.add(title); content.add(login); content.add(pass); } 

Если это не удается, вызовите setVisible(true) и setEnabled(true) для всех ваших компонентов.

На боковой ноте вы можете сделать свой GUI функцию конструктором.

 import javax.swing.*; import java.awt.*; class Myframec extends JFrame { Myframec() { Container c = this.getContentPane(); c.setLayout(null); this.setBounds(10,10,700,500); this.setTitle("Welcome"); this.setDefaultCloseOperation(this.EXIT_ON_CLOSE); JPanel panel = new JPanel(); panel.setBounds(0,0,700,500); panel.setBackground(Color.gray); panel.setLayout(null); c.add(panel); Font f = new Font("Arial",Font.BOLD,25); Font f1 = new Font("Arial",Font.BOLD,20); JLabel lable = new JLabel(); lable.setBounds(130,10,400,100); lable.setText("Apple Inc. Member Login Port"); lable.setFont(f); panel.add(lable); JTextField login = new JTextField("Login",10); login.setBounds(120,150,400,30); login.setFont(f1); panel.add(login); JPasswordField pass =new JPasswordField("Password"); pass.setBounds(120,200,400,30); pass.setFont(f1); lable.setFont(f); panel.add(pass); c.setVisible(true); this.setVisible(true); } public static void main(String[] argm) { Myframec frame = new Myframec(); frame.setVisible(true); } } 
  • process.WaitForExit () асинхронно
  • Выбор нескольких строк в JTable
  • как изменить пользовательский интерфейс в зависимости от выбора поля со списком
  • Qt сигнализирует по streamам, один - stream GUI?
  • Есть ли представление для ввода целых чисел в Android?
  • Как установить размер изображения с помощью RescaleOp
  • JavaFx tableview sort действительно медленный, как улучшить скорость сортировки, как в java swing
  • создание зачеркнутого текста?
  • Blackberry - Загрузка / Ожидание экрана с анимацией
  • Панель действий Android, например, твиттер
  • Неверная операция поперечного streamа
  • Давайте будем гением компьютера.