[英]How do I change button labels in a grid?
我正在尝试制作一种游戏,其中涉及通过将方块从正方形拖放到正方形来移动方块。 但是,我正在尝试使用带有标签的按钮(作为练习)。 因此,例如,当我在鼠标上按下按钮并释放第二个有效按钮(一个带有另一个空白标签)时,带有标签“ 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,而应该使用JLabel或图像的逻辑网格,因为JButton应该响应ActionListeners,而不是MouseListeners(极少数例外)。 我建议使用JLabels,因为它们很容易保存和设置文本并为您提供他们保存的文本。
接下来,将MouseListener添加到JLabel,并在mousePressed上获取按下的JLabel保留的文本。 MouseEvent参数的getSource()
方法将返回给您按下(释放)的JLabel。
因此,在您的for循环内部,您将需要添加以下内容:
bogrid[j][i] = new JLabel("B");
bogrid[j][i].addMouseListener(myMouseListener);
frame.add(bogrid[j][i]);
其中,myMouseListener是您的MouseListener对象。
编辑
您在评论中提问:
最初的问题:使用JLabel而不是JButton会产生一个窗口,该窗口似乎是一个很大的空字段,带有一堆浮动标签。 如何使它显示为带有划定各个空间的线条的网格?
考虑给JLabel设置边框,并考虑给GridLayout一些水平和垂直间隙。
对于布局,请使用带有4个int参数而不是2的GridLayout构造函数,第3个和第4个参数用于水平和垂直间隙:
int gap = 4; // or whatever number looks nice
frame.setLayout(new GridLayout(8, 8, gap, gap));
对于边框,请考虑使用在创建边框的循环中添加到JLabel的LineBorder。 如果Border会使您的文本过于拥挤,则可以使用CompoundBorder,其中内部边框是具有适当常量的EmptyBorder,外部边框是LineBorder。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.