0

2 つのパネルを持つ GUI を作成しています。GUI が最初にロードされたときは 1 つのパネルのみが表示され、ボタンを押すと新しいパネルが表示されます。問題は、2 番目のパネルでは、ボタンが読み込まれると非表示になり、マウスがボタンの上に置かれたときにのみ表示されることです。その上、画面を移動すると、それらは再び非表示になり、再び表示するにはホバーする必要があります。複数のパネルを持つ方法を見てきましたが、これが最善の方法のようです。また、ボタンは、最初のパネルに実装したのと同じ方法で実装され、レンダリングされます。正しく。

完全なコード

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

    }
}
4

1 に答える 1

4

ボタンを押すと、新しいパネルが表示されます。

問題は:

  1. null レイアウトを使用しています
  2. フレームに 2 つの異なるパネルを追加します。

デフォルトでは、Swing は追加された順序とは逆の順序でコンポーネントを描画します。

したがって、panel1 を追加すると、それがフレームの唯一のパネルであるため、ペイントされます。

次に、ボタンをクリックして panel2 を追加します。そのため、Swing は panel2 をペイントしてから、その上に panel1 を再ペイントするため、panel2 は非表示になります。ボタンにマウスを合わせると、ボタンが mouseEntered イベントをリッスンし、ボタンが再描画されるため、ボタンが表示されます。

画面のサイズを変更すると、 panel2 がペイントされてから panel1 がペイントされるため、再び問題が発生します。

解決策は、適切なレイアウト マネージャーを使用することです。あなたの場合、カードレイアウトを使用する必要があります。カード レイアウトは、一度に 1 つのパネルのみが表示されるようにパネルを交換します。カード レイアウトの使用に関する Swing チュートリアルをお読みください。次に、null レイアウトと setBounds() メソッドをすべて取り除きます。

于 2013-06-28T14:54:49.897 に答える