我可以将ActionListener添加到未明确定义的JButton吗?

时间:2014-05-07 23:15:45

标签: java eclipse swing jbutton actionlistener

我试图制作一个棋盘式的东西,每个瓷砖都是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行的评论。是否有一个正确的方法来做到这一点?

任何帮助都将受到高度赞赏。

2 个答案:

答案 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一样),只需单击鼠标即可。好的是,你现在可以减少对象的实例化,从而带来更好的内存占用。

希望它有用。