Java JTextPane未显示正确的前景色
希望有一个JTextPane,其内容始终可以由用户选择。因此,我创建了自己的JTextPane子类,并始终在方法“isEnabled()”中返回true。此外,我还引入了一个新成员m_enabled,负责返回正确的前景色(启用/禁用) 现在的问题是前景色没有改变。文本窗格总是被禁用。然而,“getForeground”中的调试信息显示如下Java JTextPane未显示正确的前景色,java,swing,colors,jtextpane,Java,Swing,Colors,Jtextpane,希望有一个JTextPane,其内容始终可以由用户选择。因此,我创建了自己的JTextPane子类,并始终在方法“isEnabled()”中返回true。此外,我还引入了一个新成员m_enabled,负责返回正确的前景色(启用/禁用) 现在的问题是前景色没有改变。文本窗格总是被禁用。然而,“getForeground”中的调试信息显示如下 setting textpane enabled to true foreground color: javax.swing.plaf.ColorUIReso
setting textpane enabled to true
foreground color: javax.swing.plaf.ColorUIResource[r=0,g=0,b=0]
setting textpane enabled to false
foreground color: javax.swing.plaf.ColorUIResource[r=109,g=109,b=109]
在我看来这没问题,但文本窗格总是看起来很糟糕
你有什么想法吗?看起来你在
ActionListener
中缺少了一个repaint()
调用。我不能说更多,因为您没有MyPane类的可用代码:)super。getForeground()
在下一次调用中返回禁用的颜色,因为一旦将其设置为禁用的颜色,它也将传播到super类,如下所示:
下面是直接来自JComponent
public void setForeground(Color fg) {
Color oldFg = getForeground();
super.setForeground(fg);
if ((oldFg != null) ? !oldFg.equals(fg) : ((fg != null) && !fg.equals(oldFg))) {
// foreground already bound in AWT1.2
repaint();
}
}
无需重写getForeground()方法,只需从setEnabled()方法调用setForeground()方法即可 在更新前将默认前景色存储在某个位置,并在以后的调用中使用它 你能试试这个吗
class MyPane extends JTextPane {
private static final long serialVersionUID = 1L;
private boolean m_enabled = true;
private Color defaultForegroundColor, disabledTextColor;
public MyPane() {
defaultForegroundColor = getForeground();
disabledTextColor = getDisabledTextColor();
}
public void setEnabled(boolean enabled) {
m_enabled = enabled;
if (m_enabled) {
setForeground(defaultForegroundColor);
} else {
setForeground(disabledTextColor);
}
}
@Override
public boolean isEnabled() {
return true;
}
}
第三次单击按钮,您将发现它
前景颜色:javax.swing.plaf.ColorUIResource[r=109,g=109,b=109]
,用于所有后续单击。
class MyPane extends JTextPane {
private static final long serialVersionUID = 1L;
private boolean m_enabled = true;
private Color defaultForegroundColor, disabledTextColor;
public MyPane() {
defaultForegroundColor = getForeground();
disabledTextColor = getDisabledTextColor();
}
public void setEnabled(boolean enabled) {
m_enabled = enabled;
if (m_enabled) {
setForeground(defaultForegroundColor);
} else {
setForeground(disabledTextColor);
}
}
@Override
public boolean isEnabled() {
return true;
}
}