在 JAVA 中将工具栏添加到 GUI

Adding toolbar to GUI in JAVA

我正在研究国际象棋游戏。我在容器中有 JFrame,其中包括 JLabel 字段的二维数组。现在我想在我的 window 中添加一个工具栏,但是当我想这样做时,我的棋盘崩溃了。这是我的 window 和棋盘看起来像 Window 的照片。我想在 window 顶部添加工具栏,例如 save/load 游戏...等 我还想在右侧添加一些面板,我可以在其中看到以前的动作。我想知道如何在不破坏我的棋盘的情况下做到这一点。 这是我的代码:

public class GUI extends JFrame implements Serializable{
 public void initGUI() {
    setTitle("Chess game");
    setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    ImageIcon img = new ImageIcon("pieceImages/whiteKing.png");
    contentPane = getContentPane();
    GridLayout gridLayout = new GridLayout(8, 8);
    contentPane.setLayout(gridLayout);
    for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 8; j++) {
            labels[i][j]=new JLabel(game.getBoard()[i][j].getImagePath());
            contentPane.add(labels[i][j]);
        }
    }
    setIconImage(img.getImage());
    setResizable(false);
    setSize(600, 600);
    setLocationRelativeTo(null);
    setVisible(true);
}

我创建了一些 JPanel 的建议:

public class Toolbar extends JPanel implements Serializable {
   public Toolbar(){
       JButton newGameBtn = new JButton("New game");
       JButton regretBtn = new JButton("Regret move");
       add(newGameBtn);
       add(regretBtn);
   }
}

您可以使用两个面板,一个用于工具栏,另一个面板作为主游戏面板。

因此,在您的 GUI class 中,将布局设置为 BorderLayout 并添加带有 NORTH 约束的工具栏面板和带有 CENTER 约束的游戏面板。类似于:

JFrame frame = new JFrame();
            frame.setTitle("Chess game");
            frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
            Container contentPane = frame.getContentPane();
            contentPane.setLayout(new BorderLayout());
            JPanel toolbar = new JPanel(); // stablish any layout...
            toolbar.add(new JButton("Save"));
            // add the rest of the buttons...

            JPanel game = new JPanel(); // this is your current contentPane
            GridLayout gridLayout = new GridLayout(8, 8);
            game.setLayout(gridLayout);
            game.add(new JButton("Any Component"));
            game.add(new JButton("Any other Component"));

            contentPane.add(toolbar, BorderLayout.NORTH);
            contentPane.add(game, BorderLayout.CENTER);

您可以将 BorderLayout 设置到内容窗格,将工具栏添加到北部,将另一个包含标签的面板添加到中心。

    setTitle("Chess game");
    setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    ImageIcon img = new ImageIcon("pieceImages/whiteKing.png");
    contentPane = getContentPane();

    contentPane.setLayout(new BorderLayout());

    Toolbar toolbar = new Toolbar();

    JPanel labelsPanel = new JPanel();

    GridLayout gridLayout = new GridLayout(8, 8);
    labelsPanel.setLayout(gridLayout);
    for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 8; j++) {
            labels[i][j]=new JLabel(game.getBoard()[i][j].getImagePath());
            labelsPanel.add(labels[i][j]);
        }
    }

    contentPane.add(toolbar, BorderLayout.NORTH);
    contentPane.add(labelsPanel, BorderLayout.CENTER);

    setIconImage(img.getImage());
    setResizable(false);
    setSize(600, 600);
    setLocationRelativeTo(null);
    setVisible(true);

另请注意,您可以使用 JToolBar , see How to Use Tool Bars