Jbutton和Jpanel和JFrame之间的区别?

时间:2011-12-02 17:44:02

标签: java swing awt jframe jpanel

我制作简单的游戏,它由2个文件组成,第一个文件是“Alibaba.java”,它是从JFrame扩展的,我用它来显示游戏的一般内容!,

并且第二个文件是从JPanel扩展的“intro.java”,我用它来显示游戏的介绍,其中包括(标题&背景和人物),

当我尝试在简介中添加一个简单的按钮时,我的问题出现了! ,我做了一个创建按钮的功能,但问题是当我运行游戏时,我添加它的按钮不会出现! ,但是当我尝试从第一个从JFrame扩展的文件中添加它时,它就出现了! , 那我的代码有什么问题?是JPanel不接受JButtons!或者我必须从JFrame文件创建按钮?

所以我需要知道如何在Jpanel中添加Jbutton而不是在JFrame Direct中添加Jbutton !!

这是我的代码示例,其中包含问题:

第一个文件(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();
    }
}

第二个文件(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 个答案:

答案 0 :(得分:3)

你必须在主线程中添加JButton,交叉线程Component操作不好。

例如:

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

或者,使用SwingUtilities.invokeLater(Runnable)。例如,在您的run方法中:

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

根据讨论,您似乎重写了paintpaintComponent方法。您需要在其中调用super,例如:

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

答案 1 :(得分:3)

此外,您有一个实现Runnable的JPanel是一个不好的迹象。在Java中,所有UI工作(这里使用Swing组件)都是从事件调度线程完成的 - 拥有一个实际的Swing组件(你的Intro类是一个JPanel)Runnable面对它。

答案 2 :(得分:3)

建议:

  • 无论何时向容器添加新组件,都必须告诉布局管理器布置新组件和现有组件。这是通过在接收按钮的JPanel上调用revalidate()来完成的。在此之后,您还应该在JPanel上调用repaint()
  • 你不应该在后台线程中做任何这些。
  • 最重要的是阅读Swing教程,因为他们会告诉你所有这些以及更多内容。