2009-11-02 39 views
8

Tôi muốn thay đổi biểu tượng được chọn cho một JCheckbox thành một biểu tượng khác, ví dụ như biểu tượng đã chọn bị tắt cho JCheckbox. Làm thế nào tôi có thể nhận được biểu tượng đã chọn bị vô hiệu hóa từ UIManager?Truy cập giao diện mặc định của giao diện?

Tôi đã thử UIManager.getIcon("CheckBoxUI.disabledSelectedIcon"); Đó có phải là tên thuộc tính biểu tượng sai hoặc chỉ là sai cách để truy cập tài nguyên đó?

Trả lời

3

Nhìn qua mã cho AbstractButton, có vẻ như disabledSelectedIcon có nguồn gốc từ selectedIcon, trừ khi được chỉ định trên AbstractButton (hoặc JCheckBox trong trường hợp này) thông qua setDisabledSelectedIcon. Với trường hợp này, gọi UIManager.getIcon ("...") sẽ không trả lại đối tượng bạn đang tìm kiếm.

EDIT:

Lưu ý rằng một JCheckBox có một trường icon theo quy định tại AbstractButton API, giống như một JButton có thể có một biểu tượng. Nó là một hình ảnh được hiển thị bên cạnh văn bản và tách biệt với biểu tượng hộp 'đã chọn' hoặc 'không được chọn' mà bạn có thể đang đề cập đến.

Biểu tượng kiểm tra/bỏ chọn được xử lý bởi một lớp duy nhất, được tìm thấy với UIManager.getObject('CheckBox.icon'). Nó là một phân lớp Icon và xử lý cả bức tranh của trạng thái được chọn và không được kiểm tra của nó. Bạn có thể xem các ví dụ về nó trong các lớp học [L&F name]IconFactory khác nhau.

+1

Chỉ yêu cầu cho selectedIcon, CheckBox.selectedIcon hoặc CheckBoxUI.selectedIcon, tất cả trả về null. –

+0

Câu trả lời của bạn đã truyền cảm hứng cho tôi để tìm hiểu sâu hơn về gói Synth để tìm hiểu cách biểu tượng chuẩn được chuyển đổi. Cảm ơn. –

8

Dường như không có mặc định. Ít nhất, không phải khi tôi đang cố gọi nó.

Chỉ bán phá giá các phím từ UIManager.getLookAndFeelDefaults().keys() tạo ra sau nếu phím chứa CheckBox:

CheckBox.foreground 
CheckBox.border 
CheckBox.totalInsets 
CheckBox.background 
CheckBox.disabledText 
CheckBox.margin 
CheckBox.rollover 
CheckBox.font 
CheckBox.gradient 
CheckBox.focus 
CheckBox.icon 
CheckBox.focusInputMap 

Sau khi đọc akf's answer, tôi bắt đầu đào bới mã UIManager trong các gói plaf.synth và thấy cuộc gọi mà chủ yếu ủy null disableCheckedIcon để xem và cảm nhận các lớp học để cố gắng chuyển đổi các tiêu chuẩn .icon sang một phiên bản màu xám. Vì vậy, tôi đã kết thúc với điều này:

Icon checkedIcon = UIManager.getIcon("CheckBox.icon"); 
Icon dsiabledCheckedIcon = 
    UIManager.getLookAndFeel(). 
     getDisabledSelectedIcon(new JCheckBox(), checkedIcon); 
Các vấn đề liên quan