【问题标题】:How do I change button labels in a grid?如何更改网格中的按钮标签?
【发布时间】:2014-04-21 23:55:27
【问题描述】:

我正在尝试制作一款游戏,该游戏涉及通过将棋子从一个方格拖放到另一个方格来移动棋子。但是,我正在尝试使用带有标签的按钮(作为练习)来做到这一点。因此,例如,当我在其上按下鼠标并释放第二个有效按钮(带有另一个空白标签的按钮)时,带有标签“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;
    }
}

}

【问题讨论】:

    标签: java swing graphics jbutton grid-layout


    【解决方案1】:

    首先,您需要使用 MouseListener 来监听 mousePressed 和 mouseReleased 动作。这意味着您绝对应该将 JButtons 用于此类程序,而应使用 JLabels 或图像的逻辑网格,因为 JButtons 应该响应 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。如果该边框过于拥挤您的文本,您可以使用 CompoundBorder,其中内边框是具有适当常量的 EmptyBorder,外边框是 LineBorder。

    【讨论】:

    • 感谢您的 cmets,气垫船。最初的问题:使用 JLabel 而不是 JButton 会产生一个窗口,该窗口看起来是一个带有一堆浮动标签的大空字段。如何使它显示为一个网格,用线划分各个空间?
    • @CSpadawan:不客气。请参阅编辑以回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    相关资源
    最近更新 更多