2015-05-28 20 views
1

我正在使用遞歸方法在用戶鍵入的Boggle板上對JButton進行着色。例如,如果單詞「CAT」用作單詞參數,則該方法將搜索按鈕[] []數組以找到其旁邊具有「A」並且在其旁邊具有「T」的「C」,並且將相應的按鈕顏色變爲橙色並返回true。但是,我的代碼存在像CATATATAT這樣的字也會返回true的問題,因爲我的代碼無意中允許重用按鈕。遞歸和/或getBackground()不能按預期工作

問題是我在檢查JButton是否已被使用(已經着色爲橙色)時遇到問題。當我在遞歸方法中使用getBackground()時,我發現JButtons仍然是默認的白色,即使它們在視覺上是橙色的。有關如何檢測JButton已被使用(已着色爲橙色)的任何想法?

JButton[][] buttons = new JButton[4][4]; 
Color orange = new Color(245, 130, 32); 

承擔的JButton陣列充滿了新的按鈕隨機字母每個

public boolean findWord(String word) { 
    clearButtons(); 
    for (int row = 0; row < length; row++) { 
     for (int col = 0; col < length; col++) { 
      if (findWord(word, row, col)) { 
       System.out.println(""); 
       return true; 
      } 
     } 
    } 
    return false; 
} 

private boolean findWord(String word, int row, int col) { 

    if(word.equals("")) { 
     return true; 
    } 


    if (row < 0 || row >= length || 
      col < 0 || col >= length || 
      !(buttons[row][col].getText().equals(word.substring(0,1))) || 
      buttons[row][col].getBackground().equals(orange) // <- always is false 
       ) { 
     return false; 
    } 


     String rest = word.substring(1, word.length()); 

     boolean letter = 
       findWord(rest, row-1, col-1) || 
       findWord(rest, row-1, col) || 
       findWord(rest, row-1, col+1) || 
       findWord(rest, row, col-1) || 
       findWord(rest, row, col+1) || 
       findWord(rest, row+1, col-1) || 
       findWord(rest, row+1, col) || 
       findWord(rest, row+1, col+1); 

     if(letter) { 
      buttons[row][col].setBackground(orange); // <- despite this 
     } 
     return letter; 
} 

我試圖削減方案,儘可能以使其可以運行。只需在重複單詞部分的文本區域輸入內容即可。 下面是一個完整的可運行版本:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.UIManager.LookAndFeelInfo; 
import javax.swing.text.JTextComponent; 

public class BoggleGame extends JFrame implements ActionListener, KeyListener { 
private static final long serialVersionUID = -3125864417227564060L; 
String[] wordArray = new String[0]; 
static String username; 
int length = 4; 
public JTextArea searchTextArea = new JTextArea(0,12); 
DefaultListModel wordListModel= new DefaultListModel(); 
JButton[][] buttons = new JButton[length][length]; 
JList wordList = new JList(wordListModel); 
JScrollPane wordScrollPane = new JScrollPane(wordList); 
JPanel northPanel = new JPanel(); 
JPanel timePanel = new JPanel(); 
JPanel usernamePanel = new JPanel(); 
JPanel southPanel = new JPanel(); 
JPanel centerPanel = new JPanel(); 
JPanel eastPanel = new JPanel(); 
ImageIcon logo = new ImageIcon(getClass().getResource("logo.png")); 
Color white = new Color(255,255,255); 
Color blue = new Color(0,150 ,240); 
Color orange = new Color(245, 130, 32); 
Color dark_orange = new Color(180, 117 , 70); 

public static void main(String[] arguments){   
    new BoggleGame(); 
} 


public BoggleGame(){ 
    // Set Title 
    super(""); 

    // Set up Frame 
    setResizable(false); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    // Set Layout 
    getContentPane().setLayout(new BorderLayout()); 
    nimbusLookAndFeel(); 

    // North Panel 
    northPanel.setLayout(new GridLayout(1,3)); 
    northPanel.setPreferredSize(new Dimension(550,100)); 
    northPanel.setBackground(blue); 
    // Username Panel 
    usernamePanel.setLayout(new FlowLayout(FlowLayout.LEFT)); 
    usernamePanel.setBackground(blue); 
    JLabel usernameLabel = new JLabel("Username:"); 
    usernamePanel.add(usernameLabel); 
    JTextArea usernameTextArea = new JTextArea(); 
    usernameTextArea.setText(Login.username); 
    usernamePanel.add(usernameTextArea); 
    northPanel.add(usernamePanel); 
    usernameTextArea.setEditable(false); 
    add(northPanel, BorderLayout.NORTH); 
    northPanel.add(usernamePanel); 
    // Logo 
    northPanel.add(new JLabel(logo)); 
    // Time Panel 
    timePanel.setLayout(new FlowLayout(FlowLayout.RIGHT)); 
    timePanel.setBackground(blue); 
    JLabel timeLabel = new JLabel("Time:"); 
    timePanel.add(timeLabel); 
    JTextArea timeTextArea = new JTextArea(); 
    timeTextArea.setText("0"); 
    timePanel.add(timeTextArea); 
    northPanel.add(timePanel); 
    timeTextArea.setEditable(false); 
    add(northPanel, BorderLayout.NORTH); 

    // South Panel 
    southPanel.setPreferredSize(new Dimension(550,50)); 
    southPanel.setBackground(blue); 
    searchTextArea.setLineWrap(true); 
    southPanel.add(searchTextArea); 
    searchTextArea.setBorder(BorderFactory.createLineBorder(Color.BLACK)); 
    searchTextArea.setFont(new Font("Geniva", Font.PLAIN, 30)); 
    searchTextArea.addKeyListener((KeyListener) this); 
    JButton submitButton = new JButton("Submit"); 
    submitButton.addActionListener(this); 
    southPanel.add(submitButton); 
    JButton quitButton = new JButton("Quit"); 
    quitButton.addActionListener(this); 
    southPanel.add(quitButton); 
    getContentPane().add(southPanel, BorderLayout.SOUTH); 

    // Center Panel 
    centerPanel.setPreferredSize(new Dimension(400,400)); 
    centerPanel.setBackground(blue); 
    centerPanel.setLayout(new GridLayout(length, length)); 
     //generate buttons 
    for(int i=0; i<length; i++) { 
     for(int j=0; j<length; j++) { 
     buttons[i][j]=new JButton(Character.toString(((char)(int)(Math.random() * 25 + 65)))); 
     buttons[i][j].setBackground(white); 
     //buttons[i][j].setForeground(white); 
     buttons[i][j].setFont(new Font("Geniva", Font.BOLD, 200/length)); 
     buttons[i][j].addActionListener(this); 
     centerPanel.add(buttons[i][j]); 
     } 
    } 
    getContentPane().add(centerPanel, BorderLayout.CENTER); 

    // East Panel 
    eastPanel.add(wordScrollPane); 
    wordScrollPane.setPreferredSize(new Dimension(150,400)); 
    eastPanel.setBackground(blue); 
    getContentPane().add(eastPanel, BorderLayout.EAST); 


    // Finalize 
    pack(); 
    searchTextArea.requestFocusInWindow(); 
    setLocationRelativeTo(null); 
    setVisible(true); 
} 
public void nimbusLookAndFeel() { 
    try { 
     for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) { 
      if ("Nimbus".equals(info.getName())) { 
       UIManager.setLookAndFeel(info.getClassName()); 
       break; 
      } 
     } 
    } catch (Exception e) { 
    } 
} 

public void clearButtons() { 
    for(int i= 0; i<buttons.length; i++) { 
     for(int j=0; j<buttons[0].length; j++) { 
      buttons[i][j].setBackground(white); 
     } 
    } 
} 
public void submitWord() { 
    if(findWord(searchTextArea.getText()) && !(searchTextArea.getText().equals(""))){ 

     wordListModel.addElement(searchTextArea.getText().toUpperCase()); 
     } else { 
      wordListModel.addElement("Not a word!"); 
     } 
     searchTextArea.getDocument().putProperty("filterNewlines", Boolean.TRUE); 
     wordList.ensureIndexIsVisible(wordListModel.size()-1); 
     searchTextArea.setText(""); 
} 
@Override 
public void actionPerformed(ActionEvent e) { 
    // Check if source is the Submit Button 
    if(((JButton) e.getSource()).getText().equals("Submit")){ 
     submitWord(); 
    // Check if source is the Quit Button 
    } else if(((JButton) e.getSource()).getText().equals("Quit")){ 
     dispose(); 
    // Source must be a Letter Button 
    } else if(!((JButton) e.getSource()).getBackground().equals(orange)){ 
     searchTextArea.append(((JButton) e.getSource()).getText()); 
     ((JButton) e.getSource()).setBackground(orange); 
    } 
    searchTextArea.requestFocusInWindow(); 
} 

@Override 
public void keyPressed(KeyEvent e) { 

    searchTextArea.setText(searchTextArea.getText().toUpperCase()); 
    if (e.getKeyCode()==KeyEvent.VK_ENTER){ 
     submitWord(); 
    }  
} 

@Override 
public void keyReleased(KeyEvent e) { 

    searchTextArea.setText(searchTextArea.getText().toUpperCase()); 
    if(!findWord(searchTextArea.getText())) { 
     clearButtons(); 
    } 
    if (e.getKeyCode()==KeyEvent.VK_ENTER){ 
     searchTextArea.setText(""); 
    } 
} 

@Override 
public void keyTyped(KeyEvent e) { 
} 

// here is the method that does not work! 
public boolean findWord(String word) { 
    clearButtons(); 
    for (int row = 0; row < length; row++) { 
     for (int col = 0; col < length; col++) { 
      if (findWord(word, row, col)) { 
       System.out.println(""); 
       return true; 
      } 
     } 
    } 
    return false; 
} 

private boolean findWord(String word, int row, int col) { 

    if(word.equals("")) { 
     return true; 
    } 


    if (row < 0 || row >= length || 
      col < 0 || col >= length || 
      !(buttons[row][col].getText().equals(word.substring(0,1))) || 
      buttons[row][col].getBackground().equals(orange) //<-doesn't work 
       ) { 
     return false; 
    } 
     System.out.println(buttons[row][col].getBackground()); 

     String rest = word.substring(1, word.length()); 

     boolean letter = 
       findWord(rest, row-1, col-1) || 
       findWord(rest, row-1, col) || 
       findWord(rest, row-1, col+1) || 
       findWord(rest, row, col-1) || 
       findWord(rest, row, col+1) || 
       findWord(rest, row+1, col-1) || 
       findWord(rest, row+1, col) || 
       findWord(rest, row+1, col+1); 
     if(letter) { 
      buttons[row][col].setBackground(orange); 
     } 
     return letter; 
} 

}

+0

你調試到? 'button [row] [col] .getBackground()'返回什麼? –

+0

對不起,如果不清楚! 1.orange是之前聲明的顏色 2.buttons [row] [col] .getBackground()返回java.awt.Color [r = 255,g = 255,b = 255] (默認白色) – caziz

+0

考慮提供一個[runnable示例](https://stackoverflow.com/help/mcve),它演示了您的問題。這不是代碼轉儲,而是您正在做的事情的一個例子,它突出了您遇到的問題。這將導致更少的混淆和更好的反應 – MadProgrammer

回答

0

感謝大家的幫助,我通過添加按鈕數組作爲參數能夠找到答案。

public boolean findWord(String word, int row, int col, JButton[][] buttons) 

最終的方法看起來像這樣。

public boolean findWord(String word) { 
    clearButtons(); //make buttons white again 
    for (int row = 0; row < length; row++) { 
     for (int col = 0; col < length; col++) { 
      if (findWord(word, row, col, buttons)) { 
       return true; 
      } 
     } 
    } 
    return false; 
} 

private boolean findWord(String word, int row, int col, JButton[][] buttons) { 
    if(word.equals("")) { 
     return true; 
    } 


    if (row < 0 || row >= length || 
      col < 0 || col >= length || 
      !(this.buttons[row][col].getText().equals(word.substring(0,1))) || 
      buttons[row][col].getBackground().equals(orange) 
       ) { 
     return false; 
    } 

     String rest = word.substring(1, word.length()); 
     boolean letter = 
       findWord(rest, row-1, col-1, buttons) || 
       findWord(rest, row-1, col, buttons) || 
       findWord(rest, row-1, col+1, buttons) || 
       findWord(rest, row, col-1, buttons) || 
       findWord(rest, row, col+1, buttons) || 
       findWord(rest, row+1, col-1, buttons) || 
       findWord(rest, row+1, col, buttons) || 
       findWord(rest, row+1, col+1, buttons); 
     if(!letter) { 
      this.buttons[row][col].setBackground(white); 
     } 
     return letter; 
} 

}

0

正如Java Docs

public Color getBackground() 

注意獲取組件的背景色。

返回:此組件的背景顏色;如果此組件沒有 有背景顏色,其母公司的背景色是 返回

這個方法返回Color實例所以你需要比較Color.orangeColor.ORANGE

+1

'顏色橙色=新顏色(245,130,32);'應該等於'橙色'比較時。 OP不需要使用常量值 – MadProgrammer

+1

'新顏色(245,130,32).equals(新顏色(245,130,32))'等於'true':P – MadProgrammer