我试图制作一个棋盘式的东西,每个瓷砖都是JButton。 我想为每个按钮添加相同的actionListener。这是代码:
package checker;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class mainClass extends JFrame {
JPanel board = new JPanel();
ActionListener btnPrs = new btnPressed();
public mainClass()
{
board.setLayout(new GridLayout(8,8,0,0));
for(int i = 0; i<8; i++)
for(int j = 0; j<8; j++)
{
if( i%2 == 0 && j%2 == 0 || i%2 == 1 && j%2 == 1)
{
board.add(new DrawWhite());
//board.add(new DrawWhite().addActionListener(btnPrs));
}
else board.add(new DrawBlack());
}
add(board);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
mainClass frame = new mainClass();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400,400);
frame.setVisible(true);
frame.setTitle("Checker");
frame.setLocationRelativeTo(null);
}
class DrawWhite extends JButton
{
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setColor(Color.WHITE);
g.fillRect(0,0, 50,50);
}
}
class DrawBlack extends JButton
{
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setColor(Color.BLACK);
g.fillRect(0, 0, 50, 50);
}
}
class btnPressed implements ActionListener
{
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("pressed!");
}
}
}
我不想明确定义64个按钮,并手动为每个按钮添加ActionListeners。我尝试了他们的方式,作为第23行的评论。是否有一个正确的方法来做到这一点?
任何帮助都将受到高度赞赏。
答案 0 :(得分:3)
只需将按钮存储在临时变量中:
DrawWhite dw = new DrawWhite();
dw.addActionListener(btnPrs);
board.add(dw);
答案 1 :(得分:1)
如果你真的想要&#34; 每个瓷砖都是JButton &#34;那么是的,您将需要定义64个JButton,因为相同的组件不能两次添加到其父组件中。
但如果你真正需要的是每个瓷砖都是可点击的,你将需要根本不添加任何JButton。仅对整个棋盘使用自定义JPanel
,覆盖其paintComponent
方法以绘制黑白方块。附加到此mouseListener
的{{1}}个JPanel
可以根据x和y坐标告诉白色瓷砖中的黑色。
工作代码如下:
package checker;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class mainClass extends JFrame {
JPanel board = new BoardPanel();
MouseListener btnPrs = new btnPressed();
public mainClass()
{
board.addMouseListener(btnPrs);
add(board);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
mainClass frame = new mainClass();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400,400);
frame.setVisible(true);
frame.setTitle("Checker");
frame.setLocationRelativeTo(null);
}
private Color blackOrWhite(int i, int j) {
return (i + j) % 2 == 0 ?
Color.WHITE
: Color.BLACK;
}
class BoardPanel extends JPanel
{
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
Color color = blackOrWhite(i, j);
g.setColor(color);
g.fillRect(i * 50, j * 50, 50, 50);
}
}
}
}
class btnPressed extends MouseAdapter
{
@Override
public void mouseClicked(MouseEvent e) {
int x = e.getX();
int y = e.getY();
System.out.println("pressed!");
System.out.println(blackOrWhite(x/50, y/50));
}
}
}
不好的是你放松了&#34; resizability&#34; JButton
中的BorderLayout
个。此外,您无法再通过键盘激活磁贴(就像使用JButton
一样),只需单击鼠标即可。好的是,你现在可以减少对象的实例化,从而带来更好的内存占用。
希望它有用。