2011-09-08 16 views
5

Tôi có một ListCellRenderer tùy chỉnh và muốn sử dụng màu nền màu lựa chọn mặc định của Nimbus. Tôi có thể tra cứu màu bằng:Làm cách nào để sử dụng màu Nimbus mặc định với UIManager?

Color selectionBackground = UIManager.getColor("nimbusSelectionBackground"); 

và nếu tôi in, nó có cùng giá trị như trên Nimbus default colors. Nhưng khi tôi sử dụng nó trên một JPanel tôi nhận được một màu xám khác nhau, làm thế nào tôi có thể sử dụng màu sắc từ UIManager?

Khi tôi làm:

setBackground(Color.RED); 

Các JPanels backround được thể hiện trong màu đỏ, nhưng khi tôi làm:

setBackground(selectionBackground); 

Các "selectionBackground" màu sắc là không sử dụng, nhưng một màu xám .


Dưới đây là một ví dụ và ảnh chụp màn hình:

enter image description here

Nền nên là:

enter image description here

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UIManager.LookAndFeelInfo; 

public class PanelColor { 

    public static void main(String[] args) { 

     // switch to Nimbus Look And Feel 
     for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) { 
      if ("Nimbus".equals(info.getName())) { 
       try { 
        UIManager.setLookAndFeel(info.getClassName()); 
       } catch (Exception e) { e.printStackTrace(); } 
       break; 
      } 
     } 

     Color selectionBackground = UIManager.getColor("nimbusSelectionBackground"); 

     JPanel panel = new JPanel(new BorderLayout()); 
     panel.setPreferredSize(new Dimension(300,50)); 
     panel.add(new JLabel(selectionBackground.toString()), BorderLayout.NORTH); 

     // is not showing the selectionBackground color 
     panel.setBackground(selectionBackground); 

     JFrame frame = new JFrame(); 
     frame.add(panel); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 
+0

Có thể câu hỏi sau đây có thể giúp bạn với Nimbus - http://stackoverflow.com/questions/5840599/jbutton-background-on-nimbus-laf? –

+1

Wow, rất kỳ quặc. Tôi đã kiểm tra mã: màu được trả về là kiểu javax.swing.plaf.ColorUIResource. Nhưng tôi không thấy làm thế nào mà có thể gây ra bất kỳ vấn đề vì nó là một phân lớp của màu. Không có gì đặc biệt trong mã của ColorUIResource, không có tham chiếu đến giao diện người dùng hoặc bất kỳ thứ gì. Như Joey đã đề xuất, 'selectionBackground = new Color (selectionBackground.getRGB());' hoạt động. – toto2

Trả lời

4

Nimbus rõ ràng chống lại rằng màu sắc của nó được sử dụng ở những nơi khác. Tôi tình cờ gặp điều này một lúc trước và sau đó giải pháp tốt nhất của tôi là tạo ra một Color mới bằng cách sử dụng các thành phần (bạn có thể truy vấn) và sử dụng nó. Tất nhiên, sau đó bạn gắn bó với màu đó ngay cả khi L & F được thay đổi.

Tôi biết đó là toàn bộ điểm của một số DerivedColor bạn quay lại từ UIManager. Tôi đã không tìm thấy một giải pháp tốt hơn mặc dù.

Điều này cũng tương tự đối với các L & F khác và những thứ khác. Ví dụ. GTK L & F sẽ vui vẻ cung cấp cho bạn các biểu tượng bạn muốn có nhưng chúng sẽ không vẽ trong điều khiển của riêng bạn. Tôi đoán một phần của tất cả điều này là Swing là (a) khủng khiếp phức tạp và (b) không L & F ra có thực sự tuân thủ các hợp đồng, thậm chí không Nimbus, mặc dù là mới nhất và tuyệt vời nhất.

+0

DerivedColor được xác định ở đâu? Bạn có nghĩa là [NimbusLookAndFeel.getDerivedColor] (http://docs.oracle.com/javase/7/docs/api/javax/swing/plaf/nimbus/NimbusLookAndFeel.html#getDerivedColor%28java.lang.String,%20float,%20float,%20float, % 20int,% 20boolean% 29)? – Gili

5

Tôi không nghĩ rằng Nimbus "chống lại" thiết lập màu sắc. Nó sai giả định rằng bạn không overriden mặc định vì UIManager.getColor() trả về một thể hiện của ColorUIResource.

ColorUIResource chỉ đơn giản là màu thực hiện giao diện điểm đánh dấu UIResource. Theo Javadoc, L & Fs "sử dụng giao diện này để quyết định xem giá trị thuộc tính có bị ghi đè hay không". Nimbus kiểm tra màu nền, nhận thấy rằng bạn đã không ghi đè nó, và rơi trở lại trên một số hành vi nội bộ mà bạn không mong đợi.

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