Различия между Jbutton и Jpanel и JFrame? - PullRequest
0 голосов
/ 02 декабря 2011

я делаю простую игру, и она состоит из 2 файлов, первый файл - «Alibaba.java», который расширен из JFrame, я использовал его для отображения общего содержания игры!,

и второйфайл "intro.java", который расширен из JPanel, я использовал его, чтобы показать вступление в игру, которое включает (название, фон и персона),

моя проблема возникла, когда я попытался добавить простую кнопку ввступление!, я сделал функцию для создания кнопки, но проблема в том, что когда я запускаю игру, кнопка, которую я добавил, не появляется !!, но когда я попытался добавить его из первого файла, который расширился из JFrame, он появился!Так в чем же проблема в моем коде?JPanel не принимает JButtons!или я должен создать кнопки из файла JFrame ?!

поэтому мне нужно знать, как добавить Jbutton внутри Jpanel вместо добавления Jbutton в JFrame Direct !!,

это мои примеры моих кодов, которые содержат проблему:

1-й файл (Alibaba.java)

package alibaba;

import java.awt.Color;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Toolkit;
import javax.swing.JFrame;


public class Alibaba extends JFrame {

    public Alibaba(){
        super("Alibaba");    


        Intro intro =   new Intro();
        this.add(intro);


        GraphicsEnvironment environment =   GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice  device  =   environment.getDefaultScreenDevice();

        device.setFullScreenWindow(this);    
    }

    public static void main(String[] args) { 

        Alibaba alibaba =   new Alibaba();
    }
}

2-й файл (Intro.java):

package alibaba;


import javax.swing.JButton;




public class Intro extends javax.swing.JPanel implements Runnable{

    Thread _intro_run;

    public Intro() {
        _intro_run  =   new Thread(this);
        _intro_run.start();
    }


    @Override
    public void run() {

    // Here i tried to add a button to the Intro !!! 

        this.add(this.createbutton("Exit"));
    }


    public JButton createbutton(String text){

        JButton _button  = new JButton(text);

        return _button;
    }

}

Поэтому, пожалуйста, скажите, в чем проблема и как ее решить, извините, ноЯ новичок в Java, новичок в мире игр программирования!,, спасибо :)

Ответы [ 3 ]

3 голосов
/ 02 декабря 2011

Кроме того, это плохой признак того, что у вас есть JPanel, который реализует Runnable.В Java вся работа с пользовательским интерфейсом (в данном случае вы используете компоненты Swing) выполняется из потока диспетчеризации событий - с фактическим компонентом Swing (ваш класс Intro - JPanel) Runnable бросает вызов этому.

3 голосов
/ 02 декабря 2011

Предложения:

  • Каждый раз, когда вы добавляете новый компонент в контейнер, вы должны указать менеджерам компоновки компоновку новых и существующих компонентов.Это делается путем вызова revalidate() на JPanel, получающей кнопку.После этого вам также следует позвонить repaint() на JPanel.
  • Вы не должны делать ничего этого в фоновом потоке.
  • Самое главное прочитать руководства по Swing, так как они вам все расскажутэто и многое другое.
3 голосов
/ 02 декабря 2011

Вы должны добавить JButton внутри основного потока, кросс-поток Component манипуляция плохая.

Например:

public Intro() {
    JButton exitButton = new JButton("Exit");
    this.add(exitButton);
} 

В качестве альтернативы используйте SwingUtilities.invokeLater(Runnable). Например, в вашем методе запуска:

@Override
public void run() {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            add(createbutton("Exit"));
        }
    }
} 

Судя по обсуждению, вы переопределяете методы paint или paintComponent. Вам нужно позвонить super в них, например:

void paint(Graphics g) {
    super.paint(g);
    // do other stuff to g
}
...