简体   繁体   中英

JButtons not displaying until mouse hover

I'm creating a gui that has 2 panels. When the gui is first loaded only one panel is visible and when a button is pressed the new panel is displayed. The problem is that on the 2nd panel when it loads the buttons are invisible and only display when the mouse hovers over them. On top of that when you move the screen they become invisible again and need to be hovered over to be displayed again. I really don't know what to try as I have looked at methods of having multiple panels and this seems the best way to do it and aswell as this the buttons are implmented the same way I have implemented them for the 1st panel and they render correctly.

Full Code

import javax.swing.*;
import java.awt.*; 
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Gui {
    private JFrame frame;
    private JPanel panel1;
    private JPanel panel2;
    private JButton btnShip1, btnShip2, btnShip3, btnTutorial, btnLeftControl, btnHull, btnTargeting, btnRadar, btnWarning, btnRightControl;
    private JTextField txtCharacterName, txtShipName;
    private JLabel welcome, background;

    public static void main(String[] args) {
        new Gui();
    }

    public Gui(){
        createWindow();
        addButtons();
        addFields();
        addWelcome();

        frame.add(panel1);
        frame.setVisible(true);

        addBackground();
        addShipControls();
    }

    public void createWindow(){
        frame = new JFrame();
        frame.setTitle("Space Battle");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(642, 518);

        panel1 = new JPanel();
        panel1.setLayout(null);
        panel1.setBackground(Color.decode("#242627"));

        panel2 = new JPanel();
        panel2.setLayout(null);
        panel2.setBackground(Color.decode("#242627"));
    }

    public void addButtons(){
        btnShip1 = new JButton ();
        try 
        {
            ImageIcon img = new ImageIcon ("resources/cruiserSelectBtn.jpg");
            btnShip1.setIcon(img);
        } 
        catch (Exception e) {}
        try 
        {
            ImageIcon img = new ImageIcon ("resources/button_1_hover.gif");
            btnShip1.setRolloverIcon(img);
        } 
        catch (Exception e) {}
        btnShip1.setBounds(246,0,380,160);
        btnShip1.setMargin(new Insets(0, 0, 0, 0));
        btnShip1.addActionListener(new cruiserSelectHandler());
        btnShip1.setBorder(null);
        panel1.add (btnShip1);

        btnShip2 = new JButton ();
        try 
        {
            ImageIcon img = new ImageIcon ("resources/fighterSelectBtn.jpg");
            btnShip2.setIcon(img);
        } 
        catch (Exception e) {}
        try 
        {
            ImageIcon img = new ImageIcon ("resources/button_2_hover.gif");
            btnShip2.setRolloverIcon(img);
        } 
        catch (Exception e) {}
        btnShip2.setBounds(246,160,380,160);
        btnShip2.setMargin(new Insets(0, 0, 0, 0));
        btnShip2.addActionListener(new fighterSelectHandler());
        btnShip2.setBorder(null);
        panel1.add (btnShip2);

        btnShip3 = new JButton ();
        try 
        {
            ImageIcon img = new ImageIcon ("resources/battleSelectBtn.jpg");
            btnShip3.setIcon(img);
        } 
        catch (Exception e) {}
        try 
        {
            ImageIcon img = new ImageIcon ("resources/button_3_hover.gif");
            btnShip3.setRolloverIcon(img);
        } 
        catch (Exception e) {}
        btnShip3.setBounds(246,320,380,160);
        btnShip3.setMargin(new Insets(0, 0, 0, 0));
        btnShip3.addActionListener(new battleSelectHandler());
        btnShip3.setBorder(null);
        panel1.add (btnShip3);

        btnTutorial = new JButton ();
        try 
        {
            ImageIcon img = new ImageIcon ("resources/tutorialBtn.jpg");
            btnTutorial.setIcon(img);
        } 
        catch (Exception e) {}
        btnTutorial.setBounds(5,426,234,49);
        btnTutorial.setMargin(new Insets(0, 0, 0, 0));
        panel1.add (btnTutorial);
    }

    public void addFields(){
        txtCharacterName = new JTextField("Insert Character Name");
        txtCharacterName.setBounds(12,260,220,35);
        panel1.add(txtCharacterName);

        txtShipName = new JTextField("Insert Ship Name");
        txtShipName.setBounds(12,315,220,35);
        panel1.add(txtShipName);
    }

    public void addWelcome(){
        welcome =  new JLabel ();
        try 
        {
            ImageIcon img = new ImageIcon ("resources/welcome.jpg");
            welcome.setIcon(img);
        } 
        catch (Exception e) {}
        welcome.setBounds(0,0,247,229);
        panel1.add(welcome);
    }
    //Class used to change panels
    class cruiserSelectHandler implements ActionListener {
        public void actionPerformed(ActionEvent even) {
            frame.add(panel2);
            panel1.setVisible(false);
        }
    }

    class fighterSelectHandler implements ActionListener {
        public void actionPerformed(ActionEvent even) {
            frame.add(panel2);
            panel1.setVisible(false);
        }
    }

    class battleSelectHandler implements ActionListener {
        public void actionPerformed(ActionEvent even) {
            frame.add(panel2);
            panel1.setVisible(false);
        }
    }

    public void addBackground(){
            //Is the background interfering?
        background =  new JLabel ();
        try 
        {
            ImageIcon img = new ImageIcon ("resources/background.jpg");
            background.setIcon(img);
        } 
        catch (Exception e) {}
        background.setBounds(0,0,640,480);
        panel2.add(background);
    }

    //Class used to add controls/buttons
    public void addShipControls(){
        btnLeftControl = new JButton ();
        try 
        {
            ImageIcon img = new ImageIcon ("resources/left_controls.png");
            btnLeftControl.setIcon(img);
        } 
        catch (Exception e) {}
        btnLeftControl.setBounds(-8,319,131,160);
        btnLeftControl.setMargin(new Insets(0, 0, 0, 0));
        btnLeftControl.setBorder(null);
        panel2.add (btnLeftControl);

        btnHull = new JButton ();
        try 
        {
            ImageIcon img = new ImageIcon ("resources/hull_controls.png");
            btnHull.setIcon(img);
        } 
        catch (Exception e) {}
        btnHull.setBounds(123,319,91,160);
        btnHull.setMargin(new Insets(0, 0, 0, 0));
        btnHull.setBorder(null);
        panel2.add (btnHull); 

        btnTargeting = new JButton ();
        try 
        {
            ImageIcon img = new ImageIcon ("resources/targeting_controls.png");
            btnTargeting.setIcon(img);
        } 
        catch (Exception e) {}
        btnTargeting.setBounds(214,319,202,160);
        btnTargeting.setMargin(new Insets(0, 0, 0, 0));
        btnTargeting.setBorder(null);
        panel2.add (btnTargeting);

        btnWarning = new JButton ();
        try 
        {
            ImageIcon img = new ImageIcon ("resources/warning_controls.png");
            btnWarning.setIcon(img);
        } 
        catch (Exception e) {}
        btnWarning.setBounds(416,411,86,68);
        btnWarning.setMargin(new Insets(0, 0, 0, 0));
        btnWarning.setBorder(null);
        panel2.add (btnWarning);

        btnRadar = new JButton ();
        try 
        {
            ImageIcon img = new ImageIcon ("resources/radar_idea.gif");
            btnRadar.setIcon(img);
        } 
        catch (Exception e) {}
        btnRadar.setBounds(416,319,86,92);
        btnRadar.setMargin(new Insets(0, 0, 0, 0));
        btnRadar.setBorder(null);
        panel2.add (btnRadar);

        btnRightControl = new JButton ();
        try 
        {
            ImageIcon img = new ImageIcon ("resources/right_controls.png");
            btnRightControl.setIcon(img);
        } 
        catch (Exception e) {}
        btnRightControl.setBounds(502,319,131,160);
        btnRightControl.setMargin(new Insets(0, 0, 0, 0));
        btnRightControl.setBorder(null);
        panel2.add (btnRightControl);

    }
}

when a button is pressed the new panel is displayed.

The problem is:

  1. you are using a null layout
  2. you are add two different panels to the frame.

By default Swing paints components in the reverse order that they were added.

So when you add panel1, it is the only panel of the frame so it is painted.

Then you click a button and add panel2. So Swing paints panel2 and then repaints panel1 on top, so panel2 is hidden. When you mouse over the button it appears because buttons listen for mouseEntered events and the button gets repainted.

When you resize the screen panel2 is painted and then panel1 is painted so you have the problem again.

The solution is to use a proper layout manager. In your case you should be using a Card Layout. The Card Layout will swap panels making sure only one panel is ever visible at a time. Read the Swing tutorial on Using Card Layout . Then get rid of all the null layouts and setBounds() methods.

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