2012-01-09 26 views
0

此問題出現在my last question here之後。我想將每個按鈕設置爲焦點並將焦點背景設置爲主菜單(ContentPane是JPanel)下面的背景顏色,因此按鈕看起來像標籤。它在不同的環境中有所不同,所以它是動態的,所以我不能手動設置它。現在,如果我記錄ContentPane背景,它說238,238,238。如果我將它記錄在FocusListener中 - 它也表示238,238,238。如果我直接將按鈕的背景設置爲FocusListener外部的ContentPane背景 - 它可以工作,但如果我設置了在FocusListener裏面 - 它看起來像沒有讀取和設置值,但如果我手動設置顏色 - 它的作品。這可能如何發生?將FocusListener設置爲按鈕是我在主JPanel初始化時所做的最後一件事。似乎沒有在FocusListener中讀取JPanel背景

private void setButtonDefaults(JButton but) {//calls once for each menu button to set defaults 
    but.setBorderPainted(false); 
    but.setBackground(Color.DARK_GRAY); 
    but.setForeground(Color.WHITE); 
    but.setName(but.getText().toLowerCase()); 
    but.setPreferredSize(buttonSize); 
    but.addActionListener(this); 
    //add focus listener 
    but.addFocusListener(new FocusListener() { 
     @Override 
     public void focusLost(FocusEvent e) { 
      Color clr = ContentPane.getBackground(); 
      log(clr + "");//logs that color is 238, 238, 238 
      JButton button = (JButton) e.getSource(); 
      button.setBackground(clr);//value is not read 
      //button.setBackground(new Color(238, 238, 238)); //value is read 
     } 

     @Override 
     public void focusGained(FocusEvent e) { 
      //same as focusLost function 
     } 
    }); 
} 
private void enableOnlyOne(JButton but) { 
/* calls each time when one of menu buttons are pressed. 
All buttons are unpressed and changed colors to black and one 
button is set as pressed and changes background color to 
ContentPane background color 
*/ 
    //disable all 
    setButtonDisabled(MLibrary); 
    setButtonDisabled(MScheduler); 
    setButtonDisabled(MBudget); 
    setButtonDisabled(MReports); 
    setButtonDisabled(MManage); 
    setButtonDisabled(MSettings); 
    //enable one 
    but.getModel().setPressed(true); 
    but.setBackground(ContentPane.getBackground());//value is read perfect 
    but.setForeground(Color.BLACK); 
} 
private void setButtonDisabled(JButton but) { 
    but.getModel().setPressed(false); 
    but.setBackground(Color.DARK_GRAY); 
    but.setForeground(Color.WHITE); 
} 
+4

對於我來說,我希望能多更好地理解這個如果您可以創建併發布[sscce](http://sscce.org)(請檢查鏈接)。祝你好運! – 2012-01-09 12:58:36

+0

CAn請檢查focusLost是否被多次調用? – 2012-01-09 13:02:22

+0

我檢查了它。每次點擊一個按鈕時調用它,但每次使用'ContentPane.getBackground()'記錄相同的值:'javax.swing.plaf.ColorUIResource [r = 238,g = 238,b = 238]' – 2012-01-09 13:31:41

回答

0

它是那麼好通過自己找出答案:

private void setButtonDefaults(JButton but) { 
    but.setBorderPainted(false); 
    but.setBackground(Color.DARK_GRAY); 
    but.setForeground(Color.WHITE); 
    but.setName(but.getText().toLowerCase()); 
    but.setPreferredSize(buttonSize); 
    but.addActionListener(this); 
    //add focus listener 
    final Color clr = ContentPane.getBackground(); 
    final int r = clr.getRed(); 
    final int g = clr.getGreen(); 
    final int b = clr.getBlue(); 
    but.addFocusListener(new FocusListener() { 
     @Override 
     public void focusLost(FocusEvent e) { 
      log("r = " + r + ", g = " + g + ", b = " + b); 
      JButton button = (JButton) e.getSource(); 
      button.setBackground(new Color(r, g, b)); 
     } 

     @Override 
     public void focusGained(FocusEvent e) { 
      JButton button = (JButton) e.getSource(); 
      button.setBackground(new Color(r, g, b)); 
     } 
    }); 
} 

謝謝大家誰試圖(和做)幫我

3

請不要做這種方式,因爲我看了你的前一個線程......,現在我無法抗拒

更好,最簡單的方法是添加ChangeListener預期JButtons,那裏面stateChanged(ChangeEvent changeEvent)你能確定哪些JButtons觸發此事件,對事件的類型,你必須從ButtonModel

提取此事件的類型(剩下的就是你的,請把這些JButtonsVector, Array or Enumerations),例如

import java.awt.*; 
import javax.swing.*; 
import javax.swing.event.*; 

public class MyButtonGroup { 

    private JButton button1 = new JButton("Test Enabled/Disabled"); 
    private JButton button2 = new JButton("Test Enabled/Disabled"); 
    private JButton button3 = new JButton("Test Enabled/Disabled"); 

    public MyButtonGroup() { 
     JPanel panel = new JPanel(); 
     panel.setLayout(new GridLayout(3, 0, 10, 10)); 
     button1.addChangeListener(changeListener); 
     panel.add(button1); 
     button2.addChangeListener(changeListener); 
     panel.add(button2); 
     button3.addChangeListener(changeListener); 
     panel.add(button3); 
     JFrame frame = new JFrame("Grouping Example"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(panel); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
    private ChangeListener changeListener = new ChangeListener() { 

     public void stateChanged(ChangeEvent changeEvent) { 
      JButton abstractButton = (JButton) changeEvent.getSource(); 
      if (abstractButton == button1) { 
       ButtonModel buttonModel = abstractButton.getModel(); 
       boolean armed = buttonModel.isArmed(); 
       boolean pressed = buttonModel.isPressed(); 
       boolean selected = buttonModel.isSelected(); 
       boolean rolover = buttonModel.isRollover(); 
       System.out.println("Changed: " + armed + "/" + pressed + "/" + selected + "/" + rolover); 
      } else if (abstractButton == button2) { 
       ButtonModel buttonModel = abstractButton.getModel(); 
       boolean armed = buttonModel.isArmed(); 
       boolean pressed = buttonModel.isPressed(); 
       boolean selected = buttonModel.isSelected(); 
       boolean rolover = buttonModel.isRollover(); 
       System.out.println("Changed: " + armed + "/" + pressed + "/" + selected + "/" + rolover); 
      } 
     } 
    }; 

    public static void main(String args[]) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       MyButtonGroup xxx = new MyButtonGroup(); 
      } 
     }); 
    } 
} 
+0

在changeListener中,更仔細地看看你的ifs - 括號中的所有內容都是相同的。我前幾天想過,但我的答案和你的答案是一樣的,那就是爲什麼我改變了按鈕,使之變成了我所做的。另外,我知道只有6個按鈕,沒有更多,所以如果我想做按鈕開關優化,那麼我需要保存像「PressedButton」這樣的全局變量,然後我就知道要釋放哪個按鈕。感謝您的想法 – 2012-01-09 13:45:52

+1

@PooLaS關鍵區別在於檢查事件源的ButtonModel。 +1 btw。 – trashgod 2012-01-09 15:29:12

1

因爲一些L- & Fs的不顯示更改背景顏色是一種有用的方式,你可能要考慮突出的另一種形式:不同的邊框,改變前景色,自定義圖標,或適合的背景面板。更多here

+0

爲好例子+1 – mKorbel 2012-01-09 15:50:54