2012-04-26 11 views
8

Nimbus özelliklerine rağmen bir Java uygulamasını WindowsLookAndFeel'den Nimbus'a geçirmek için çalışıyorum. Kullanıcılarım genelde Nimbus LaF gibi ama bazı detayları beğenmedim, bazıları bu sitede daha önceki sorulara cevap vererek değiştirdim. Örnek: LeafIcon, ClosedIcon ve OpenIcon'ları Windows LaF'dan (beğendikleri) kopyaladım ve LaF'lerin hoş bir bileşimi için bunları Nimbus versiyonunda kullanıyorum.Nimbus LaF, JTree düğmesinin nasıl işlendiğini değiştirme JTree düğümü vurgulanıyor

Son bir (?) Problem üzerinde kaldı.

Uygun düğüm ekranlarını oluşturmak için alt Sınıflı bir DefaultCellRenderer'a sahip bir JTree'im var. Bu WindowsLookAndFeel altında çalışıyor.

Sorun: Düğüm seçildiğinde, WindowsLaF altında düğümün metni vurgulanır ve efektin anlaşılması kolaydır. Düğüm seçildiğinde Nimbus altında, vurgulama, ağaç penceresinin genişliğini (yalnızca metnin genişliği değil) çalıştıran (oldukça koyu) bir renk çubuğuyla yapılır ve efekt rahatsız olur. Yani: Sadece Nimbus LaF'de vurgulanan JTree düğümünün WindowsLaF tedavisini istiyorum (yani, yalnızca arkaplanın genişliğini renkli bir şekilde ve tercihen daha iyi bir renkte seçebiliyorum). Şüpheliyim ki, doğru sıralı ressamı "Tree: TreeCell [Odaklı + Seçili] .backgroundPainter" a atamam gerektiğinden, nasıl yazacağımı bilmiyorum.

Öneriler en çok hoş geldiniz.


DÜZENLEME

Java 7 ile garip seçilen düğüm vurgu bakın!

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

Gönderiye ek olarak: elbette bir ressamdan daha kolay bir yol varsa, bu daha da iyi olur. Tree.selectionBackground'u daha az dikkat dağıtıcı bir renge dönüştürmeyi denedim, ancak Nimbus modifikasyonu yok sayıyor. – user1359010

+0

Yorumuma ek. Tree.selectionBackground'u doğrudan ayarlayamazsınız, ancak bu renk numbusSelectionBackground'dan türetilmiştir, bu nedenle nimbUID.put ("nimbusSelectionBackground", yeni ColorUIResource (205,208,216)); İstenen efektin bir kısmını üretir (daha hafif bir Tree.selectionBackground). Yine de sadece metin yerine vurgulanmış bir satır elde etmek, bu yüzden bir ressamın yardımı yine de takdir edilecektir. – user1359010

+0

@oliholz ​​lütfunu yorumlayabilir misiniz, eminim bu soruyu asla göremedim, çünkü klasik Renderers kavramının aşırı yüklenmesi Nimbus özellikleri ve çoğu durumda – mKorbel

cevap

6

Düzenleme

"Tree.selectionBackground" tuşuna JTree Vurgulamanın kontrolleri nedir - Hangi (değil TreeCellRenderer düzeyinde, ağaç düzeyinde bitti neden yönetmek için biraz kafa karıştırıcı). Bu kod size vurgulama kontrol edebilen bir ağacı alacak:

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; 
} 

Ve burada Kırmızıya vurgulama değişen bir örnek. Simgenin arka planının da vurgulanacağını lütfen unutmayın - bu, nimbus olmayan L & F için de varsayılan davranıştır. En kolay ve

Bir

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); 
    } 

Orijinal Cevap: Eğer simgesi vurgulanır etmek istemiyorsanız, size TreeCell oluşturulacağı varsayılan JLabel daha meraklısı bir şey kullanmak zorunda gidiyoruz Bunu düzeltmenin yolları seçilen arka plan rengini saydamlaştırmaktır. Sorun şu ki, etiketin arka planını boyamaya çalışıyor - ki bu da JTree'nin seçimi tarafından kullanılan serin Nimbus ressamına sahip değil.

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

Diğer bir seçenek TreeCellRenderer arka planı için nimbus ressam kullanmaktır - ama bu bu durumda overkill gibi görünüyor: Yani getTreeCellRendererComponent yöntemine bu satırı ekleyin.

+0

hmm ... gerçekten, soru anladığım gibi, renderleyicinin _outside_ _outside_ boyamasını engellerken (_inside_ tutarken) Görünmez bir renk kullanmak (eğer herhangi bir etkisi varsa) her ikisini de engelleyecektir. – kleopatra

+0

Kleopatra Hehe ... belki de bir dahaki sefere tam soruları okuyacağım. İyi yakalama. –

+0

OP burada; uzun bir süre sonra tekrar kontrol ettim, cevaplanan soruyu görmekten memnun oldu ve işe yarıyor. Kod ve ağaç seviyesinde ele alınan hakkında bilgi için çok teşekkürler. – user1359010

İlgili konular