2015-07-10 2 views
1

Я решил добавить JPanel к уже существующему JPanel, чтобы у меня было небольшое окно с JTextField сверху с именем и прокручиваемой JTextArea под ним с некоторым описанием. Я сделал класс, который расширяет JPanel со следующим конструктором:Добавление панели в панель

import javax.swing.*; 
import javax.swing.border.EtchedBorder; 
import javax.swing.border.TitledBorder; 
import java.awt.*; 

public class LocationWindow extends JPanel { 
    public JTextField name; 
    public JTextArea desc; 
    public JScrollPane scroll; 

    public LocationWindow(){ 
     super(); 
     setBorder (new TitledBorder(new EtchedBorder(), "Display Area")); 
     setLayout(new BorderLayout()); 
     setVisible(true); 
     setBounds(30, 40, 700, 290); 
     name = new JTextField(10); 
     name.setText("name"); 
     desc = new JTextArea(5,10); 
     scroll = new JScrollPane(desc); 
     scroll.setVerticalScrollBarPolicy (ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); 
     desc.setEditable (true); 
     desc.setLineWrap(true); 
     desc.setText("random text"); 
     add(name); 
     add(desc); 
     add(scroll); 
     validate(); 
    } 
} 

Это почти работает, так как она дает мне окно с границами и свитка, но как JTextField и JTextArea отсутствуют.

+0

Для лучшей помощи раньше, опубликовать [MCVE] (http://stackoverflow.com/help/mcve) (минимальная полная Проверяемость Пример) или [SSCCE] (HTTP: // WWW .sscce.org /) (Short, Self Contained, Correct Example). 'setBounds (30, 40, 700, 290);' Не делайте этого. Используйте макет и границы для пробела в графическом интерфейсе. –

ответ

1

Как вы используете BorderLayout для JPanel,

setLayout(new BorderLayout()); 

компоненты всегда будут добавлены к центру, если вы не указать позицию. add(scroll); такой же, как add(scroll,BorderLayout.CENTER);, как вы добавляете все через добавить последний добавлен компонент только visible.Refer this as well

Следующее это вы добавляете JTextArea отдельно, так он будет удален из ScrollPane.Just добавить ScrollPane на панель нет необходимости добавить все компоненты. [Добавить в одиночку родительский компонент]

add(name,BorderLayout.NORTH); 
    //add(desc);Noo need to add desc as it is already added in JScrollPane 
    add(scroll,BorderLayout.CENTER); 

Там нет необходимости для SetVisible для JPanel.JPanel должен быть встроен в контейнер, как JFrame быть видимым

  //setVisible(true);Wont do anything 

Так называют как этот

JFrame frame = new JFrame(); 
    frame.add(new LocationWindow()); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.pack(); 
    frame.setLocationRelativeTo(null); 
    frame.setVisible(true); 
+0

Да, спасибо! Это очень полезно, я не знал этих деталей, так как у моей другой панели нет макета. – seMikel

+0

Если вы не настроили макет вашей другой панели на нуль, это * имеет * макет - макет по умолчанию для JPanel, который является FlowLayout. – FredK

0

Вы можете использовать нижеприведенный код для добавления панели в панель.

public static void main(String[] args) { 
    JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    LocationWindow loc = new LocationWindow(); 
    frame.add(loc); 
    frame.setSize(300, 200); 
    frame.setVisible(true); 
} 
+0

Проблема в том, что я не могу получить доступ к моему кадру после того, как он уже был создан, когда мне нужно добавить эту панель. Итак, все, что происходит, происходит в другой панели, к которой я хочу добавить эту. – seMikel

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