2013-01-10 28 views
5

Điều tôi muốn là tạo nền của vùng văn bản không thể chỉnh sửa giống như nền bị tắt của nó.Làm thế nào để đối phó với màu sắc có nguồn gốc trong Nimbus Look and Feel?

Tôi biết rằng màu sắc có sẵn từ UIManager với phím TextArea.disabled:

DerivedColor(color=214,217,223 parent=control offsets=0.0,0.0,0.0,0 pColor=214,217,223 

tôi trước hết thử:

textArea.setBackground(UIManager.getColor("TextArea.disabled")); 

Nó đã thay đổi gì cả và nền vẫn còn trắng.

Sau đó, tôi đã cố gắng:

textArea.setBackground(new Color(UIManager.getColor("TextArea.disabled").getRGB())); 

Nền đã thay đổi nhưng không phải là chính xác giống như các nền khuyết tật trông tươi sáng hơn.

Cách chính xác để xử lý màu bắt nguồn này là gì?

+0

xem Hướng dẫn Oracle về Giao diện, ghi đè các khóa thích hợp cho JTextArea – mKorbel

+0

Không có khóa nào cho nền không thể chỉnh sửa. –

Trả lời

0

tôi đã tìm thấy câu trả lời. Màu sắc sử dụng cho nền khuyết tật không phải là UIManager.getColor("TextArea.disabled"), nhưng mã hóa cứng trong lớp TextAreaPainter:

private Color color1 = decodeColor("nimbusBlueGrey", -0.015872955f, -0.07995863f, 0.15294117f, 0); 

Sử dụng màu này giải quyết vấn đề của tôi.

4

@Zhao Yi đã viết Không có chìa khóa cho nền thể chỉnh sửa

enter image description here

mã cho Java6, phải thay đổi imports for Java7

import com.sun.java.swing.Painter; 
import java.awt.Color; 
import java.awt.Graphics2D; 
import java.awt.GridLayout; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JTextArea; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 
import javax.swing.UIManager.LookAndFeelInfo; 

public class TestNimbusUIManagerTextArea { 

    private static JFrame frame = new JFrame("Nimbus UIDeafaults"); 
    private JTextArea testEnableTextArea = new JTextArea("enabled JTextArea"); 
    private JTextArea testDisableTextArea = new JTextArea("disabled JTextArea"); 

    public TestNimbusUIManagerTextArea() { 
     testDisableTextArea.setEnabled(false); 
     frame.setLayout(new GridLayout(2, 0, 20, 20)); 
     frame.add(testEnableTextArea); 
     frame.add(testDisableTextArea); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocation(200, 105); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    private static void customizeNimbusLaF() { 
     UIManager.getLookAndFeelDefaults().put(
       "TextArea[Enabled+NotInScrollPane].backgroundPainter", 
       new FillPainter(new Color(127, 255, 191))); 
     UIManager.getLookAndFeelDefaults().put(
       "TextArea[Disabled+NotInScrollPane].backgroundPainter", 
       new FillPainter(new Color(127, 255, 191))); 
     SwingUtilities.updateComponentTreeUI(frame); 
    } 

    public static void main(String arg[]) { 
     try { 
      for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) { 
       if ("Nimbus".equals(info.getName())) { 
        UIManager.setLookAndFeel(info.getClassName()); 
        customizeNimbusLaF();     
        break; 
       } 
      } 
     } catch (Exception e) { 
     } 
     java.awt.EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       TestNimbusUIManagerTextArea tNUIM = new TestNimbusUIManagerTextArea(); 
      } 
     }); 
    } 
} 

class FillPainter implements Painter<JComponent> { 

    private final Color color; 

    FillPainter(Color c) { 
     color = c; 
    } 

    @Override 
    public void paint(Graphics2D g, JComponent object, int width, int height) { 
     g.setColor(color); 
     g.fillRect(0, 0, width - 1, height - 1); 
    } 
} 
+0

Cảm ơn mã, nhưng đây không phải là điều tôi muốn. Tôi chỉ muốn làm cho các khu vực văn bản không thể chỉnh sửa (không bị tắt) có cùng nền với nền bị vô hiệu hóa (mặc định Nimbus). Ngoài ra, 'Painter' không phải là một API công khai, do đó, nó không phải là một thực hành tốt để tùy chỉnh Nimbus như thế này. –

+0

trong trường hợp bạn JTextArea.setEditable (false), sau đó không có gì xảy ra, Màu sắc vẫn không thay đổi, sử dụng (không cho Nimbus) cho JTextComponent chỉ – mKorbel

+0

+1, Nimbus phức tạp hơn các LAF khác. Có vẻ như tôi cần cập nhật UIManagerDefaults để bao gồm cú pháp Nimbus mới cho các thuộc tính. – camickr