繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM