Как заказать два компонента в JFrame, чтобы прозрачность и ActionListeners работали? - PullRequest
0 голосов
/ 07 июля 2011

При добавлении двух компонентов в JFrame, где один находится внутри другого, если я добавлю их в порядке, Fullscreen Object, затем 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 Ответ

1 голос
/ 07 июля 2011

Вы, вероятно, хотите использовать 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);
}
...