如何在JFrame中订购两个组件以使透明度和ActionListeners工作?

时间:2011-07-06 22:27:55

标签: java transparency jframe jpanel jbutton

将两个组件添加到JFrame时,其中一个组件位于另一个组件中,如果我按顺序添加它们,全屏对象,然后是JPanel,JPanel正确显示,但基本上是不可见的,即它的动作侦听器将无法工作,点击在全屏对象上注册。如果我以相反的方式添加它们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的代码(为简单起见而删除)

import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JPanel;

public class UserInterface extends JPanel implements ActionListener
    {
        private static final long serialVersionUID = 1L;
    private Image image;

    private int xBound = 800;
    private int yBound = 177;

    private JButton mainMenuButton = new JButton(new ImageIcon("res/images/MainMenuButton.gif"));

    private int buttonWidth = 179;
    private int buttonHeight = 52;

    public UserInterface()
        {
            this.setLayout(null);
            this.image = new ImageIcon("res/images/UIPanelImage.gif").getImage();
            this.setOpaque(false);
            this.setSize(this.xBound, this.yBound);
            mainThreeButtons(); //ONLY ONE SHOWN FOR SIMPLICITY
        }

    public void paintComponent(Graphics g)
        {
            super.paintComponent(g);
            g.drawImage(image, 0, 0, this); //IMAGE CONTAINS TRANSPARENCY
        }

    @Override
    public void actionPerformed(ActionEvent event)
        {
            else if (event.getSource() == mainMenuButton)
                {
                    new mainMenuWindow();
                }
        }

    private void mainThreeButtons()
        {
            this.add(mainMenuButton);
            mainMenuButton.addActionListener(this);
            //mainMenuButton.setOpaque(false);
            mainMenuButton.setBorderPainted(false);
            mainMenuButton.setContentAreaFilled(false);
            mainMenuButton.setBounds(617, 6, buttonWidth, buttonHeight);
        }
}

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

1 个答案:

答案 0 :(得分:1)

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

public UserInterface() { // extends JLabel
    this.setImageIcon(new ImageIcon("res/images/UIPanelImage.gif"));
    // or super(~imageicon~)
}

不太可能,但可能是图像在绘制时尚未加载。你应该使用MediaTracker来更仔细地管理它(虽然我不确定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);
}