1 回答
TA贡献1900条经验 获得超5个赞
问题在于你如何操纵绘画。在changeColorOnFocus(由 调用FocusListener)方法内部有以下几行:
if (c.getGraphics() != null) {
c.paint(c.getGraphics());
}
在这里,您使用图形并在负责组件绘画层次结构中绘画的方法之外进行一种自定义绘画。我希望我能更好地解释它,但长话短说,Graphics只使用将它们作为参数提供给您的方法(并调用其super方法)。在UI类中方法是paintSafely,在组件中是paintComponent。它们都给你Graphics对象,因此它们适合定制绘画。
因此,解决方案是在您的内部FocusListener添加一个标志,以便了解组件是否获得焦点,并调用changeColorOnFocus内部paintSafely(Graphics g)方法。您的 UI 类应该在以下部分中进行更改(我不会全部粘贴,因为它有点大)。
private boolean focused; //a field
protected class FocusListenerColorLine implements FocusListener {
@Override
public void focusGained(FocusEvent e) {
firePropertyChange(PROPERTY_LINE_COLOR, colorLineInactive, colorLineActive);
focused = true;
}
@Override
public void focusLost(FocusEvent e) {
firePropertyChange(PROPERTY_LINE_COLOR, colorLineActive, colorLineInactive);
focused = false;
}
}
@Override
public void paintSafely(Graphics g) {
super.paintSafely(g);
paintLine(g);
changeColorOnFocus(g);
}
protected void changeColorOnFocus(Graphics g) {
boolean hasFocus = focused;
JTextComponent c = getComponent();
if (c == null) {
return;
}
if (hasFocus && (activeBackground != null) && (activeForeground != null)) {
logicForChangeColorOnFocus(c, activeBackground, activeForeground);
//TODO create a new changePropriety
paintLine(c.getGraphics());
}
if (!hasFocus && (inactiveBackground != null) && (inactiveForeground != null)) {
logicForChangeColorOnFocus(c, inactiveBackground, inactiveForeground);
paintLine(c.getGraphics());
}
}
添加回答
举报
