首页 文章

Jbutton和Jpanel和JFrame之间的区别?

提问于
浏览
0

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

第二个文件是“intro.java”,它是从JPanel扩展而来的,我用它来展示游戏的内容,包括( Headers &背景和人物),

当我试图在介绍中添加一个简单的按钮时,我的问题出现了! ,我做了一个创建按钮的功能,但问题是当我运行游戏时,我添加它的按钮不会出现! ,但是当我尝试从第一个从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 回答

  • 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
    }
    
  • 3

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

  • 3

    建议:

    • 无论何时向容器添加新组件,都必须告诉布局管理器布置新组件和现有组件 . 这是通过在接收按钮的JPanel上调用 revalidate() 来完成的 . 在此之后你也应该在JPanel上调用 repaint() .

    • 您不应该在后台线程中执行任何操作 .

    • 最重要的是阅读Swing教程,因为他们会告诉你所有这些以及更多内容 .

相关问题