Java 如何在JFrame中订购两个组件,以使透明和ActionListener正常工作?

Java 如何在JFrame中订购两个组件,以使透明和ActionListener正常工作?,java,transparency,jframe,jpanel,jbutton,Java,Transparency,Jframe,Jpanel,Jbutton,当向JFrame中添加两个组件时,其中一个组件位于另一个组件中,如果我按顺序添加它们,即Fullscreen对象,然后添加JPanel,则JPanel显示正确,但本质上是不可见的,即它的动作侦听器将不起作用,单击将在Fullscreen对象上注册。如果我以另一种方式添加它们,JPanel将正常工作,但无法正确显示(它有透明区域) 这是我正在添加组件的框架的代码 gameOBJ = new gameClass(width, height); JFra

当向JFrame中添加两个组件时,其中一个组件位于另一个组件中,如果我按顺序添加它们,即Fullscreen对象,然后添加JPanel,则JPanel显示正确,但本质上是不可见的,即它的动作侦听器将不起作用,单击将在Fullscreen对象上注册。如果我以另一种方式添加它们,JPanel将正常工作,但无法正确显示(它有透明区域)

这是我正在添加组件的框架的代码

            gameOBJ = new gameClass(width, height);
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(0);
            frame.add(gameOBJ.UIPanel);
            frame.add(gameOBJ);
            frame.validate();
            frame.setUndecorated(true);
            frame.setBounds(0, 0, width, height);
            frame.setResizable(false);

            frame.addWindowListener(new WindowAdapter()
                {
                    public void windowClosing(WindowEvent we)
                        {
                            new exitWindow("Don't forget to save your game! \n Are you sure you want to Exit?", true);
                        }
                });
            frame.setVisible(true);
            gameOBJ.start();
以下是JPanel的代码(为了简单起见,将其剥离)


我会显示一个图像,但我不允许,本来应该是透明的区域没有显示框架,因为它是灰色的,无论我设置为框架的背景还是面板的背景,同样,无论我设置面板的背景颜色是什么,它都是灰色的。

您可能想使用JLabel而不是JPanel。我知道这听起来有点不直观,但我不确定JPanel是否适合您使用它的目的。此外,JLabel可以设置本机ImageIcon,因此请尝试使用它

public UserInterface() { // extends JLabel
    this.setImageIcon(new ImageIcon("res/images/UIPanelImage.gif"));
    // or super(~imageicon~)
}
不太可能,但可能是图像绘制时尚未加载。您应该使用MediaTracker来更仔细地管理它(尽管我不确定ImageIcon是否会为您解决这个问题)


为什么不在my上热链接到几个图像呢?您可以在drawImage中删除作为ImageObserver的JPanel,尽管我不确定这会有什么不同-例如,您可以将其更新为
g.drawImage(image,0,0,null)除非您打算使用.without'super.paintComponent(g);'问题是完全一样的,我不记得为什么我现在添加它,如果我删除它,它似乎对任何代码都没有任何影响!我想做的是在我的框架中添加两个组件,一个带按钮的普通JPanel和一个渲染游戏的gameObject。因此,即使游戏对象在每一帧中都显示相同的照片,问题也是一样的。如果我在面板之前添加对象,一切看起来都很好,面板的透明度可以工作,但是所有ActionEvents在到达面板之前都会被对象拦截,因此按钮无法工作。如果我在对象之前添加面板,那么ActionEvents将由面板内的JPanel接收,并由JPanel外的对象接收,这是预期的。如果我使用JLabel,我仍然可以添加JButtons并实现ActionListener吗?毕竟,这不仅仅是我想要的图像,加上图像显示了我将组件添加到窗口的顺序,只是透明度不起作用,而是显示了灰色背景,而且GameOBJ和用户界面JPanel每帧都会更新,因为我画了gameOBJ,然后画了UserInterface,所以UserInterface总是在下面。也许你可以发布一个更完整的示例,这样我就可以运行它了?问题是我真的不理解swing或者它的组件是如何使用的,我会接受你的答案,但它并不能真正修复程序,我认为这个问题需要删除。。。
public UserInterface() { // extends JLabel
    this.setImageIcon(new ImageIcon("res/images/UIPanelImage.gif"));
    // or super(~imageicon~)
}
final static protected MediaTracker mediatracker = new MediaTracker(new Canvas());
static protected void checkImageIsReady(Image i) {
    mediatracker.addImage(i, 1);
    try {
        mediatracker.waitForAll();
    } catch (InterruptedException e) { }
    mediatracker.removeImage(i);
}