2012-03-22 4 views
1

Я новичок в Java.Координаты нескольких кнопок Java

Я делаю мин. Я использую GridLayout с параметрами (x_length, y_length). Я хотел бы знать, какую кнопку я нажал -> его координаты (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]); 
     } 
    } 
+0

1) Для лучшей помощи раньше, опубликовать [SSCCE] (http://sscce.org/). 2) Лучше всего задать один вопрос на вопрос. 3) Менеджер компоновки, как правило, соблюдает предпочтительный размер компонента по размеру. 4) Скопируйте/вставьте сообщения об ошибках и вывод исключений и используйте на нем форматирование кода. 5) Возможно, что «ActionListener» лучше подходит для кнопок в этом графическом интерфейсе. Что оно делает? –

+0

Вы не можете делать x и y 'final', поскольку они постоянно меняются в цикле. Что вы можете сделать (но это уродливый взлом, поэтому я не ставил его как ответ), помещается внутри вложенного цикла объявление: 'final int x2 = x; final int y2 = y' и ссылаются на 'x2' и' y2' внутри вашего слушателя. «ActionListener» более подходит и задает предпочтительный размер вместо размера, как сказал Эндрю. –

ответ

2

Вы должны сначала создать пользовательский класс для вместо вашего слушателя анонимный один, так как он нуждается параметров (х и у).

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().

Смежные вопросы