Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.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 向使用paintComponent方法绘制的组件添加鼠标侦听器_Java_Jlabel_Paintcomponent_Mouselistener - Fatal编程技术网

Java 向使用paintComponent方法绘制的组件添加鼠标侦听器

Java 向使用paintComponent方法绘制的组件添加鼠标侦听器,java,jlabel,paintcomponent,mouselistener,Java,Jlabel,Paintcomponent,Mouselistener,我正在尝试向我创建的每个Jlabel添加一个鼠标侦听器,然后将它们传递到 油漆组件 private List<JLabel> createTiles (){ int x = 10; int y = 0; List<JLabel> tiles = new ArrayList<>(); //Number of tiles painted for (Integer i : gameModelHandle.numbers

我正在尝试向我创建的每个Jlabel添加一个鼠标侦听器,然后将它们传递到 油漆组件

  private List<JLabel> createTiles (){

    int x = 10;
    int y = 0;
    List<JLabel> tiles = new ArrayList<>();

    //Number of tiles painted
    for (Integer i : gameModelHandle.numbersToDigits()) {

        JLabel tile = new JLabel("" + i, JLabel.CENTER);
        tile.setSize(new Dimension(140, 140));
        tile.setFont(tile.getFont().deriveFont(45f));
        tile.setLocation(x, y);
        tile.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {

                GameModel.currentSum(i);
                changeColour();
            }

            @Override
            public void mouseReleased(MouseEvent e) {

                if (getBounds().intersects(tile.getBounds())){

                    int number = gameModelHandle.combineDigits(i, Integer.parseInt(tile.getText()));
                    GameModel.currentSum(number);
                }
            }
        });

        tiles.add(tile);
        x+=150;
    }
    return tiles;
}
它是有效的,问题是我的鼠标听筒根本不起作用。我尝试过调试,但从未使用过mouseClick方法


如有任何意见或指导,将不胜感激

您不需要在
paintComponent
内部反复创建
JLabel
s。创建一次,并继续重复使用标签列表进行更新。我能够创建一个工作示例,它似乎工作得很好

鼠标处理程序也在工作

这是我的。看一看。我不得不删除不必要的部分,调整代码以编译并启动和运行它

public class PaintComponentMouseListener extends JPanel {
    private static final long serialVersionUID = -4235693652966961963L;
    private List<JLabel> tiles;

    private List<JLabel> createTiles() {
        if(tiles == null) {
            tiles = new ArrayList<>();
            int x = 10;
            int y = 0;

            // Number of tiles painted
            for(int i=1;i<=9;i++) {
                String btn = "" + i;
                JLabel tile = new JLabel(btn, JLabel.CENTER);
                tile.setSize(new Dimension(140, 140));
                tile.setFont(tile.getFont().deriveFont(45f));
                tile.setLocation(x, y);
                tile.addMouseListener(new MouseAdapter() {
                    @Override
                    public void mouseClicked(MouseEvent e) {
                        System.out.println("Clicked on button: " + btn);
                    }
                });

                tiles.add(tile);
                x += 150;
            }
        }
        return tiles;
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        this.removeAll();
        for (JLabel i : createTiles()) {
            g.setColor(Color.CYAN);
            g.fillRoundRect(i.getX(), i.getY(), i.getWidth(), i.getHeight(), 20, 20);
            this.add(i);
        }

        revalidate();
    }

    private void start() {
        JFrame frame = new JFrame("Hello");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        this.setLayout(new GridLayout(3, 3));
        frame.setContentPane(this);
        frame.setSize(500, 500);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(()->{
            new PaintComponentMouseListener().start();
        });
    }

}
公共类PaintComponentMouseListener扩展了JPanel{
私有静态最终长SerialVersionId=-4235693652966961963L;
私人名单瓷砖;
私有列表createTiles(){
if(tiles==null){
tiles=新的ArrayList();
int x=10;
int y=0;
//上漆瓷砖的数量
对于(int i=1;i{
新的PaintComponentMouseListener().start();
});
}
}

希望这有帮助

public class PaintComponentMouseListener extends JPanel {
    private static final long serialVersionUID = -4235693652966961963L;
    private List<JLabel> tiles;

    private List<JLabel> createTiles() {
        if(tiles == null) {
            tiles = new ArrayList<>();
            int x = 10;
            int y = 0;

            // Number of tiles painted
            for(int i=1;i<=9;i++) {
                String btn = "" + i;
                JLabel tile = new JLabel(btn, JLabel.CENTER);
                tile.setSize(new Dimension(140, 140));
                tile.setFont(tile.getFont().deriveFont(45f));
                tile.setLocation(x, y);
                tile.addMouseListener(new MouseAdapter() {
                    @Override
                    public void mouseClicked(MouseEvent e) {
                        System.out.println("Clicked on button: " + btn);
                    }
                });

                tiles.add(tile);
                x += 150;
            }
        }
        return tiles;
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        this.removeAll();
        for (JLabel i : createTiles()) {
            g.setColor(Color.CYAN);
            g.fillRoundRect(i.getX(), i.getY(), i.getWidth(), i.getHeight(), 20, 20);
            this.add(i);
        }

        revalidate();
    }

    private void start() {
        JFrame frame = new JFrame("Hello");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        this.setLayout(new GridLayout(3, 3));
        frame.setContentPane(this);
        frame.setSize(500, 500);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(()->{
            new PaintComponentMouseListener().start();
        });
    }

}