2016-11-11 3 views
1

Это моя домашняя работа.JPanel отображается неправильно при расширении JFrame

Мои направления: Класс GuessGame: Этот класс содержит основную функцию, которая создает объект JFrame, устанавливает размер, видимость и выход JFrame.

Класс GuessGameFrame: класс GuessGameFrame расширяет JFrame. Таким образом, класс GuessGameFrame имеет все переменные и методы, определенные в классе JFrame.

Я не 100% уверен, что моя проблема, но я считаю, что JPanel не работает правильно

Любая помощь будет в значительной степени иметь в виду, если я ушел из ничего важного, пожалуйста, дайте мне знать, и я могу добавить больше деталей ,

главный класс:

public class GuessGame { 

      public static void main(String[] args){ 
        GuessGameFrame localGuessGameFrame = new GuessGameFrame(); 
        localGuessGameFrame.setVisible(true); //set visible 
        localGuessGameFrame.setSize(380,175); // set size 380 width 175 height 
        localGuessGameFrame.setDefaultCloseOperation(localGuessGameFrame.EXIT_ON_CLOSE); // needed to enable the red X button to close the program 
      } 
} 

расширенный класс:

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

public class GuessGameFrame extends JFrame 
    { 

    private int lastDistance; // distance between last guess and number 
    private Color background; // background color of application 

    private JFrame f; 
    static JPanel p; 
    private JButton b1; 
    private JLabel l1; 
    private JLabel l2; 
    JTextField t1 = new JTextField(8); 
    private JLabel l3; 

    //declare constructor 
    public GuessGameFrame() 
    { 
    //create our JFrame 
    f = new JFrame("Guessing game"); 

    //create our panel 
     p = new JPanel(); 
     p.setBackground(Color.MAGENTA); // background color is magenta 

     //create our labels 
     l1 = new JLabel("I have a number between 1 and 1000."); 
     l2 = new JLabel("Can you guess my number? Enter your first Guess:."); 
     l3 = new JLabel("Guess result appears here."); 
     //create our button 
     b1 = new JButton("New Game"); 

     //add button and label to panel 
     p.add(l1); // Adds label 1 
     p.add(l2); // adds label 2 
     p.add(t1); // adds textfield 1 
     p.add(l3); // adds label 3 
     p.add(b1); // adds button 1 

     //add panel to JFrame 
     f.add(p); 
    } 
} 

Скриншот окна вывода при выполнении: enter image description here

Я ожидаю, что это выглядит следующим образом:

enter image description here

ответ

4

Вы должны удалить JFrame f в GuessGameFrame классе, потому что GuessGameFrame уже JFrame:

и обновить свой код:

f = new JFrame("Guessing game");this.setTitle("Guessing game"); к

f.add(p); к this.getContentPane().add(p);

+0

Это работало !!! Не могли бы вы объяснить, почему это сработало, возможно, сосредоточившись на «этом» бит. – GeekyDewd

+1

Потому что в вашем коде GuessGameFrame является самим JFrame и содержит другой JFrame f. Вы запускаете пользовательский интерфейс для JFrame f (не GuessGameFrame), а в основном классе вы вызываете localGuessGameFrame.setVisible (true), поэтому он не будет работать – Jerry06

+1

@ Jerry06: оба 'this' и' getContentPane() 'являются избыточными, но они делают это ясно, что вы вызываете методы экземпляра 'GuessGameFrame'. – trashgod