2011-04-27 20 views
7

मैं JToggleButton का रंग बदलने की कोशिश कर रहा हूं, जब इसे विश्वसनीय, दिखने और स्वतंत्र तरीके से महसूस किया गया है।किसी चयनित JToggle बटन के पृष्ठभूमि रंग को बदलना

UIManager.put("ToggleButton.selected", Color.RED); 

नोट:

धातु एल & एफ का उपयोग कर, तो UIManager का उपयोग कर एक दृष्टिकोण है Iyy ने बताया कि मैंने ऊपर संपत्ति नाम लिखने में कोई गलती की थी, लेकिन मैं इसे छोड़ देंगे के लिए ऊपर के लोगों यहाँ हो रही है, लेकिन वास्तविक संपत्ति नाम माना जाता है:

UIManager.put("ToggleButton.select", Color.RED); 

बहरहाल, यह मेरे वर्तमान देखो और महसूस (वर्तमान में Windows XP) में काम नहीं करता। कुछ और विश्लेषण के बाद, ऐसा लगता है कि विंडोज़ (अभी भी एक्सपी) में सिस्टम दिखता है और महसूस करता है Color-आधारित UIManagerToggleButton के लिए गुणों का उपयोग नहीं करता है, या कम से कम उन्हें स्वयं आपूर्ति नहीं करता है (एक त्वरित उदाहरण है find all property keys from the UIManager पर ऑनलाइन, जो कि उदाहरण में आसानी से Color गुणों तक सीमित है)।

मैं पृष्ठभूमि रंग स्थापित करने की कोशिश की है:

Action action = new AbstractAction() { 
    @Override 
    public void actionPerformed(ActionEvent e) { /* stuff */ } 
}; 
JToggleButton button = new JToggleButton(action); 
// tried with and without opaque true 
button.setOpaque(true); 
button.setBackground(Color.RED); 

यह न केवल चयनित राज्य में परिवर्तन नहीं होता है, लेकिन वह भी नहीं चुना जाता राज्य प्रभावित नहीं करता।

मैं केवल कार्रवाई प्राप्त करने के बाद पृष्ठभूमि रंग बदलने की कोशिश की है:

@Override 
public void actionPerformed(ActionEvent e) 
{ 
    JToggleButton button = (JToggleButton)e.getSource(); 
    if (button.isSelected()) // alternatively, (Boolean)getValue(Action.SELECTED_KEY) 
    { 
     button.setBackground(Color.RED); 
    } 
} 

कि में से कोई भी काम करता है। केवल एक चीज है कि मैं काम करने के लिए मिल गया है मुझे चयनित राज्य (जो एक काम कर उदाहरण की ओर जाता है, गैर मानक की तलाश में यद्यपि) में बटन अपने आप को आकर्षित करने के लिए की आवश्यकता है:

private class ColoredToggleButton extends JToggleButton 
{ 
    ColoredToggleButton(Action action, Color color) 
    { 
     super(action); 

     setBackground(color); 
    } 

    @Override 
    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     if (this.isSelected()) 
     { 
      int w = getWidth(); 
      int h = getHeight(); 
      String s = getText(); 

      // selected color 
      g.setColor(getBackground()); 
      g.fillRect(0, 0, w, h); 
      // selected foreground color 
      g.setColor(SystemColor.controlText); 
      g.drawString(s, 
         (w - g.getFontMetrics().stringWidth(s))/2 + 1, 
         (h + g.getFontMetrics().getAscent())/2 - 1); 
     } 
    } 
} 

कि थोड़ा में एक टिप्पणी से संशोधित किया गया है यह Java bug report। दिलचस्प बात यह है कि 1 99 8 में तय किए गए दावों में

क्या किसी को बेहतर, एल & एफ किसी चयनित JToggleButton के पृष्ठभूमि रंग को सेट करने के लिए स्वतंत्र तरीका पता है?

+0

आप BasicbuttonUI या सिर्फ MetalButtonUI ओवरराइड कर सकते हैं (फिर बस के लिए धातु एल एंड एफ) कुछ संकेत http://stackoverflow.com/questions/5751311/creating-custom-button -इन-जावा/5755124 # 5755124 – mKorbel

+0

क्यों? एलएएफ को देखने को नियंत्रित करना है, बेहतर इसे करने का प्रयास करें - यदि हस्तक्षेप के साथ सफल होता है, तो आपका कस्टम पेंट/रंग सभी – kleopatra

+0

@ क्लेओपेट्रा में एक गले के अंगूठे की तरह चिपकेगा, आमतौर पर मैं सहमत हूं कि एल एंड एफ छोड़ना अच्छा अभ्यास है, लेकिन बस, यह एक वांछित विशेषता है। विशेष रूप से, यह वास्तव में बाहर निकलना है। – pickypg

उत्तर

3

आप देख सकते हैं कि setIcon() आपके उद्देश्य के लिए पर्याप्त है, लेकिन आप प्रतिनिधि में paint() को ओवरराइड भी कर सकते हैं।

अनुपूरक: @ क्लोपेट्रा की टिप्पणी अच्छी तरह से ली गई है: UI प्रतिनिधि को बदलना छोटा नहीं है। @ mkorbel के हालिया example दृष्टिकोण की कठिनाई और बहुमुखी प्रतिभा दोनों दिखाता है। इसका आवश्यक लाभ & आजादी महसूस करता है।

कुछ कम महत्वाकांक्षी दृष्टिकोणों का उल्लेख here है।

+0

पुन: एक कस्टम बटन यूआई/सबक्लास को एक मौजूदा - निश्चित रूप से लागू करें, सब कुछ संभव है - लेकिन सबकुछ संभव नहीं है ;-) मेरे द्वारा मजबूत "नहीं"। – kleopatra

+0

@ क्लेओपेट्रा: मैं आपकी टिप्पणी की सराहना करता हूं; मैंने इसे ऊपर, परिप्रेक्ष्य में रखने की कोशिश की है। – trashgod

+0

@ जेनेट मैं हमेशा अपनी आंखों के बीच अपने किक की सराहना करता हूं, क्योंकि यह हमेशा (my) poppycock के बारे में था, लेकिन ओपी शायद यह नहीं सुनना चाहें कि यह संभव नहीं है, बग्सपेड से पैच की प्रतीक्षा करें, फिर यह आपको जवाब देगी * ** कस्टमकंपोनेंट्स बनाएं, यदि आप विकल्प सेटफ्रॉन्ग से सेट नहीं हैं या आइकन – mKorbel

5

"ToggleButton.selected" गलत है, इसके लिए "ToggleButton.select" की आवश्यकता है। और घटक को अद्यतन किया जाना चाहिए।

UIManager.put("ToggleButton.select", Color.WHITE); 
SwingUtilities.updateComponentTreeUI(togglebuttonname); 
+0

यह एक अच्छा पकड़ है और यह काम करता है! हालांकि, एक बड़ी चेतावनी है कि यह वैश्विक रूप से सभी 'JToggleButton' को प्रभावित करता है जब तक कि आप अपना स्वयं का उदाहरण नहीं बनाते और इसके लिए एक नया 'स्थिर घटक यूआई createUI (JComponent c) प्रदान करते हैं। नतीजतन, मैं अभी भी अपना खुद का रोलिंग कर रहा हूं, लेकिन उन लोगों के लिए जो पृष्ठभूमि रंग को वैश्विक रूप से बदलना चाहते हैं, तो आपका दृष्टिकोण एक कामकाजी समाधान है। – pickypg

+0

मैं बहुत उत्साहित था, और वर्तनी गलती एक अच्छी पकड़ है। हालांकि, यह विंडोज सिस्टम में काम नहीं करता है और महसूस करता है। – pickypg

+0

इसे और भी आगे देखकर, ऐसा प्रतीत होता है कि सिस्टम एल एंड एफ 'रंग' (उदा।, "ToggleButton.background") से जुड़े किसी भी ToggleButton कुंजी का भी उपयोग नहीं करता है। – pickypg

3
JToggleButton btn = new JToggleButton(...); 
btn.setUI(new MetalToggleButtonUI() { 
    @Override 
    protected Color getSelectColor() { 
     return Color.RED; 
    } 
}); 
1

आप बस प्रत्येक रीपेंट से पहले पृष्ठभूमि रंग मजबूर कर सकते हैं - उसके लिए आपको paintComponent को बदलने के लिए, अगर बटन चालू किए जाने पर, सेट पृष्ठभूमि टॉगल स्थिति के आधार पर जाँच करें और, अंत में, सुपर वर्ग जाने करना है वास्तविक रंग नौकरी:

public class ColoredToggleButton extends JToggleButton 
{ 
    @Override 
    public void paintComponent(Graphics g) 
    { 
     Color bg; 
     if (isSelected()){ 
      bg = Color.GREEN; 
     } else { 
      bg = Color.RED; 
     } 
     setBackground(bg); 
     super.paintComponent(g); 
    } 
} 
0

आप बल्कि एक यूआई में अधिभावी तरीकों के बजाय एक कार्रवाई श्रोता का प्रयोग करेंगे, तो आप सिर्फ एक यूआई के लिए यूआई किसी भी selectColor गुण के बिना बदल सकते हैं।

यहाँ एक उदाहरण हाल ही में मैंने

प्रयोग किया जाता है
private class FavouriteToggle extends JToggleButton { 
    public FavouriteToggle() { 
     setUI(new BasicToggleButtonUI()); //Removes selectColor 

     ////Your Custom L&F Settings//// 
     setBackground(new Color(255, 252, 92)); 
     setForeground(Color.GRAY); 
     setText("Favourite"); 
     setBorder(null); 
     setFocusPainted(false); 

     ////Add your own select color by setting background//// 
     addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       if(((JToggleButton) e.getSource()).isSelected()) { 
        setForeground(Color.BLACK); 
        setBackground(new Color(255, 251, 0)); 
       } else { 
        setBackground(new Color(255, 252, 92)); 
        setForeground(Color.GRAY); 
       } 
      } 
     }); 
    } 
} 
संबंधित मुद्दे