Возьмите следующий пример кода.В Swing есть ошибка, из-за которой отключенные компоненты не отображаются как отключенные, если компонент содержит HTML.Помимо сообщения о проблеме, о которой, я надеюсь, коллега уже позаботился, есть ли хороший способ обойти эту проблему?
Какое бы решение я ни принял, я хочу, чтобы это было глобальным решением, а нечто-то, что нужно взломать в каждом флажке приложения.
Я попытался создать пользовательский интерфейс для флажка, который вызывает setForeground
до и после рисования, но получается, вызывая 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);
}
});
}
}