2015-10-16 29 views
0

我最近正在爲使用3x3按鈕網格的井字遊戲應用程序製作GUI。我通過使用GridBagLayout來添加按鈕,然後將其圖標更改爲白色。當我添加一個ActionListener時,問題就出現了,它將單擊按鈕的圖標設置爲相同大小的「X」。具體來說,我可以讓圖標正常更改,但如果我點擊三個按鈕的行或列,那麼該行或列就會消失。我通過打印出所有按鈕的大小,發現它們的高度或寬度降低到20或更低,並通過擴展其他按鈕尺寸以填充空間來測試此效果。全行之前Java防止按鈕調整圖標變化

窗口點擊

http://i.stack.imgur.com/hZ4OR.png

窗口全行點擊

http://i.stack.imgur.com/g45CD.png

代碼設置初始空白按鈕圖標後:

while(i < cells.length) { 
     cells[i].cell = new JButton(new ImageIcon(br.getScaledInstance(100, 100, BufferedImage.SCALE_FAST))); 
     cells[i].cell.setBorder(BorderFactory.createEmptyBorder()); 
     cells[i].cell.setFocusPainted(false); 
     if(i < 3) { 
     cells[i].cell.setBorder(lines); 
     } 
     if(i >= 3 && i < 6) { 
      cells[i].cell.setBorder(line2); 
     } 
     if(i >= 6) { 
      cells[i].cell.setBorder(nat); 
     } 

     i++; 
    } 

代碼點擊時設置X:

ActionListener act = new ActionListener() { 

     public void actionPerformed(ActionEvent e) { 

      JButton testo = (JButton) e.getSource(); 
      loc = getIndice(testo); 
      System.out.println("LOC IS: " + loc); 


       cells[loc].cell.setIcon(new ImageIcon(bro.getScaledInstance(cells[loc].cell.getSize().width, cells[loc].cell.getSize().height , BufferedImage.SCALE_SMOOTH))); 
     } 
    }; 

歡迎任何建議,解決方案或建議,謝謝!

回答

1
cells[i].cell = new JButton(new ImageIcon(br.getScaledInstance(100, 100, BufferedImage.SCALE_FAST))); 

您不需要爲每個按鈕創建一個單獨的圖標。您可以在循環外創建圖標,然後對每個按鈕使用圖標

當您更改按鈕時,使用按鈕的大小。由於您的按鈕使用邊框,因此您無法使用按鈕的大小,因爲空白圖標大小和「X」圖標大小會有所不同。像創建默認圖標時一樣使用(100,100)。代碼將更簡單:

cells[loc].cell.setIcon(new ImageIcon(bro.getScaledInstance(100, 100, BufferedImage.SCALE_SMOOTH))); 

再次,您不需要每次都重新創建圖標。只需在你的類的構造函數中創建一次Icon。

因此,在開始時創建所有圖標,它們都將具有相同的尺寸,並且切換圖標時不必擔心組件更改大小。你也可以不需要更新包含按鈕的數組。 ActionEvent爲您提供了點擊的來源,因此您只需更改點擊按鈕上的圖標即可。

+0

非常感謝您的建議,我嘗試了您所說的並製作了一次圖標,並且在ActionEvents被觸發時停止更新包含該按鈕的數組。不過,我仍然遇到同樣的問題,我也嘗試刪除按鈕周圍的邊框以查看是否解決了問題,但仍然存在。我評論了我的ComponentListener,它正在監聽組件的大小調整並且問題消失。我想這意味着更改圖標會觸發ComponentEvent。感謝您的輸入! – KilRil