2015-01-11 4 views
0

Я не понимаю, почему мой JPanel не появится, так как я использовал pack() и setVisible (true) Он просто запускает приложение и ничего не происходит. Это мой кодМоя JPanel не появится (Java)

import java.io.*; 
import java.net.*; 
import java.util.Scanner; 
import java.util.concurrent.TimeUnit; 

import javax.swing.*; 

import java.awt.event.*; 
import java.awt.*; 

import javax.swing.JFrame; 

public class TestGUI extends JFrame { 

    private JPanel _panel1 = new JPanel(); 
    private JTextArea _txtarea = new JTextArea(10, 10); 
    private JTextField _txtfield = new JTextField(); 

    public TestGUI() { 
     add(_panel1); 
     _panel1.setLayout(new BorderLayout()); 
     _panel1.add(_txtarea); 
     _panel1.add(_txtfield); 
     validate(); 
     _panel1.setVisible(true); 
     _panel1.setSize(500, 500); 
    } 

    public static void main(String[] args) { 
     new TestGUI(); 
    } 
} 
+1

setVisible() и setSize() относятся к кадру, а не к панели. Назовите их «этим». или ничего. Кроме того, поскольку вы устанавливаете макет панели на BorderLayout, добавление двух вещей к нему просто перезаписывает первое, второе. Если вы хотите, чтобы они были в разных местах, вам нужно указать NORTH, EAST или что-то еще - посмотрите, как использовать BorderLayout для деталей. – arcy

+0

Вы должны обработать событие 'windowClosing'. Вы не сможете закрыть окно, если вы этого не сделаете. Поэтому, если вы не идете в незадекларированное окно и не выполняете пользовательскую кнопку закрытия, важно, чтобы событие 'windowClosing' было важно. –

+0

Коррекция: окно закроется, но программа youre будет работать после закрытия окна. –

ответ

0

Я предлагаю показывая JFrame как хорошо, так как он содержит свой JPanel.

Попробуйте это в качестве main()

public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
     new TestGUI().setVisible(true); 
    } 
    }); 
} 
0

У вас есть несколько вопросов, в вашем коде. Вы не устанавливаете макет правильно. BorderLayout требует позиционирования.

После добавления компонентов к JFrame, вы либо установить размер для него или позвонить пакету() метода, так что вы JFrame принимает размер, необходимый, чтобы соответствовать подкомпонентам.

Вот пример:

class TestGUI extends JFrame { 

     private JPanel _panel1 = new JPanel(); 
     private JTextArea _txtarea = new JTextArea(10, 10); 
     private JTextField _txtfield = new JTextField(); 

     public TestGUI() { 
      add(_panel1); 
      _panel1.setLayout(new BorderLayout()); 

      // border layout is done by positioning like center, south north etc. 
      _panel1.add(_txtarea, BorderLayout.CENTER); 
      _panel1.add(_txtfield, BorderLayout.NORTH); 

      // set the size before making it visible 
      _panel1.setSize(500, 500); 
      setVisible(true); 

      // call pack() so that the Frame assumes the needed space only 
      pack(); 

      // set a default close method so that your frame exits on close. 
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     } 
    } 

Следующая это хорошая практика, чтобы породить ваш JFrame через SwingUtilities.invokeLater или EventQueue.invokeLater, так что он обрабатывается событий Отправка Thread в свое собственное время при обработке очереди событий.

Смежные вопросы