0

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);

    }
}
mKorbel
  • 109,525
  • 20
  • 134
  • 319
sam_7_h
  • 810
  • 3
  • 11
  • 23
  • post full code please. – Makky Jun 28 '13 at 14:18
  • `btnLeftControl.setBounds(-8,319,131,160);`, `background.setBounds(0,0,640,480);` does not look good. Hard to tell without more code – Guillaume Polet Jun 28 '13 at 14:21
  • I believe you need to invalidate and then validate the frame so that it will redisplay. As said above...difficult to say without more code. – JayDM Jun 28 '13 at 14:25
  • You need to work on your code. Could you explain what exactly you are trying to do ? – Makky Jun 28 '13 at 14:29
  • 1
    Catching `Exception` and doing nothing with it is a bad idea. If something goes wrong, you aren't going to know it until it causes some error later on. Also, there is a lot of repeated code here. Creating a method that executes the repeated tasks will make your life easier in the future. – unholysampler Jun 28 '13 at 14:31
  • Yeah sorry, new to programming only been doing the absolute basics for a while and thought I would learn by trying to make a game. That a side when the program loads. Only the first panel should be rendered. This has 3 buttons on the right. The elements on the left of the panel don't do anything yet but I will get to that another time. When any of the 3 buttons on the right are clicked, the first panel is no longer needed and a second panel needs to appear this will have different JButtons and JLabels. – sam_7_h Jun 28 '13 at 14:33
  • @unholysampler I know catching Exceptions and doing nothing is a bad idea. It is far from being completed and therefore there will be alot of problems with the above code. – sam_7_h Jun 28 '13 at 14:34
  • 1
    1) Java GUIs might have to work on a number of platforms, on different screen resolutions & using different PLAFs. As such they are not conducive to exact placement of components. To organize the components for a robust GUI, instead use layout managers, or combinations of them, along with layout padding & borders for white space. 2) For many components in one space, use a [`CardLayout`](http://docs.oracle.com/javase/7/docs/api/java/awt/CardLayout.html) as see in this [short example](http://stackoverflow.com/a/5786005/418556). – Andrew Thompson Jun 28 '13 at 15:21
  • I actually asked this question yesterday but after no responses I stuck to absolute positioning. I have been struggling with GUIs the documenation seems to be only for very basic things and I am finding it hard to step them up: http://stackoverflow.com/questions/17324879/how-to-set-size-of-elements-in-gridbaglayout Going to give WindowsBuilder a try and see if I can learn better from the code that it writes. – sam_7_h Jun 28 '13 at 15:24
  • @sam_7_h: In this case, I would recommended just adding `throws XXX` to your method signatures. It will look ugly because you will end up with a number of exceptions being listed as being thrown. Which is ok, because right now you have the mentality of "I need it to work, then I can clean up the code". But this way you have the added benefit of deeper issues will not be hidden. – unholysampler Jun 28 '13 at 18:10

1 Answers1

4

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.

camickr
  • 321,443
  • 19
  • 166
  • 288