2012-04-26 15 views
8

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

एक आखिरी (?) समस्या पर अटक गया।

मेरे पास उपयुक्त नोड डिस्प्ले बनाने के लिए एक उप-वर्गीकृत DefaultCellRenderer के साथ एक JTree है। यह विंडोज लुक एंडफेल के तहत ठीक काम करता है।

समस्या: विंडोज़एफ़एफ़ के तहत जब नोड का चयन किया जाता है तो नोड का पाठ हाइलाइट किया जाता है, और प्रभाव को समझने में दृष्टिहीन होती है। निंबस के तहत जब एक नोड का चयन किया जाता है तो हाइलाइटिंग (काफी काला) रंग की एक बार के साथ किया जाता है जो पेड़ की खिड़की की चौड़ाई (पाठ की चौड़ाई नहीं) चलाता है, और प्रभाव विघटित होता है।

तो: मैं बस निंबस लाएफ़ में जेटीरी नोड हाइलाइटिंग के विंडोजएलएएफ उपचार चाहता हूं (यानी रंगीन पृष्ठभूमि केवल पाठ की चौड़ाई, और अधिमानतः एक बेहतर रंग में जिसे मैं चुन सकता हूं)। मुझे संदेह है कि इसका मतलब है कि मुझे पर सही प्रकार का पेंटर असाइन करने की आवश्यकता है "वृक्ष: ट्रीसेल [फोकस + चयनित] .backgroundPainter", लेकिन मुझे नहीं पता कि इसे कैसे लिखना है।

सुझाव सबसे अधिक स्वागत है।


संपादित

जावा 7 के साथ अजीब चयनित नोड उजागर मिलते हैं!

enter image description here

public class TreeBorder { 
    public static void main(String[] args) { 
     try{ 
      for(UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) { 
       if("Nimbus".equals(info.getName())) { 
        UIManager.setLookAndFeel(info.getClassName()); 
        break; 
       } 
      } 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JFrame f = new JFrame(); 
       f.setLocationRelativeTo(null); 
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       f.getContentPane().add(getJTree()); 
       f.pack(); 
       f.setVisible(true); 
      } 
      private JTree getJTree() { 
       JTree jTree = new JTree(); 
       jTree.setCellRenderer(new LocalRenderer()); 
       return jTree; 
      } 
     }); 
    } 

    private static class LocalRenderer extends DefaultTreeCellRenderer { 
     @Override 
     public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasfocus) { 
      DefaultTreeCellRenderer result = (DefaultTreeCellRenderer)super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasfocus); 
       if(true) { 
        result.setFont(new JLabel().getFont()); 
        Icon icon = UIManager.getIcon("FileView.floppyDriveIcon"); 
        result.setIcon(icon); 
       } 
      return(result); 
     } 
    } 
} 
+0

मेरी पोस्टिंग में अनुपूरक: निश्चित रूप से यदि चित्रकार की तुलना में कोई आसान तरीका है, तो यह भी बेहतर होगा। ट्री.सेक्शन बैकग्राउंड को कम विचलित रंग में बदलने का प्रयास किया, लेकिन निम्बस संशोधन को अनदेखा कर रहा है। – user1359010

+0

मेरी टिप्पणी के आगे। आप Tree.selectionBackground को सीधे सेट नहीं कर सकते हैं, लेकिन यह रंग numbusSelectionBackground से लिया गया है, इसलिए nimbUID.put ("nimbusSelectionBackground", नया ColorUIRESource (205,208,216)); कुछ वांछित प्रभाव पैदा करता है (एक हल्का वृक्ष। चयन बैकग्राउंड)। अभी भी टेक्स्ट की बजाय एक पंक्ति को हाइलाइट किया जा रहा है, इसलिए चित्रकार पर सहायता की सराहना की जाएगी। – user1359010

+0

@oliholz ​​कृपया आप अपने बक्षीस पर टिप्पणी कर सकते हैं, यकीन है कि मुझे यह प्रश्न कभी नहीं देखा जा रहा है, क्योंकि ज्यादातर मामलों में क्लासिक रेंडरर्स अवधारणा निम्बस गुणों और सेटिंग्स को ओवरलोड कर रही है – mKorbel

उत्तर

6

संपादित

"Tree.selectionBackground" कुंजी क्या JTree पर प्रकाश डाला नियंत्रित करता है - यह, पेड़ स्तर पर किया जाता है TreeCellRenderer स्तर पर नहीं (जो प्रबंधन के लिए यह थोड़ा उलझन में क्यों है)। इस कोड को आप एक पेड़ जहां हाइलाइटिंग नियंत्रित कर सकते हैं मिल जाएगा:

private JTree getJTree() { 

    JTree jTree = new JTree(); 
    jTree.setOpaque(true); 
    jTree.setBackground(Color.white); 
    UIDefaults paneDefaults = new UIDefaults(); 
    paneDefaults.put("Tree.selectionBackground",null); 

    JTextPane pane = new JTextPane(); 
    jTree.putClientProperty("Nimbus.Overrides",paneDefaults); 
    jTree.putClientProperty("Nimbus.Overrides.InheritDefaults",false); 

    jTree.setCellRenderer(new LocalRenderer()); 
    return jTree; 
} 

और यहाँ लाल करने के लिए हाइलाइटिंग बदलने का एक उदाहरण है। कृपया ध्यान दें कि आइकन की पृष्ठभूमि को भी हाइलाइट किया जाएगा - यह गैर-निम्बस एल & एफ के लिए भी डिफ़ॉल्ट व्यवहार है।

public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasfocus) { 
     DefaultTreeCellRenderer result = (DefaultTreeCellRenderer)super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasfocus); 
     result.setOpaque(true); 
      if(true) { 
       result.setFont(new JLabel().getFont()); 
       Icon icon = UIManager.getIcon("FileView.floppyDriveIcon"); 
       result.setIcon(icon); 
      } 
      if(sel){ 
       result.setBackground(Color.red); 
      } else{ 
       result.setBackground(Color.white); 
      } 
     return(result); 
    } 

मूल उत्तर

सबसे आसान में से एक: आप आइकन पर प्रकाश डाला जाना नहीं करना चाहते हैं, तो आप TreeCell प्रस्तुत करना के लिए कुछ डिफ़ॉल्ट JLabel से अधिक सजावटी का उपयोग करने के लिए जा रहे हैं इसे ठीक करने के तरीके चयनित पृष्ठभूमि रंग को पारदर्शी पर सेट करना है। समस्या यह है कि यह लेबल की पृष्ठभूमि को पेंट करने की कोशिश कर रहा है - जिसमें JTree के चयन द्वारा उपयोग किए जाने वाले अच्छे निंबस चित्रकार नहीं हैं।तो getTreeCellRendererComponent विधि को यह पंक्ति जोड़ें:

result.setBackgroundSelectionColor(new Color(0,0,0,0)); 

एक अन्य विकल्प TreeCellRenderer की पृष्ठभूमि के लिए निम्बस चित्रकार उपयोग करने के लिए है - लेकिन यह है कि इस स्थिति में overkill की तरह लगता है।

+0

हम्म ... वास्तव में, जैसा कि मैंने प्रश्न को समझ लिया है, यह रेंडरर के पृष्ठभूमि रंग _outside_ को रोकने के बारे में है (इसे _inside_ रखते हुए) एक अदृश्य रंग (यदि इसका कोई प्रभाव पड़ता है) का उपयोग करना दोनों को रोक देगा। – kleopatra

+0

@ क्लोपत्रा हेहे ... शायद मैं अगली बार पूरा प्रश्न पढ़ूंगा। अच्छी पकड़। –

+0

ओपी यहाँ; लंबे समय बाद बस जांच की गई, सवाल का जवाब देखने में प्रसन्नता हुई, और यह काम करता है। कोड के लिए बहुत धन्यवाद और पेड़ के स्तर पर इसके बारे में जानकारी को संभाला जा रहा है। – user1359010

संबंधित मुद्दे