2015-11-09 3 views
3

Может кто-нибудь объяснить, почему ничего не отображается внутри окна приложения, когда я запускаю это?Базовый калькулятор JFrame

Кажется странным, у меня было это отображение JButton, и я доложил еще пару, а затем, похоже, повлияло на все.

Вот мой код:

public class Window extends JFrame { 

    JButton zero, one, two, three, four, five, six, seven, eight, nine; 
    JButton add, sub, mul, div, mod; 
    JPanel mainPanel; 
    JLabel results; 

    public Window(){ 
     this.setSize(400, 400); 
     this.setResizable(false); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setTitle("Calculator"); 
     this.setVisible(true); 

     mainPanel = new JPanel(); 

     results = new JLabel("RESULTS"); 
     results.setToolTipText("Calculated Results"); 

     zero = new JButton("0"); 
     one = new JButton("1"); 
     two = new JButton("2"); 
     three = new JButton("3"); 
     four = new JButton("4"); 
     five = new JButton("5"); 
     six = new JButton("6"); 
     seven = new JButton("7"); 
     eight = new JButton("8"); 
     nine = new JButton("9"); 

     add = new JButton("+"); 
     sub = new JButton("-"); 
     mul = new JButton("*"); 
     div = new JButton("/"); 
     mod = new JButton("%"); 

     this.add(mainPanel); 

     mainPanel.add(zero); 
     mainPanel.add(one); 
     mainPanel.add(two); 
     mainPanel.add(three); 
     mainPanel.add(four); 
     mainPanel.add(five); 
     mainPanel.add(six); 
     mainPanel.add(seven); 
     mainPanel.add(eight); 
     mainPanel.add(nine); 

     mainPanel.add(add); 
     mainPanel.add(sub); 
     mainPanel.add(mul); 
     mainPanel.add(div); 
     mainPanel.add(mod); 

     mainPanel.add(results); 

    } 

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

Я бы попытался добавить макет к вашей mainPanel и переместить 'setVisible (true);' в конец конструктора. –

+0

Создание графического интерфейса на основной теме не рекомендуется. Используйте SwingUtilities.invokeLater(); с экземпляром Runnable. – Doc

+0

@ shivam7357 Это [не совсем верно] (http://stackoverflow.com/questions/7156949/main-thread-vs-ui-thread-in-java). – Tomas

ответ

0

Редактировать код таким образом:

 .... 
     mainPanel.add(results); 
     this.setVisible(true);//Move this line to this place(at the end) 
    } 
    public static void main(String[] args) { 
     new Window(); 
    } 
} 
+0

@Jad Chahine Вот почему я сказал: «Переместите setVisible()»; – Doc

2

Когда вы звоните setVisible(true), ваш JFrame визуализируется и отображается.

Если добавить материал к нему после, что эти вещи не будут видны, пока вы не вызовете validate(), pack() или setVisible(true) снова.

  • validate() повторно подтверждает ваш компонент. Он «недействителен» всякий раз, когда вы добавляете в него материал, например, в вашем коде. Он должен быть повторно подтвержден, чтобы эти изменения появлялись.
  • pack() размеры вашего компонента (JFrame), используя любые менеджеры макетов, чтобы рассчитать размеры его. Он также повторно проверяет его.
  • setVisible(true) делает то, что это звучит, но поскольку уже было видно, интересный бит для вас состоит в том, что он также повторно проверяет компонент.

Итак, что вы должны сделать после добавления компонентов:

  1. вызова setVisible() или
  2. вызова validate()

Второго только в случае, если вы на самом деле хотите, чтобы динамически добавлять что я сомневаюсь в этом случае :)

Ваш код будет выглядеть следующим образом:

mainPanel.add(results); 

pack(); 
setVisible(true); 

И чем раньше вызов setVisible() (строка 18), могут быть удалены.

Возможно, вы также захотите добавить add a layout к вашему окну, и полезно использовать Java™ Tutorial page on JFrames.