简体   繁体   中英

Buttons are being hidden by background image

I have set a background image on a JPanel but when i try to add buttons and selects to the custom background panel the buttons are hidden until i move the mouse over the buttons. I have included the code snippets below.

Below is my customized JPanel

package au.com.tankwarz.view.custompanels;

import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;

import javax.swing.JPanel;

public class BackgroundPanel extends JPanel
{

    /**
     * 
     */
    private static final long serialVersionUID = 1659728640545162103L;

    public BackgroundPanel()
    {
    }

    @Override
    public void paintComponent(final Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D)g;
        g2d.drawImage(loadBackgroundImage(), 0, 0, this);    

        g2d.dispose();  
    }   

    private static BufferedImage loadBackgroundImage()
    {
         BufferedImage bi = new BufferedImage(800, 600, BufferedImage.TYPE_INT_ARGB);
         Graphics2D g2d = bi.createGraphics();
         g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

         // Paint a gradient from top to bottom
        GradientPaint gp = new GradientPaint( 0, 0, Color.BLACK, 0, 600, new Color(0, 0, 255).darker( ).darker() );

        g2d.setPaint( gp );
        g2d.fillRect( 0, 0, 800, 600 );

        g2d.dispose();

        return bi;
    }
}

And here is where i try to use it to display the panel with the buttons on it.

package au.com.tankwarz.view;
import java.awt.event.ActionListener;

import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

import org.jdesktop.application.Application;

import au.com.tankwarz.view.custompanels.BackgroundPanel;

import com.cloudgarden.layout.AnchorConstraint;
import com.cloudgarden.layout.AnchorLayout;

public class NewGamePanel extends BackgroundPanel {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private JLabel numberOfPlayersLable;
    private JComboBox numberOfPlayersCB;
    private JButton cancelButton;
    private JButton createPlayersButton;
    private JComboBox numberOfTanksCB;
    private JLabel numberOfTanksLable;
    private JComboBox numberOfRoundsCB;
    private JLabel numberOfRounds;

    public static final String[] numberOfPlayersCBValues = new String[] { "Two", "Three", "Four" };

    public static final String[] numberOfRoundsCBValues = new String[] { "One", "Two", "Three", "Four" };

    public static final String[] numberOfTanksCBValues = new String[] { "One", "Two", "Three", "Four" };

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                //new NewGamePanel();


                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new NewGamePanel());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });


    }

    public NewGamePanel() {
        super();
        initGUI();
    }

    private void initGUI() {
        try {
            AnchorLayout thisLayout = new AnchorLayout();
            this.setLayout(thisLayout);
            this.setPreferredSize(new java.awt.Dimension(800, 600));
            this.setSize(800, 600);
            this.setOpaque(true);
            this.setName("this");
            {
                numberOfPlayersLable = new JLabel();
                this.add(numberOfPlayersLable, new AnchorConstraint(144, 320, 201, 77, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL));
                numberOfPlayersLable.setName("numberOfPlayersLable");
                numberOfPlayersLable.setPreferredSize(new java.awt.Dimension(60, 40));
            }
            {
                ComboBoxModel numberOfPlayersCBModel = 
                    new DefaultComboBoxModel(numberOfPlayersCBValues);
                numberOfPlayersCB = new JComboBox();
                this.add(numberOfPlayersCB, new AnchorConstraint(125, 697, 219, 386, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL));
                numberOfPlayersCB.setModel(numberOfPlayersCBModel);
                numberOfPlayersCB.setPreferredSize(new java.awt.Dimension(60, 40));
            }
            {
                numberOfRounds = new JLabel();
                this.add(numberOfRounds, new AnchorConstraint(298, 371, 355, 77, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL));
                numberOfRounds.setName("numberOfRounds");
                numberOfRounds.setPreferredSize(new java.awt.Dimension(60, 40));
            }
            {
                ComboBoxModel numberOfRoundsCBModel = 
                    new DefaultComboBoxModel(numberOfRoundsCBValues);
                numberOfRoundsCB = new JComboBox();
                this.add(numberOfRoundsCB, new AnchorConstraint(283, 697, 366, 386, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL));
                numberOfRoundsCB.setModel(numberOfRoundsCBModel);
                numberOfRoundsCB.setName("numberOfRoundsCB");
                numberOfRoundsCB.setPreferredSize(new java.awt.Dimension(60, 40));
            }
            {
                numberOfTanksLable = new JLabel();
                this.add(numberOfTanksLable, new AnchorConstraint(453, 320, 509, 77, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL));
                numberOfTanksLable.setName("numberOfTanksLable");
                numberOfTanksLable.setPreferredSize(new java.awt.Dimension(60, 40));
            }
            {
                ComboBoxModel numberOfTanksCBModel = 
                    new DefaultComboBoxModel(numberOfTanksCBValues);
                numberOfTanksCB = new JComboBox();
                this.add(numberOfTanksCB, new AnchorConstraint(437, 697, 520, 386, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL));
                numberOfTanksCB.setModel(numberOfTanksCBModel);
                numberOfTanksCB.setPreferredSize(new java.awt.Dimension(60, 40));
            }
            {
                createPlayersButton = new JButton();
                this.add(createPlayersButton, new AnchorConstraint(795, 758, 878, 511, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL));
                createPlayersButton.setName("createPlayersButton");
                createPlayersButton.setPreferredSize(new java.awt.Dimension(99, 25));
            }
            {
                cancelButton = new JButton();
                this.add(cancelButton, new AnchorConstraint(795, 248, 878, 128, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL));
                cancelButton.setName("cancelButton");
                cancelButton.setPreferredSize(new java.awt.Dimension(48, 25));
            }
            Application.getInstance().getContext().getResourceMap(getClass()).injectComponents(this);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void setCreatePlayersButtonActionListener(ActionListener actionListener)
    {
        createPlayersButton.addActionListener(actionListener);
    }

    public void setCancelButtonActionListener(ActionListener actionListener)
    {
        cancelButton.addActionListener(actionListener);
    }

    public JComboBox getNumberOfPlayersCB()
    {
        return numberOfPlayersCB;
    }

    public void setNumberOfPlayersCB(JComboBox numberOfPlayersCB)
    {
        this.numberOfPlayersCB = numberOfPlayersCB;
    }

    public JComboBox getNumberOfTanksCB()
    {
        return numberOfTanksCB;
    }

    public void setNumberOfTanksCB(JComboBox numberOfTanksCB)
    {
        this.numberOfTanksCB = numberOfTanksCB;
    }

    public JComboBox getNumberOfRoundsCB()
    {
        return numberOfRoundsCB;
    }

    public void setNumberOfRoundsCB(JComboBox numberOfRoundsCB)
    {
        this.numberOfRoundsCB = numberOfRoundsCB;
    }

}

Any help would be appreciate as i have been struggling with this for a while.

  1. Don't change the state of the component from within any paintXxx method, this could cause a repaint event to be triggered, repeating the process until your CPU is running hot.
  2. Never change the opacity state of the component from within any paintXxx , this will cause a cascading series of repaint's as Swing suddenly starts trying to figure out what components are now visible behind the current one...
  3. Don't dispose of a Graphics context you didn't create, doing so could prevent what ever you paint after it not to be rendered on some systems.
  4. Try not to create the background image on each paint cycle, this is not only expensive from memory point of view, but also expensive from a time point of view

I'm not sure why you flipping the opacity state, you don't really want it to be transparent. Simply call super.paintComponent to prepare the graphics state and then draw your image on top.

You should also avoid using setPreferredSize , see Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing? for more details...

Just illustrate the point, this is what you code produces (after I corrected the paint issues)

在此输入图像描述

This is what my test code produces

在此输入图像描述

Updated with test code

import com.apple.eawt.Application;
import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.RenderingHints;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class BackgroundPanel extends JPanel {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                //new NewGamePanel();

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new NewGamePanel());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }

        });

    }

    public BackgroundPanel() {
    }

    private static BufferedImage bi;

    @Override
    public void paintComponent(final Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g.create();
        g2d.drawImage(loadBackgroundImage(), 0, 0, this);
        g2d.dispose();
    }

    private static BufferedImage loadBackgroundImage() {
        if (bi == null) {
            bi = new BufferedImage(800, 600, BufferedImage.TYPE_INT_ARGB);
            Graphics2D g2d = bi.createGraphics();
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

            // Paint a gradient from top to bottom
            GradientPaint gp = new GradientPaint(0, 0, Color.BLACK, 0, 600, new Color(0, 0, 255).darker().darker());

            g2d.setPaint(gp);
            g2d.fillRect(0, 0, 800, 600);

            g2d.dispose();
        }

        return bi;
    }

    public static class NewGamePanel extends BackgroundPanel {

        /**
         *
         */
        private static final long serialVersionUID = 1L;
        private JLabel numberOfPlayersLable;
        private JComboBox numberOfPlayersCB;
        private JButton cancelButton;
        private JButton createPlayersButton;
        private JComboBox numberOfTanksCB;
        private JLabel numberOfTanksLable;
        private JComboBox numberOfRoundsCB;
        private JLabel numberOfRounds;

        public static final String[] numberOfPlayersCBValues = new String[]{"Two", "Three", "Four"};

        public static final String[] numberOfRoundsCBValues = new String[]{"One", "Two", "Three", "Four"};

        public static final String[] numberOfTanksCBValues = new String[]{"One", "Two", "Three", "Four"};

        public NewGamePanel() {
            super();
            initGUI();
        }

        private void initGUI() {
            try {
                GridBagLayout thisLayout = new GridBagLayout();
                this.setLayout(thisLayout);
                this.setPreferredSize(new java.awt.Dimension(800, 600));
                this.setSize(800, 600);
                this.setOpaque(true);
                this.setName("this");

                GridBagConstraints gbc = new GridBagConstraints();
                gbc.gridwidth = gbc.REMAINDER;
                {
                    numberOfPlayersLable = new JLabel();
                    this.add(numberOfPlayersLable, gbc);
                    numberOfPlayersLable.setName("numberOfPlayersLable");
                }
                {
                    ComboBoxModel numberOfPlayersCBModel
                                    = new DefaultComboBoxModel(numberOfPlayersCBValues);
                    numberOfPlayersCB = new JComboBox();
                    this.add(numberOfPlayersCB, gbc);
                    numberOfPlayersCB.setModel(numberOfPlayersCBModel);
                }
                {
                    numberOfRounds = new JLabel();
                    this.add(numberOfRounds, gbc);
                    numberOfRounds.setName("numberOfRounds");
                }
                {
                    ComboBoxModel numberOfRoundsCBModel
                                    = new DefaultComboBoxModel(numberOfRoundsCBValues);
                    numberOfRoundsCB = new JComboBox();
                    this.add(numberOfRoundsCB, gbc);
                    numberOfRoundsCB.setModel(numberOfRoundsCBModel);
                    numberOfRoundsCB.setName("numberOfRoundsCB");
                }
                {
                    numberOfTanksLable = new JLabel();
                    this.add(numberOfTanksLable, gbc);
                    numberOfTanksLable.setName("numberOfTanksLable");
                }
                {
                    ComboBoxModel numberOfTanksCBModel
                                    = new DefaultComboBoxModel(numberOfTanksCBValues);
                    numberOfTanksCB = new JComboBox();
                    this.add(numberOfTanksCB, gbc);
                    numberOfTanksCB.setModel(numberOfTanksCBModel);
                }
                {
                    createPlayersButton = new JButton();
                    this.add(createPlayersButton, gbc);
                    createPlayersButton.setName("createPlayersButton");
                }
                {
                    cancelButton = new JButton();
                    this.add(cancelButton, gbc);
                    cancelButton.setName("cancelButton");
                }
//                Application.getInstance().getContext().getResourceMap(getClass()).injectComponents(this);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        public void setCreatePlayersButtonActionListener(ActionListener actionListener) {
            createPlayersButton.addActionListener(actionListener);
        }

        public void setCancelButtonActionListener(ActionListener actionListener) {
            cancelButton.addActionListener(actionListener);
        }

        public JComboBox getNumberOfPlayersCB() {
            return numberOfPlayersCB;
        }

        public void setNumberOfPlayersCB(JComboBox numberOfPlayersCB) {
            this.numberOfPlayersCB = numberOfPlayersCB;
        }

        public JComboBox getNumberOfTanksCB() {
            return numberOfTanksCB;
        }

        public void setNumberOfTanksCB(JComboBox numberOfTanksCB) {
            this.numberOfTanksCB = numberOfTanksCB;
        }

        public JComboBox getNumberOfRoundsCB() {
            return numberOfRoundsCB;
        }

        public void setNumberOfRoundsCB(JComboBox numberOfRoundsCB) {
            this.numberOfRoundsCB = numberOfRoundsCB;
        }

    }

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM