gpt4 book ai didi

java - 如何更改网格中的按钮标签?

转载 作者:行者123 更新时间:2023-12-01 23:03:08 25 4
gpt4 key购买 nike

我正在尝试制作一个游戏,其中涉及通过将棋子从一个方 block 拖放到另一个方 block 来移动棋子。但是,我尝试使用带有标签的按钮来实现此目的(作为练习)。因此,例如,当我在标签上按下鼠标并释放第二个有效按钮(带有另一个空白标签的按钮)时,带有标签“W”的按钮应将其标签更改为“”(空白)。然后第二个按钮应将其标签从“”(空白)更改为“W”。

在 Java 中使用图形对我来说是全新的。可以说,我不确定如何完成上述任务。到目前为止,这是我的代码:

import javax.swing.*;
import javax.swing.JButton;
import java.awt.GridLayout;
import java.awt.event.*;

class Boardgame extends JFrame implements MouseListener {
JFrame frame = new JFrame("Boardgame");
JButton[][] bogrid;

public Boardgame ()
{
frame.setLayout(new GridLayout(8,8));

bogrid = new JButton[8][8];
for (int i=0;i<8;i++)
{
for (int j=0;j<2;j++)
{
bogrid[j][i] = new JButton("B");
frame.add(bogrid[j][i]);
}
for (int j=2;j<6;j++)
{
bogrid[j][i] = new JButton();
frame.add(bogrid[j][i]);
}
for (int j=6;j<8;j++)
{
bogrid[j][i] = new JButton("W");
frame.add(bogrid[j][i]);
}
}

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setSize(405, 450);
frame.setVisible(true);
}

public void mouseClicked(MouseEvent e)
{
}

public void mouseReleased(MouseEvent e)
{
}

public void mouseEntered(MouseEvent e)
{
}

public void mouseExited(MouseEvent e)
{
}

public void mousePressed(MouseEvent e)
{
}

class MyAction implements ActionListener {
Boardgame bo;

MyAction(Boardgame b)
{
bo = b;
}
}

}

最佳答案

首先,您需要使用 MouseListener 来监听 mousePressed 和 mouseReleased 操作。这意味着您绝对不应该在此类程序中使用 JButton,而应使用 JLabels 或图像逻辑网格,因为 JButton 应该响应 ActionListener,而不是 MouseListener(极少数异常(exception))。我建议使用 JLabels,因为它们可以轻松保存和设置文本并向您提供它们保存的文本。

接下来,您将把 MouseListener 添加到 JLabels,并在 mousePressed 上获取按下的 JLabel 所保存的文本。 MouseEvent 参数的 getSource() 方法将返回按下(和释放)的 JLabel。

因此,在 for 循环内部,您需要添加如下内容:

bogrid[j][i] = new JLabel("B");
bogrid[j][i].addMouseListener(myMouseListener);
frame.add(bogrid[j][i]);

其中 myMouseListener 是您的 MouseListener 对象。

<小时/>

编辑
您在评论中询问:

Initial question: using JLabel instead of JButton yields a window that appears to be a large empty field with a bunch of floating labels. How do I make it appear as a grid with lines demarcating the individual spaces?

考虑为 JLabel 提供边框,并考虑为 GridLayout 提供一些水平和垂直间隙。

对于布局,使用 GridLayout 构造函数,该构造函数采用 4 个 int 参数,而不是 2 个,其中第三个和第四个参数用于水平和垂直间隙:

int gap = 4; // or whatever number looks nice
frame.setLayout(new GridLayout(8, 8, gap, gap));

对于边框,请考虑使用在创建 JLabel 的循环中添加到 JLabel 的 LineBorder。如果该边框使您的文本过于拥挤,您可以使用CompoundBorder,其中内边框是带有合适常量的EmptyBorder,外边框是LineBorder。

关于java - 如何更改网格中的按钮标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23207987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com