2017-06-13 26 views
0

所以情況是,我正在做一個面板充滿8 * 8按鈕,就像一個矩陣,我將不得不改變具體的按鈕文本取決於位置的點擊按鈕。這似乎是一個好主意,讓我自己的JButton,我可以分配X和Y索引的按鈕,所以我可以輕鬆檢查按鈕被索引點擊。 下面是該代碼:擴展JButton不會出現,直到鼠標在

import javax.swing.JButton; 

public class MatrixButton extends JButton { 
    private int x; 
    private int y; 

    public MatrixButton(int x, int y, String text){ 
     super(text); 
     this.x = x; 
     this.y = y; 
    } 

    public int getX() { 
     return x; 
    } 
    public int getY() { 
     return y; 
    } 
} 

而且它確實解決了任務,但這些矩陣按鍵不希望出現,直到我的鼠標超過他們。可能是什麼問題呢?

這裏是面板至極的代碼包含這些按鈕和處理他們的行動:

public class PlayField extends JPanel implements ActionListener { 
    private MatrixButton[][] button = new MatrixButton[8][8]; 

    public PlayField(){ 
     Random rand = new Random(); 

     setLayout(new GridLayout(8, 8)); 

     for (int i = 0; i < 8; ++i){ 
      for (int j = 0; j < 8; ++j){ 
       button[i][j] = new MatrixButton(j, i, "" + rand.nextInt(80)); 
       button[i][j].addActionListener(this); 

       add(button[i][j]); 
      } 
     } 
    } 

    private String incrementText(MatrixButton mb){ 
     return "" + (Integer.parseInt(mb.getText()) + 1); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e){ 
     MatrixButton mb = (MatrixButton)e.getSource(); 

     for (int i = mb.getY(); i >= 0; --i){ 
      button[i][mb.getX()].setText(incrementText(button[i][mb.getX()])); 
     } 
     for (int i = 0; i < 8; ++i){ 
      if (i != mb.getX()) 
      button[mb.getY()][i].setText(incrementText(button[mb.getY()][i])); 
     } 
    } 
} 

PS:如果我填補他們出現,因爲他們應該是普通Jbutton將。這就是爲什麼我很困惑,因爲我沒有在JButton擴展上做太多改變,只是增加了2個變量。

回答

4

這是危險的代碼:

public int getX() { 
    return x; 
} 
public int getY() { 
    return y; 
} 

你要明白,這個覆蓋兩個幫助設置GUI上的按鈕放置JButton的批評方法(實際上,該方法是從JButton的母公司的JComponent) (在方法的上面添加@Override以查看這是如此)。我強烈建議您更改這些方法的簽名,可能是getGridX()getGridY(),或者更好,使用組合而不是繼承,因爲遇到這些類型的問題的風險 - 無意中覆蓋一個關鍵方法 - 當您擴展複雜類,如Swing組件類。出於這個原因,我儘量避免擴展這些類,除非絕對需要

例如:

import java.awt.GridLayout; 
import java.awt.event.*; 
import java.util.Random; 

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

public class PlayField { 
    private static final int ROWS = 8; 
    private static final int COLS = ROWS; 
    private static final int MAX_RAND = 80; 
    private JPanel mainPanel = new JPanel(); 
    private MatrixButton[][] button = new MatrixButton[ROWS][COLS]; 

    public PlayField(){ 
     Random rand = new Random(); 
     mainPanel.setLayout(new GridLayout(ROWS, COLS)); 
     for (int i = 0; i < ROWS; ++i){ 
      for (int j = 0; j < COLS; ++j){ 
       button[i][j] = new MatrixButton(j, i, rand.nextInt(MAX_RAND)); 
       button[i][j].addActionListener(new MyMatrixListener(i, j)); 
       mainPanel.add(button[i][j].getButton()); 
      } 
     } 
    } 

    private class MyMatrixListener implements ActionListener { 
     private int i; 
     private int j; 

     public MyMatrixListener(int i, int j) { 
      this.i = i; 
      this.j = j; 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      for (int i2 = 0; i2 < button.length; i2++) { 
       if (i2 != i) { 
        int value = button[i2][j].getValue(); 
        value++; 
        button[i2][j].setValue(value); 
       } 
      } 
      for (int j2 = 0; j2 < button[i].length; j2++) { 
       if (j2 != j) { 
        int value = button[i][j2].getValue(); 
        value++; 
        button[i][j2].setValue(value); 
       } 
      } 
     } 
    } 

    public JPanel getMainPanel() { 
     return mainPanel; 
    } 

    private static void createAndShowGui() { 
     JFrame 
     frame = new JFrame("PlayField"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new PlayField().getMainPanel()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

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

class MatrixButton { 
    private int column; 
    private int row; 
    private JButton button = new JButton(); 
    private int value; 

    public MatrixButton(int column, int row, int value) { 
     this.column = column; 
     this.row = row; 
     setValue(value); 
    } 

    public void addActionListener(ActionListener listener) { 
     button.addActionListener(listener); 
    } 

    public int getColumn() { 
     return column; 
    } 

    public int getRow() { 
     return row; 
    } 

    public JButton getButton() { 
     return button; 
    } 

    public int getValue() { 
     return value; 
    } 

    public final void setValue(int value) { 
     this.value = value; 
     button.setText("" + value); 
    } 
} 

最好只使用整數,而不是字符串

+0

恩的感謝,它actualy覆蓋它,這聽起來不錯,謝謝你的提醒。我試圖把一個新的類作爲一個組合,但作爲一個組合,我只能將這個類的JButton組件添加到JPanel中,然後我無法再訪問這個類的索引。或者我錯了? – geri

+0

@geri:檢查編輯。你可以使用適當的方法來獲取任何東西,比如getter方法。 –

+0

感謝您的幫助。我真的很感謝它,主要問題是我重寫了getX和getY方法,我改變了方法名稱,在我的原始JButton擴展中出現。而這個代碼對於最終的解決方案來說是一個很大的幫助。謝謝:) – geri