2017-03-03 18 views
1

嘿傢伙這裏的交易我想用java創建一個簡單的國際象棋遊戲。我有一個JButton [8] [8]陣列的板子。我爲每個新的SquareListener分配一個擴展BoardListner的類,它是一個實現Action Listener的超類。我想記錄當前正在按下的按鈕是否等於按下的最後一個按鈕。我存儲在超類中按下的JButton實例,並在SqaureListener actionPerformed方法中引用該實例。這裏是我爲按鈕創建的類的示例。記錄在JButtons網格中按下的最後一個JButton

public class SquareListener extends BoardListener { 
private int row; 
private int column; 


public SquareListener(int row, int column){ 
    this.setRow(row); 
    this.setColumn(column); 
} 

@Override 
public void actionPerformed(ActionEvent ae){ 
    JButton buttonPressed = (JButton) ae.getSource(); 
    if(buttonPressed == super.lastButtonPressed){ 
     System.out.println("This is the button you last pressed"); 
    }else{ 
     System.out.println("This is a new button"); 
    } 
    super.lastButtonPressed = buttonPressed; 
} 

,這裏是我在哪裏存儲isSelecting數據

超類
public class BoardListener implements ActionListener { 

    private boolean isSelectingInsteadOfTargeting = true; 
    JButton lastButtonPressed = new JButton(); 

    @Override 
    public void actionPerformed(ActionEvent arg0) { 
    // TODO Auto-generated method stub 
    } 

    public boolean isSelectingInsteadOfTargeting() { 
     return isSelectingInsteadOfTargeting; 
    } 

    public void setSelectingInsteadOfTargeting(boolean isSelectingInsteadOfTargeting) { 
    this.isSelectingInsteadOfTargeting = isSelectingInsteadOfTargeting; 
    } 

} 

我希望每一個按鈕按下時有一個按鈕傳入的實例時間buttonPressed和比較BoardListener中存儲了什麼,然後打印出來然後將buttonPressed分配給超級成員。相反,我得到的行爲是,如果我按下按鈕一次,它總是會返回「這是您最後按下的按鈕」,即使我之間按下了一個新按鈕。我正在做這件事的方式有什麼問題嗎?有沒有更簡單的方法?

這裏是我保存按鈕,並指定他們的動作偵聽

public Board(boolean _isWhite){ 
    gui = new JPanel(new GridLayout(8,8)); 
    chessBoardSquares = new Square[8][8]; 
    boolean shouldBeWhite = true; 
    for(int i = 0; i < 8; i++){ 
     for(int j= 0; j < 8; j++){ 
      Square square = new Square(i,j); 
      square.getButton().addActionListener(new SquareListener(i,j)); 
      if(shouldBeWhite){ 
       square.getButton().setBackground(Color.WHITE); 
       shouldBeWhite = false; 
      }else{ 
       square.getButton().setBackground(Color.BLACK); 
       shouldBeWhite = true; 
      } 
      if (j == 7){ 
       shouldBeWhite = !shouldBeWhite; 
      } 
      chessBoardSquares[i][j] = square; 
      gui.add(chessBoardSquares[i][j].getButton()); 
     } 
    } 
    BoardFactory boardFactory = new BoardFactory(); 
    if(_isWhite){ 
     updateBoardIconsBasedOnCurrentBoardArray(boardFactory.getBlackStartArray()); 
    }else{ 
     //getblack start array and invoke method to change button icons based on array 
    } 
} 
+0

您可以添加將註冊聽衆註冊到您的按鈕的代碼。我懷疑你每個按鈕都有64個不同的監聽器。在這種情況下,我認爲應該有一個Board類,它可以將最近和以前的按鈕點擊作爲一個靜態變量。 – emeraldjava

+0

剛剛添加它,讓我知道你的想法我顯然有一些其他的補充課,但你可以從這 –

回答

3

每個按鈕都有自己的監聽器,並且每個偵聽器都有自己的lsstButonPressed場額外的代碼,使之無法正常工作。

對所有按鈕使用相同的聽衆實例或存儲板上按下的最後一個按鈕(或所有聽衆共享的另一個對象中)。

此外,您不需要super來訪問lastButtonPressed。

JButton lastButtonPressed = new JButton(); 

白白創建一個新的JButton。只需將該字段留空即可。

+0

獲得要點我應該使用板類中的靜態字段來存儲全局點擊數據? –

+0

否。非靜態實例字段將是一個更好的主意。 –

+0

好吧,但我碰到的問題是如何爲每個按鈕有一個單獨的動作偵聽器,但讓他們實際上改變我實例化在主要的董事會對象。如果它是一個非靜態實例字段,動作偵聽器如何操作主方法之外的那些字段? –

4

我們不需要8 x 8的整個網格,但可能是2 x 2,可以由您縮放到8 x 8。

該代碼比較單擊按鈕的最後一個座標。

您可以使用您的所有按鈕的單個ActionListener ...

例如:

import java.awt.BorderLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class TwiceButtonPressed { 

    private JFrame frame; 

    private JButton[][] buttons; 

    private JLabel label; 
    private JLabel sameButtonLabel; 

    private JPanel pane; 

    private boolean sameButtonPressed; 

    private static final int rows = 2; 
    private static final int cols = 2; 

    private int buttonRow = -1; 
    private int buttonCol = -1; 

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

    public void createAndShowGui() { 
     frame = new JFrame(getClass().getSimpleName()); 

     sameButtonPressed = false; 

     label = new JLabel("Button pressed: NONE"); 
     sameButtonLabel = new JLabel("Same button pressed: " + sameButtonPressed); 

     pane = new JPanel(); 
     pane.setLayout(new GridLayout(rows, cols)); 

     buttons = new JButton[rows][cols]; 

     for (int i = 0; i < rows; i++) { 
      for (int j = 0; j < cols; j++) { 
       buttons[i][j] = new JButton(i + "" + j); 
       buttons[i][j].addActionListener(listener); 
       pane.add(buttons[i][j]); 
      } 
     } 

     frame.add(sameButtonLabel, BorderLayout.NORTH); 
     frame.add(pane, BorderLayout.CENTER); 
     frame.add(label, BorderLayout.SOUTH); 

     frame.pack(); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    public ActionListener listener = new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      for (int i = 0; i < rows; i++) { 
       for (int j = 0; j < cols; j++) { 
        if (e.getSource().equals(buttons[i][j])) { 
         label.setText("Button pressed: " + buttons[i][j].getText()); 
         System.out.println(buttonRow + "==" + i + "***" + buttonCol + "==" + j); 
         if (buttonRow == i && buttonCol == j) { 
          sameButtonPressed = true; 
         } else { 
          sameButtonPressed = false; 
         } 
         sameButtonLabel.setText("Same button pressed: " + sameButtonPressed); 
         buttonRow = i; 
         buttonCol = j; 
        } 
       } 
      } 
     } 
    }; 
} 

enter image description here

此外,您可能你的白/黑算法改變這樣的事情:

for (int i = 0; i < rows; i++) { 
    for (int j = 0; j < cols; j++) { 
     buttons[i][j] = new JButton() { 
      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(50, 50); 
      } 
     }; 
     buttons[i][j].addActionListener(listener); 
     if (i % 2 == 0) { 
      if (j % 2 == 0) { 
       buttons[i][j].setBackground(Color.BLACK); 
      } else { 
       buttons[i][j].setBackground(Color.WHITE); 
      } 
     } else { 
      if (j % 2 != 0) { 
       buttons[i][j].setBackground(Color.BLACK); 
      } else { 
       buttons[i][j].setBackground(Color.WHITE); 
      } 
     } 
     pane.add(buttons[i][j]); 
    } 
} 

enter image description here

+0

感謝您的回答,這真的很有幫助,您認爲我的白/黑算法效率低下/錯誤?我認爲它工作良好。對於我可能在未來寫出的更難算法,這種心態是否有害? –

+0

@BrendanRobert並不認爲它是無用的,但很難理解/閱讀。它和我的一樣,我只是告訴你另一種方式。我希望能幫助你:) – Frakcool

相關問題