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

时间:2014-04-21 23:55:27

标签: java swing graphics jbutton grid-layout

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

}

1 个答案:

答案 0 :(得分:3)

首先,您需要使用MouseListener来侦听mousePressed和mouseReleased操作。这意味着你绝对应该将JButtons用于这种类型的程序,而是使用JLabel或图像的逻辑网格,因为JButtons应该响应ActionListeners,而不是MouseListeners(极少数例外)。我建议使用JLabel,因为它们很容易保存和设置文本并为您提供所持文本。

接下来,您将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一些水平和垂直间隙。

对于布局,使用GridLayout构造函数,它接受4个int参数,而不是2,第3和第4个参数用于水平和垂直间隙:

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

对于边框,请考虑使用在创建它的循环中添加到JLabel的LineBorder。如果该边框过多地聚集了你的文本,你可以使用一个CompoundBorder,其中内边框是一个具有合适常量的EmptyBorder,外边框是一个LineBorder。