【问题标题】:Java multiple buttons coordinatesJava多按钮坐标
【发布时间】:2012-03-22 09:09:58
【问题描述】:

我是 Java 新手。

我正在制作地雷。我正在使用带有参数(x_length,y_length)的GridLayout。我想知道我按下了哪个按钮->他的坐标(x,y)。但是,如果我将它输入到侦听器中,它会给我错误-> 将“x”的修饰符更改为 final。 所以我的问题是如何简单地获取按钮的坐标?

我还想问一下如何简单地更改按钮的大小? setSize 对我不起作用。

    for (int y = 0; y < y_length; y++)
    {
        for (int x = 0; x < x_length; x++)
        {               
            buttons[x][y] = new JButton("X");

            buttons[x][y].addMouseListener(new MouseAdapter()
            {
                public void mouseClicked(MouseEvent e)
                {
                    if (e.getButton() == MouseEvent.BUTTON1)
                    {
                        //exception -> Cannot refer to a non-final variable x inside an inner class defined in a different method
                        JOptionPane.showMessageDialog(null, "Left -> " + x + " | " + y);
                    }
                    else if (e.getButton() == MouseEvent.BUTTON3)
                    {
                        JOptionPane.showMessageDialog(null, "Right -> " + x + " | " + y);
                    }
                }
            });
            mines_array.add(buttons[x][y]);
        }
    }

【问题讨论】:

  • 1) 为了尽快获得更好的帮助,请发帖 SSCCE。 2)最好每个..question问一个问题。 3) 布局管理器通常会尊重组件的首选大小而不是大小。 4) 请复制/粘贴错误消息和异常输出并在其上使用代码格式。 5) ActionListener 可能更适合此 GUI 中的按钮。它有什么作用?
  • 你不能让 x 和 y final 因为它们在循环中不断变化。你可以做什么(但这是一个丑陋的黑客,这就是为什么我不把它作为答案),在嵌套循环中放置一个声明:final int x2 = x; final int y2=y 并参考x2y2在你的听众里面。 ActionListener更合适,设置preferredSize而不是大小,就像Andrew刚才说的那样。

标签: java swing listener coordinates jbutton


【解决方案1】:

您应该首先为您的侦听器创建一个自定义类而不是匿名类,因为它需要参数(x 和 y)。

private static class ButtonMouseListener extends MouseAdapter {
    private final int x;
    private final int y;

    public ButtonMouseListener(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public void mouseClicked(MouseEvent e) {
        if (e.getButton() == MouseEvent.BUTTON1) {
            JOptionPane.showMessageDialog(null, "Left -> " + x + " | " + y);
        }  else if (e.getButton() == MouseEvent.BUTTON3) {
            JOptionPane.showMessageDialog(null, "Right -> " + x + " | " + y);
        }
    }
}

然后,您可以像这样使用您的代码:

for (int y = 0; y < y_length; y++) {
    for (int x = 0; x < x_length; x++) {               
        buttons[x][y] = new JButton("X");
        buttons[x][y].addMouseListener(new ButtonMouseListener(x, y));
        mines_array.add(buttons[x][y]);
    }
}

就是这样,玩得开心。 关于按钮的大小,如果您在其父容器中使用布局,其大小将由布局自动计算,并且无法通过 setSize() 更改。

【讨论】:

    【解决方案2】:
    1. 矿山最好使用JToggleButtons

    2. 放在那里ClientProperty

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多