Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何向GridLayout中的每个元素添加鼠标侦听器?_Java_Swing_Awt - Fatal编程技术网

Java 如何向GridLayout中的每个元素添加鼠标侦听器?

Java 如何向GridLayout中的每个元素添加鼠标侦听器?,java,swing,awt,Java,Swing,Awt,我有一些代码可以创建一个彩色按钮的网格,我想将鼠标侦听器附加到其中。理想情况下,我希望程序在每次鼠标输入这些按钮中的任何一个时打印一行(例如“button entered!”) 但是,我当前的代码仅在输入网格本身时打印此消息 我的代码在这里: import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.*; import java.net.URL; public class ColorGr

我有一些代码可以创建一个彩色按钮的网格,我想将鼠标侦听器附加到其中。理想情况下,我希望程序在每次鼠标输入这些按钮中的任何一个时打印一行(例如“button entered!”)

但是,我当前的代码仅在输入网格本身时打印此消息

我的代码在这里:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import java.net.URL;

public class ColorGrid implements MouseListener {

/*
    Frame holds the panel
    Panel holds the grid framework and the toolbar
*/
JFrame frame = new JFrame();
JLabel[][] grid;
JToolBar toolbar = new JToolBar("Test");
ButtonGroup bgroup = new ButtonGroup();
JPanel panel = new JPanel();

// Example strings for default button implementations - not needed
static final private String PREVIOUS = "previous";
static final private String UP = "up";
static final private String NEXT = "next";

// holds strings that point to URL of button elements
String[] buttonPics = {"images/circle_blue.png", "images/circle_green.png", "images/circle_orange.png", "images/circle_red.png", "images/circle_yellow.png"};
Random rand = new Random();

/*
    CONSTRUCTOR

    Add buttons to the toolbar
    Set layouts for the frame and panel
    Populate grid with icons (representing buttons)

*/
public ColorGrid(int width, int length) {

    addButtons(bgroup, toolbar);

    frame.setLayout(new BorderLayout());
    panel.setLayout(new GridLayout(width, length));

    grid = new JLabel[width][length];

    panel.addMouseListener(this);

    for(int y=0; y<length; y++){

        for(int x=0; x<width; x++){

            int randomColor = rand.nextInt(5);
            ImageIcon icon = createImageIcon(buttonPics[randomColor]);

            grid[x][y] = new JLabel(icon);
            panel.add(grid[x][y]);

        }
    }

    frame.add(toolbar, BorderLayout.NORTH);
    frame.add(panel, BorderLayout.CENTER);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true); 

}

/*
    Finds URL for button images and returns it
*/
ImageIcon createImageIcon(String path) {

    URL imgURL = ColorGrid.class.getResource(path);

    if (imgURL != null) 
        return new ImageIcon(imgURL);
    else {
        System.err.println("Couldn't find file: " + path);
        return null;
    }

}

/*
    Adds buttons to the ButtonGroup and then add to Toolbar
*/
void addButtons(ButtonGroup bgroup, JToolBar toolbar) {
    JToggleButton button = null;

    //first button
    button = makeNavigationButton("circle_blue", PREVIOUS, "Back to previous something-or-other", "Previous");
    bgroup.add(button);
    toolbar.add(button);

    //second button
    button = makeNavigationButton("circle_Green", UP, "Up to something-or-other", "Up");
    bgroup.add(button);
    toolbar.add(button);

    //third button
    button = makeNavigationButton("circle_orange", NEXT, "Forward to something-or-other", "Next");
    bgroup.add(button);
    toolbar.add(button);

    button = makeNavigationButton("circle_red", NEXT, "Forward to something-or-other", "Next");
    bgroup.add(button);
    toolbar.add(button);

    button = makeNavigationButton("circle_yellow", NEXT, "Forward to something-or-other", "Next");
    bgroup.add(button);
    toolbar.add(button);

}

/*
    Called by the addButtons() method.

    Handles main button creation logic - finds the image and sets the command to the default string commands
*/
JToggleButton makeNavigationButton(String imageName, String actionCommand, String toolTipText, String altText) {
    //Look for the image.
    String imgLocation = "images/"
                         + imageName
                         + ".png";
    URL imageURL = ColorGrid.class.getResource(imgLocation);

    //Create and initialize the button.
    JToggleButton button = new JToggleButton();
    button.setActionCommand(actionCommand);
    button.setToolTipText(toolTipText);

    if (imageURL != null) {                      //image found
        button.setIcon(new ImageIcon(imageURL, altText));
    } else {                                     //no image found
        button.setText(altText);
        System.err.println("Resource not found: "
                           + imgLocation);
    }

    return button;
}

public void mouseEntered(MouseEvent e) {

    JPanel panel = (JPanel) getComponentAt(e.getPoint());

    if (panel != null) {
        System.out.println("Button entered!");
    }
}

public void mousePressed(MouseEvent e) {
    System.out.println("Mouse pressed!");
}

public void mouseReleased(MouseEvent e) {
    System.out.println("Mouse released!");
}

public void mouseExited(MouseEvent e) {
    System.out.println("Mouse exited!");
}

public void mouseClicked(MouseEvent e) {
    System.out.println("Mouse clicked!");
}


public static void main(String[] args) {
    new ColorGrid(4,4);//makes new ButtonGrid with 2 parameters
}

}
import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
导入java.util.*;
导入java.net.URL;
公共类ColorGrid实现MouseListener{
/*
框架固定面板
面板包含网格框架和工具栏
*/
JFrame=新JFrame();
JLabel[][]网格;
JToolBar工具栏=新的JToolBar(“测试”);
ButtonGroup bgroup=新建ButtonGroup();
JPanel面板=新的JPanel();
//默认按钮实现的示例字符串-不需要
静态最终私有字符串PREVIOUS=“PREVIOUS”;
静态最终私有字符串UP=“UP”;
静态最终私有字符串NEXT=“NEXT”;
//保存指向按钮元素URL的字符串
String[]buttonPics={“images/circle\u blue.png”、“images/circle\u green.png”、“images/circle\u orange.png”、“images/circle\u red.png”、“images/circle\u yellow.png”};
Random rand=新的Random();
/*
建造师
将按钮添加到工具栏
设置框架和面板的布局
用图标(代表按钮)填充网格
*/
公共颜色网格(整数宽度、整数长度){
添加按钮(b组、工具栏);
frame.setLayout(新的BorderLayout());
panel.setLayout(新网格布局(宽度、长度));
网格=新的JLabel[宽度][长度];
panel.addMouseListener(本);
对于(inty=0;y你做得很好

panel.addMouseListener(this);
试着把它改成

button.addMouseListener(this); 
addButtons
方法中,您做得很好

panel.addMouseListener(this);
试着把它改成

button.addMouseListener(this); 
addButtons
方法中

我不确定您的意思是“按钮”,因为您要添加到
GridLayout
的唯一内容是
JLabel
s

但基本上,您需要为每个组件单独注册一个
鼠标侦听器
,例如

for(int y=0; y<length; y++){

    for(int x=0; x<width; x++){

        int randomColor = rand.nextInt(5);
        ImageIcon icon = createImageIcon(buttonPics[randomColor]);

        grid[x][y] = new JLabel(icon);
        grid[x][y].addMouseListener(this);
        panel.add(grid[x][y]);

    }
}
for(int y=0;y我不确定您的意思是“按钮”,因为您要添加到
GridLayout
的唯一内容是
JLabel
s

但基本上,您需要为每个组件单独注册一个
鼠标侦听器
,例如

for(int y=0; y<length; y++){

    for(int x=0; x<width; x++){

        int randomColor = rand.nextInt(5);
        ImageIcon icon = createImageIcon(buttonPics[randomColor]);

        grid[x][y] = new JLabel(icon);
        grid[x][y].addMouseListener(this);
        panel.add(grid[x][y]);

    }
}

for(int y=0;y如果要测试鼠标是否输入按钮,请将ChangeListener添加到按钮的ButtonModel并测试
isRollover()
如果要测试鼠标是否输入按钮,请将ChangeListener添加到按钮的ButtonModel并测试
isRollover()

不,如果你想使用带有AbstractButton或其子类的MouseStener,这是非常罕见的。请听按钮的模型,当然,但是MouseStener——几乎没有。不,如果你想使用带有AbstractButton或其子类的MouseStener,这是非常罕见的。请听按钮的模型是的,但是MouseListener——几乎从来没有。