2013-05-14 4 views
0

Когда я устанавливаю значения X и Y для моего массива JButton s, я возвращаю правильные значения, умноженные на 93. Я могу решить проблему, разделив значение на 93, но я скорее узнает, где ошибка была в первую очередь.Java продолжает давать мне мои координаты, умноженные на 93

У меня есть два класса кода, один для реальной программы, и один для объекта кнопки вместе с координатами.

Вот код:

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 
import java.awt.GridLayout; 
import java.io.*; 
public class ConnectFour implements ActionListener 
{ 
    JFrame frame = new JFrame(); 
    Button [][] buttons = new Button[6][7]; 
    public ConnectFour() 
    { 
     frame.setSize(700,600); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLayout(new GridLayout(6,7)); 
     frame.setLocationRelativeTo(null); 
     frame.setTitle("Connect Four"); 
     for(int filler = 0; filler <= 5; filler++) 
     { 
       for(int filler2 = 0; filler2 <= 6; filler2++) 
       { 
        buttons[filler][filler2] = new Button(); 
        buttons[filler][filler2].setX(filler2); 
        buttons[filler][filler2].setY(filler); 
        //System.out.println(buttons[filler][filler2].getX()); 
        //System.out.print(buttons[filler][filler2].getY()); 
        frame.add(buttons[filler][filler2].button); 
        buttons[filler][filler2].button.addActionListener(this); 
       } 
     } 
     frame.setVisible(true); 
    } 
    public void actionPerformed(ActionEvent a) 
    { 
     JButton pressedButton = (JButton)a.getSource(); 
     System.out.print(pressedButton.getY()/93); 
     System.out.print(pressedButton.getX()/93); 
    } 
    public static void main(String args[]) 
    { 
      ConnectFour gameplay = new ConnectFour(); 
    } 
} 

Вот Button класс:

import javax.swing.JButton; 
public class Button 
{ 
    JButton button; 
    private int x = 0; 
    private int y = 0; 
    public Button() 
    { 
     button = new JButton(); 
    } 
    public int getX() {return x;} 
    public int getY() {return y;} 
    public void setX(int xIndex) 
    { 
     x = xIndex; 
    } 
    public void setY(int yIndex) 
    { 
     y = yIndex; 
    } 
} 
+1

Я предполагаю, что это сводится к размеру кнопок быть 93 точек .. –

ответ

1

Вы смешиваете свои два класса Button.

В этой строке вы добавляете ActionListener к Button.button:

buttons[filler][filler2].button.addActionListener(this); 

потому что JButton также имеет методы getX и getY, вы можете назвать их. Когда вы делаете:

pressedButton.getX() 

вы получаете x положение JButton, а не вашего Button.

То, что я думаю, что было бы самым простым способом решить эту проблему делает ваша кнопка расширить JButton и переименовать x и y в row и column, например:

public class Button extends JButton { 
    private int row = 0; 
    private int column = 0; 

    public Button(int row, int column) { 
     super(); 

     this.row = row; 
     this.column = column;  
    } 
    public int getRow() {return row;} 
    public int getColumn() {return column;} 
} 

Вы можете создавать свои кнопки, как

for(int filler = 0; filler <= 5; filler++) { 
    for(int filler2 = 0; filler2 <= 6; filler2++) { 
     buttons[filler][filler2] = new Button(filler2, filler); 
     frame.add(buttons[filler][filler2]); 
     buttons[filler][filler2].addActionListener(this); 
    } 
} 

И использовать их в качестве ActionListener

public void actionPerformed(ActionEvent a) { 
    Button pressedButton = (Button)a.getSource(); 
    System.out.print(pressedButton.getColumn()); 
    System.out.print(pressedButton.getRow()); 
} 
0

Я думаю, что х и у определены в суперкласса, попробуйте изменить имена переменных к чему-то еще. например

private int myX = 0; 
private int myY = 0; 
+1

'Button' не имеет суперкласса, он использует композицию, а не наследование –

+0

о да. Тогда getX на JButton не имеет ничего общего с get и устанавливается в пользовательском классе Button и, следовательно, не будет того же значения. Вероятно, вам нужна хэшмап из JButton -> Button, чтобы вы могли использовать источник события для поиска объекта модели (Button) –

1

Я не мог понять, как это сделать, используя ваш пример композиции, но этот работает так, как вы, возможно, захотите.

import javax.swing.*; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 
import java.awt.GridLayout; 
import java.io.*; 

public class ConnectFour implements ActionListener 
{ 
    JFrame frame = new JFrame(); 
    CustomButton [][] buttons = new CustomButton[6][7]; 

    public ConnectFour() 
    { 
     frame.setSize(700,600); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLayout(new GridLayout(6,7)); 
     frame.setLocationRelativeTo(null); 
     frame.setTitle("Connect Four"); 
     for(int filler = 0; filler <= 5; filler++) 
     { 
      for(int filler2 = 0; filler2 <= 6; filler2++) 
      { 
       buttons[filler][filler2] = new CustomButton(filler,filler2); 
       frame.add(buttons[filler][filler2]); 
       buttons[filler][filler2].addActionListener(this); 
      } 
     } 
     frame.setVisible(true); 
    } 

    public void actionPerformed(ActionEvent a) 
    { 
     CustomButton pressedButton = (CustomButton)a.getSource(); 
     System.out.println(pressedButton.getRow() + "/" + pressedButton.getCol()); 
    } 

    public static void main(String args[]) 
    { 
     ConnectFour gameplay = new ConnectFour(); 
    } 
} 

class CustomButton extends JButton 
{ 
    private int row = 0; 
    private int col = 0; 

    public CustomButton(int row, int col) 
    { 
     this.row = row; 
     this.col = col; 
    } 

    public int getRow() {return row;} 
    public int getCol() {return col;} 

    public void setRow(int row) 
    { 
     this.row = row; 
    } 

    public void setCol(int col) 
    { 
     this.col = col; 
    } 
} 
+0

wow, даже наши имена переменных одинаковы :) –

+1

+1 ..... aaach half_sized without 'get/putClientProperty', причина от 2-3 недель insomnias – mKorbel

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