如何在JButtons矩阵中创建事件?

时间:2016-08-17 00:02:01

标签: java arrays swing jbutton mouselistener

我正在尝试创建MouseListener。当我悬停JButton时,我希望它更改其背景颜色和数组中的下一个JButton。例如,当我悬停JButton[0][0]时,它会更改JButton[0][0]JButton[1][0]JButton[2][0]的背景等等。

以下是我创建JButton数组的方法:

for (int i = 0; i < 10; i++) {
    for (int j = 0; j < 10; j++) {
        btn[i][j] = new JButton();
        btn[i][j].addMouseListener(this);
        btn[i][j].setBackground(Color.black);
        panel.add(btn[i][j]);
    }
}

及其MouseListener

@Override
public void mouseEntered(MouseEvent me) {
    JButton event = (JButton) me.getSource();
    int i = 0;
    int j = 0;
    btn[i][j] = event;
    btn[i][j].setBackground(Color.blue);
}

@Override
public void mouseExited(MouseEvent me) {
    JButton event = (JButton) me.getSource();
    int i = 0;
    int j = 0;
    btn[i][j] = event;
    btn[i][j].setBackground(Color.black);

}

我尝试过btn[i+1][j].setBackground(Color.black);并设置了蓝色[1][0][2][0] ...但不是[i+1][j]

运行程序时没有错误。

Here

上图显示了我想要做的事情。

2 个答案:

答案 0 :(得分:2)

无需引用数组 - 您需要做的就是更改通过getSource()返回的按钮的状态。如,

@Override
public void mouseEntered(MouseEvent me) {
    JButton event = (JButton) me.getSource();
    event.setBackground(Color.blue);
}

和mouseExited类似。

如果你需要知道特定鼠标的i和j,那么用嵌套的for循环遍历数组,

int i = 0;
int j = 0;
for (int i2 = 0; i2 < btn.length; i2++) {
    for (int j2 = 0; j2 < btn[i2].length; j2++) {
        if (event == btn[i2][j2]) {
            i = i2;
            j = j2;
        }
    }
}

// i and j set to appropriate value

或者获取并设置按钮的客户端属性,类似于here。如果您需要更详细的帮助,请创建并发布有效的minimal example program

答案 1 :(得分:0)

您正在寻找的方法称为Component.dispatchEvent(AWTEvent e),我想出了一个一维示例:

package scratch.pad.ui;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.*;
import java.util.List;

/**
 * Propagate event to neighbor buttons
 */
public class EventPropagation extends JFrame {

    private List<JButton> buttons = new ArrayList<>();

    private class MouseEventPropagationListener extends MouseAdapter {

        // The event source, for controlling the propagation of the event.
        // To prevent infinite loop, we only dispatch the event to targets when
        // e.getSource() == this.source;
        private JButton source;

        // Targets to propagate the event.
        private java.util.List<JButton> targets;

        public MouseEventPropagationListener(JButton source, JButton ... targets) {
            this.source = source;
            this.targets = Arrays.asList(targets);
        }

        @Override
        public void mouseEntered(MouseEvent e) {
            super.mouseEntered(e);
            // Use this.source because e.getSource() could be different.
            this.source.setBackground(Color.WHITE);
            dispatchEvent(e);
        }

        @Override
        public void mouseExited(MouseEvent e) {
            super.mouseExited(e);
            this.source.setBackground(Color.BLACK);
            dispatchEvent(e);
        }

        private void dispatchEvent(MouseEvent e) {
            if (e.getSource() == source) {
                for (JButton target : targets) {
                    target.dispatchEvent(e);
                }
            }
        }
    }

    public EventPropagation() throws HeadlessException {

        final int n = 10;

        this.setTitle("Event propagation test");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.getContentPane().setLayout(new FlowLayout());

        this.setSize(300, 300);

        this.setResizable(false);

        // Create the buttons
        for (int i = 0; i < n; i++) {
            JButton btn = new JButton("Button " + i);
            btn.setBackground(Color.BLACK);
            this.buttons.add(btn);
            this.getContentPane().add(btn);
        }

        // Setup propagation:
        for (int i = 0; i < n; i++) {
            JButton btn = this.buttons.get(i);

            MouseEventPropagationListener listener = new MouseEventPropagationListener(btn, getNeighbors(i));
            btn.addMouseListener(listener);
        }
    }

    private JButton [] getNeighbors(int i) {
        List<JButton> neighbors = new ArrayList<>();

        if (i > 0) neighbors.add(this.buttons.get(i-1));
        if (i < this.buttons.size() - 1) neighbors.add(this.buttons.get(i + 1));

        return neighbors.toArray(new JButton[0]);
    }

    public static void main(String [] args) {
        EventPropagation ep = new EventPropagation();
        ep.setVisible(true);
    }
}