0

我正在创建一个有 2 个面板的 gui。首次加载 gui 时,只有一个面板可见,按下按钮时会显示新面板。问题是在第二个面板上加载按钮时是不可见的,只有当鼠标悬停在它们上面时才会显示。最重要的是,当您移动屏幕时,它们会再次变得不可见,需要将鼠标悬停在上面才能再次显示。我真的不知道该尝试什么,因为我已经查看了拥有多个面板的方法,这似乎是最好的方法,而且按钮的实现方式与我为第一个面板实现它们的方式相同,它们呈现正确。

完整代码

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. 您正在使用空布局
  2. 您将在框架中添加两个不同的面板。

默认情况下,Swing 以与添加组件相反的顺序绘制组件。

因此,当您添加 panel1 时,它是框架的唯一面板,因此它被绘制。

然后单击一个按钮并添加 panel2。所以 Swing 绘制了 panel2,然后在顶部重新绘制了 panel1,因此 panel2 被隐藏了。当您将鼠标悬停在按钮上时,它会出现,因为按钮侦听 mouseEntered 事件并且按钮被重新绘制。

当你调整屏幕的大小时,panel2 被绘制,然后 panel1 被绘制,所以你又遇到了问题。

解决方案是使用适当的布局管理器。在您的情况下,您应该使用卡片布局。卡片布局将交换面板,确保一次只能看到一个面板。阅读有关使用卡片布局的 Swing 教程。然后摆脱所有空布局和 setBounds() 方法。

于 2013-06-28T14:54:49.897 回答