2015-04-02 3 views
0

Я пытаюсь добавить JComponent в JPanel, а затем отображать его в окне. Я уверен, что у меня все получилось, но только кнопка на панели появляется.Java Swing, имеющий JComponent и JPanel

//Component class 
JFrame window=new JFrame("This is a window"); 
RcComponent component=new RcComponent(); 
JButton button= new Button("This is a button"); 
JPanel panel=new JPanel(); 

panel.add(component); 
panel.add(button); 
window.add(panel); 

window.setVisible(true); 

Только кнопка отображается в созданном окне. Я не совсем уверен, что я делаю неправильно.

+0

Не забудьте «принять» ответ, чтобы люди знают, что проблема была решена. Вы также не приняли ответ ни на один из своих предыдущих вопросов. – camickr

ответ

2

По умолчанию JPanel использует FlowLayout, а FlowLayout учитывает предпочтительный размер всех добавленных к нему компонентов.

Если RcComponent является настраиваемым компонентом, вам необходимо переопределить метод getPreferredSize(), чтобы вернуть размер компонента.

@Override 
public Dimension getPreferredSize() 
{ 
    return new Dimension(...); 
} 

Если вы не переопределить этот метод, то предпочтительный размер 0, так что нет ничего, чтобы показать:

+0

Могу ли я изменить макет вместо переопределения метода? – Evando

+0

'вместо переопределения метода?' - переопределение метода является правильным решением. Все компоненты Swing должны возвращать разумный размер. Конечно, вы все равно можете использовать другой макет, поскольку каждый менеджер компоновки работает по-разному. Например, GridLayout игнорирует предпочтительный размер каждого компонента и делает оба компонента одинакового размера. Но это все же не причина игнорировать метод getPreferredSize(). Вы должны разработать свой компонент, который будет использоваться с любым менеджером макетов, поскольку это требование может измениться с приложения на приложение. – camickr

0

Я считаю, что вы пропустили менеджер компоновки.

https://www.google.com/#q=java%20layout

public static void main(String[] args) { 
    JFrame window=new JFrame("This is a window"); 
    JButton button= new JButton("This is a button"); 
    JLabel lbl= new JLabel("This is a label"); 
    JPanel panel=new JPanel(); 

    panel.setLayout(new GridLayout()); 
    panel.add(button); 
    panel.add(lbl); 
    window.add(panel); 
    window.setSize(new Dimension(200, 200)); 
    window.setLocationRelativeTo(null); 

    window.addWindowListener(new java.awt.event.WindowAdapter() { 

     public void windowClosing(java.awt.event.WindowEvent e) { 
      System.exit(0); 
     } 
    }); 

    window.setVisible(true); 
} 
+0

В чем разница между установкой операции закрытия по умолчанию и этим? – ChiefTwoPencils

+0

По умолчанию макет 'JPanel' является' FlowLayout'. – tomse

+1

Здесь вы можете сделать больше. Например, проверка несохраненных документов и т. Д. – Soley

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