以下面的示例代碼。 Swing中存在一些錯誤,如果組件包含HTML,則不會將禁用的組件禁用爲禁用狀態。除了報告我希望一位同事已經關注的問題之外,是否有解決問題的好辦法?如何複製JCheckBox的禁用外觀?
無論我採取什麼解決方案,我都希望它成爲一個全局修復程序,而不是需要在應用程序中的每個複選框中被攻擊的東西。
我試圖使針對之前和噴漆後調用setForeground
的複選框自定義UI,但事實證明,通過調用setForeground
了,它會最終導致它調用repaint()
,它調用渲染事件。 ..
import java.awt.GridLayout;
import java.util.Arrays;
import javax.swing.BorderFactory;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class TestCheckBoxes extends JFrame
{
public TestCheckBoxes()
{
JCheckBox checkBox1 = new JCheckBox("Enabled, plain text");
JCheckBox checkBox2 = new JCheckBox("<html><p>Enabled, HTML");
JCheckBox checkBox3 = new JCheckBox("Disabled, plain text");
checkBox3.setEnabled(false);
JCheckBox checkBox4 = new JCheckBox("<html><p>Disabled, HTML");
checkBox4.setEnabled(false);
setLayout(new GridLayout(4, 1));
for (JCheckBox checkBox : Arrays.asList(checkBox1, checkBox2, checkBox3, checkBox4))
{
checkBox.setBorder(BorderFactory.createEmptyBorder(8, 8, 8, 8));
add(checkBox);
}
((JComponent) getContentPane()).setBorder(BorderFactory.createEmptyBorder(8, 8, 8, 8));
pack();
}
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
TestCheckBoxes frame = new TestCheckBoxes();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}
爲什麼你要HTML的任何具體原因?從上面的代碼片斷,我找不到任何。 – Nivas 2010-06-28 09:27:46
這只是一個複製問題的最小示例。真正的應用程序有一個大膽的詞來強調它,因爲有兩個相似的外觀複選框並排。 – Trejkaz 2010-06-28 22:59:34