2013-06-14 3 views
0

Что не так с моим кодом? Мои кнопки и ярлыки не отображаются.JButtons и JLabels не отображаются

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class HelloPanelLabel extends JFrame { 

    public static void main(String[] args) { 
     new HelloPanelLabel(); // creates an instance of frame class 
    } 

    public HelloPanelLabel() { 

     this.setSize(200, 100); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setTitle("Hello World!"); 
     this.setVisible(true); 

     Toolkit tk=Toolkit.getDefaultToolkit(); 
     Dimension d= tk.getScreenSize(); 
     int x=(d.height/2); 
     int y=(d.width/2); 
     this.setLocation(x, y); 
     //JPanel panel1 = new JPanel(); 
     JLabel label1 = new JLabel("hello, world"); 
     //panel1.add(label1); 
     JButton button1 = new JButton("Click me!"); 
     //panel1.add(button1); 
     this.setVisible(true); 

    } 

} 
+1

Удалите первый 'this.setVisible (истина)' называют – Robin

+1

Почему вы не раскомментировать ваши последние 3 строки, 'добавить()' панель и вызвать 'пакет()', чтобы посмотреть, что происходит. Также возьмите совет @Robin. –

+0

@Robin, пожалуйста, была причина удалить этот ответ, правильно .... – mKorbel

ответ

1

Вам необходимо установить layout и добавить компоненты в раму.

setLayout(new FlowLayout()); 
//JPanel panel1 = new JPanel(); 
JLabel label1 = new JLabel("hello, world"); 
add(label1); 
//panel1.add(label1); 
JButton button1 = new JButton("Click me!"); 
add(button1); 
//panel1.add(button1); 
this.setVisible(true); 

Как комментариях говорилось, вы должны вызвать pack(). Однако, если вы хотите определить более сложные макеты, вам придется создавать более сложные.

+0

Нет необходимости устанавливать макет. Поскольку 'FlowLayout'is по умолчанию. Просто добавьте 'JComponents' и вызовите' pack() '. –

+0

@yannishristofakis Спасибо – user2336315

+0

@ user2336315 Я хочу исправить свое утверждение, я ошибся, вам нужно добавить макет !!! Вместо этого на 'JPanel' кажется, что нет необходимости. –

1

Причина не показ JButton и JLabel является то, что вы не добавили JPanel, содержащие эти два компонента к JFrame .Вы просто нужно немного изменений в коде. Вот что:

panel1.add(label1); 
JButton button1 = new JButton("Click me!"); 
panel1.add(button1); 
getContentPane().add(panel1);//Add to ContentPane of JFrame 
this.setVisible(true); 

И удалить предыдущую this.setVisible(true) строку в програме.

0

Если вы хотите использовать JPanel для компонентов

public class HelloPanelLabel extends JFrame { 

    public static void main(String[] args) { 
     new HelloPanelLabel().setVisible(true); 
    } 

    public HelloPanelLabel() { 
     //The same as setTitle. 
     super("Hello World!"); 

     JPanel panel1 = new JPanel(); 
     JLabel label1 = new JLabel("hello, world"); 
     panel1.add(label1); 
     JButton button1 = new JButton("Click me!"); 
     panel1.add(button1); 
     add(panel1); 
     //Size the frame to fit the components 
     pack(); 

     //Center the frame. 
     setLocationRelativeTo(null); 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
} 

в качестве альтернативы вы можете добавить их непосредственно к contentPane в JFrame.

setLayout(new FlowLayout()); 

    JLabel label1 = new JLabel("hello, world"); 
    add(label1); 
    JButton button1 = new JButton("Click me!"); 
    add(button1); 

    Toolkit theKit = getToolkit(); 
    Dimension wndSize = theKit.getScreenSize(); 

    setSize(wndSize.width/8, wndSize.height/12); 

    setLocationRelativeTo(null); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
+0

Спасибо всем за вашу помощь. Это отлично работает. Что делает add (panel1)? – user1156718

+0

@ user1156718 Когда вы добавляете компонент в контейнер, вы используете метод 'add()', аналогично, когда вы добавляете контейнер. С той разницей вы добавляете его в контейнер верхнего уровня. См. Этот http://docs.oracle.com/javase/tutorial/uiswing/components/toplevel.html. ** Пожалуйста, не забудьте выбрать ответ, если найдете решение ** –

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