2013-05-30 2 views
0

Я пытаюсь создать оболочку калькулятора (неработающий калькулятор) с помощью Java, но по какой-то причине я не могу заставить программу отображать мои кнопки. Что я здесь делаю неправильно?Не удается получить панели для отображения в JFrame

import java.awt.*;  
import javax.swing.*;  
import java.awt.color.*; 

public class Calculator extends JFrame { 

    public Calculator() { 
     JPanel P1 = new JPanel(); 
     P1.setLayout(new GridLayout(4, 4)); 
     //Panel Buttons 
     for (int i = 1; i <= 9; i++) { 
      P1.add(new JButton("" + i)); 
     } 
     P1.add(new JButton("" + 0)); 
     P1.add(new JButton(".")); 
     P1.add(new JButton("*")); 
     P1.add(new JButton("/")); 
     P1.add(new JButton("+")); 
     P1.add(new JButton("-")); 
     P1.add(new JButton("=")); 
     P1.setBackground(Color.cyan); 
     P1.setForeground(new Color(100, 1, 1)); 
     //Content panel 
     JPanel P2 = new JPanel(); 
     P2.setLayout(new BorderLayout()); 
     P2.add(new JTextField("Hello world"), BorderLayout.NORTH); 
     P2.add(P1, BorderLayout.CENTER); 
    } 


    public static void main(String[] args) { 
     Calculator frame = new Calculator(); 
     frame.setTitle("Simple Calculator"); 
     frame.setSize(250, 250); 
     frame.setLocationRelativeTo(null); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 

} 

OK вот что у меня есть сейчас ...

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class Calculator extends JFrame 
{ 
JPanel p1 = new JPanel(); 
JPanel p2 = new JPanel(); 
Calculator() 
{ 
    super("Wk 3 Calculator"); setBounds(100,100,300,100); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    Container con = this.getContentPane(); 
    con.add(p1); 
    con.add(p2); 
    p1.setLayout(new GridLayout(4, 4)); 
    //Panel Buttons 
for (int i =1; i <=9; i++){ 
    p1.add(new JButton ("" + i)); 
} 
    p1.add(new JButton (""+0)); 
    p1.add(new JButton ("."));  
    p1.add(new JButton ("*")); 
    p1.add(new JButton ("/")); 
    p1.add(new JButton ("+")); 
    p1.add(new JButton ("-")); 
    p1.add(new JButton ("=")); 
    //Content panel 
    p2.setLayout(new BorderLayout()); 
    p2.add (new JTextField("Hello world"),BorderLayout.NORTH); 
    p2.add(p1, BorderLayout.CENTER); 
    //Frame specs 
    Calculator frame = new Calculator(); 
    frame.setSize(250,250); 
    frame.setTitle("Simple Calculator"); 
    frame.add(p1, BorderLayout.NORTH); 
    frame.add(p2, BorderLayout.SOUTH); 
    frame.setLocationRelativeTo(null); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.pack(); 
    frame.setVisible(true); 
} 
    public static void main(String[] args){new Calculator();}   
} 

Он до сих пор не работает :(

+3

Постарайтесь придерживаться конвенции Java и начать имена переменных с маленькой буквы! –

+0

@ user2435080 Посмотреть мой отредактированный пост. –

ответ

0

Ну:

1). Вызовите Swing-связанный код на EDT (Event Dispatch Thread), а не на основной поток. См. here для получения более подробной информации.

2). Вы не добавляете панели P1 и P2 в JFrame, поэтому при отображении фрейма он не содержит ничего. Попробуйте позвонить add (P1) и add (P2).

3). Вы должны позвонить по телефону frame.pack(), прежде чем позвонить по телефону frame.setVisible (true).

EDIT:

Я переписал свой код (вы все еще есть Loong путь в принятии функционального приложения, но это только начало):

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class Calculator 
{ 
    private JFrame frame; 

    public Calculator() 
    { 
     frame = new JFrame ("Simple Calculator"); 

     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.setLayout (new BorderLayout()); 

     JPanel panel = new JPanel(new GridLayout(4, 4)); 
     JPanel p2 = new JPanel(new BorderLayout()); 

     for (int i = 1; i <= 9; i++) 
     { 
      panel.add (new JButton ("" + i)); 
     } 

     panel.add(new JButton (""+0)); 
     panel.add(new JButton ("."));  
     panel.add(new JButton ("*")); 
     panel.add(new JButton ("/")); 
     panel.add(new JButton ("+")); 
     panel.add(new JButton ("-")); 
     panel.add(new JButton ("=")); 

     frame.add(panel, BorderLayout.CENTER); 
     frame.add (new JTextField("Hello world"), BorderLayout.SOUTH); 

     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater (new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       new Calculator(); 
      } 
     }); 
    } 
} 
1

добавить P2 внутри JFrame

this.add(P2); 
this.pack(); 
+0

Благодарим вас за поддержку. Вот что у меня есть ... – user2435080

1

Вы не добавляете панели в рамку. Поместите add(p1, BorderLayout.NORTH) и add(p2, BorderLayout.SOUTH) в конец вашего конструктора.

public Calculator() 
{ 
    //rest of the construtor 
    add(p1, BorderLayout.NORTH); 
    add(p2, BorderLayout.SOUTH); 
} 

И переименуйте их, чтобы они начинались с небольшой буквы. Заглавные буквы предназначены для имен классов.

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