2012-04-26 22 views
8

Tôi đã làm việc để chuyển đổi một ứng dụng Java từ WindowsLookAndFeel thành Nimbus, phần lớn thành công, mặc dù Nimbus foibles. Người dùng của tôi nói chung giống như Nimbus LaF nhưng không thích một số chi tiết, một số trong đó tôi đã thay đổi bằng cách tham khảo các câu hỏi trước trên trang web này. Ví dụ: Tôi đã sao chép LeafIcon, ClosedIcon và OpenIcon từ Windows LaF (mà họ thích) và sử dụng chúng trong phiên bản Nimbus, cho một sự kết hợp tuyệt vời của LaFs.thay đổi cách Nimbus LaF xử lý nút JTree làm nổi bật

Bị kẹt trên một sự cố (?) Cuối cùng.

Tôi có một JTree với một DefaultCellRenderer được phân lớp để tạo ra các nút hiển thị thích hợp. Điều này hoạt động tốt dưới WindowsLookAndFeel.

Sự cố: Trong WindowsLaF khi nút được chọn, văn bản của nút được tô sáng và hiệu ứng là dễ hiểu. Dưới Nimbus khi một nút được chọn làm nổi bật được thực hiện với một thanh (khá tối) màu chạy chiều rộng của cửa sổ cây (không chỉ là chiều rộng của văn bản), và hiệu quả là disconcerting.

Vì vậy: tôi chỉ đơn giản muốn điều trị WindowsLaF của nút JTree làm nổi bật trong Nimbus LaF (tức là nền màu chỉ có chiều rộng của văn bản, và tốt nhất là màu tốt hơn tôi có thể chọn). Tôi nghi ngờ điều này có nghĩa là tôi cần phải gán Painter đúng loại cho "Tree: TreeCell [Focused + Selected] .backgroundPainter", nhưng tôi không biết làm thế nào để viết nó.

Đề xuất được chào đón nhiều nhất.


EDIT

Xem nút nhấn chọn lạ với Java 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

Phụ lục cho bài đăng của tôi: tất nhiên nếu có cách dễ dàng hơn họa sĩ, điều đó thậm chí còn tốt hơn. Đã cố gắng chỉ thay đổi Tree.selectionBackground thành màu ít mất tập trung hơn, nhưng Nimbus dường như bỏ qua sự sửa đổi. – user1359010

+0

Thêm vào nhận xét của tôi. Bạn không thể đặt Tree.selectionBackground trực tiếp, nhưng màu này có nguồn gốc từ numbusSelectionBackground, vì vậy nimbUID.put ("nimbusSelectionBackground", mới ColorUIResource (205,208,216)); tạo ra một số hiệu ứng mong muốn (một Tree.selectionBackground nhẹ hơn). Vẫn nhận được một hàng được đánh dấu thay vì chỉ là văn bản, do đó, trợ giúp về một họa sĩ sẽ vẫn được đánh giá cao. – user1359010

+0

@oliholz ​​xin vui lòng bạn có thể bình luận tiền thưởng của bạn, chắc chắn tôi không bao giờ nhìn thấy câu hỏi này, bởi vì khái niệm Renderers cổ điển quá tải thuộc tính và cài đặt Nimbus trong hầu hết các trường hợp – mKorbel

Trả lời

6

Sửa

Các "Tree.selectionBackground" Điều quan trọng là những gì kiểm soát nổi bật trên JTree - nó được thực hiện vào mức độ cây, không phải trên mức TreeCellRenderer (đó là tại sao nó hơi khó hiểu). Mã này sẽ giúp bạn có một Cây nơi bạn có thể kiểm soát đánh dấu:

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

Và đây là ví dụ về việc thay đổi làm nổi bật thành Đỏ. Xin lưu ý rằng nền của Biểu tượng cũng sẽ được đánh dấu - đây là hành vi mặc định cho không phải là nimbus L & F. Nếu bạn không muốn vào biểu tượng để được đánh dấu, bạn sẽ phải sử dụng một cái gì đó fancier hơn JLabel mặc định để làm cho TreeCell:

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

gốc trả lời

Một trong những cách dễ cách khắc phục điều này là đặt màu nền đã chọn thành trong suốt. Vấn đề là nó đang cố gắng để vẽ nền của nhãn - mà không có các họa sĩ Nimbus mát được sử dụng bởi sự lựa chọn của JTree.Vì vậy, thêm dòng này vào getTreeCellRendererComponent phương pháp:

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

Một lựa chọn khác là sử dụng các họa sĩ nimbus cho nền của TreeCellRenderer - nhưng điều đó dường như quá mức cần thiết trong tình huống này.

+0

hmm ... không thực sự, vì tôi đã hiểu câu hỏi về việc ngăn chặn màu nền _outside_ của trình kết xuất (trong khi vẫn giữ nó _inside_) Sử dụng một màu vô hình (nếu có bất kỳ hiệu ứng nào) sẽ ngăn chặn cả hai. – kleopatra

+0

@ kleopatra Hehe ... có lẽ tôi sẽ đọc câu hỏi đầy đủ vào lần sau. Nắm bắt tốt. –

+0

OP tại đây; chỉ cần kiểm tra lại sau một thời gian dài, vui mừng khi thấy câu hỏi được trả lời, và nó hoạt động. Rất cám ơn vì mã và thông tin về nó được xử lý ở cấp độ cây. – user1359010

Các vấn đề liên quan