有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我正在尝试向我创建的每个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;
}

正如你所看到的,瓷砖的数量从来都不一样,这就是为什么我不能手动创建它们;我有一个循环

我把它们画成这样:

  protected void paintComponent(Graphics g) {
    super.paintComponent(g);

    this.removeAll();

    for (JLabel i : createTiles()) {

        g.setColor(tileColours[activeColourIndex]);
        g.fillRoundRect(i.getX(), i.getY(), i.getWidth(), i.getHeight(), 20, 20);
        this.add(i);
    }

    revalidate();
}

它是有效的,问题是我的鼠标听筒根本不起作用。我尝试过调试,但从未使用过mouseClick方法

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


共 (1) 个答案

  1. # 1 楼答案

    你不需要在你的paintComponent里一遍又一遍地创建JLabel。创建一次,并不断重复使用标签列表进行更新。我能够创建一个有效的示例,它似乎运行良好

    鼠标处理器也在工作

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

    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();
            });
        }
    
    }
    

    希望这有帮助