我想基于每个组件设置JTextField的非活动背景色。 (在调用setEditable(false)时显示不活动的颜色)。

呼唤UIManager.put("TextField.inactiveBackground", new ColorUIResource(Color.YELLOW));在整个应用程序范围内设置无效颜色。

可以在Nimbus LAF下完成,如此处所示:http://docs.oracle.com/javase/7/docs/api/javax/swing/plaf/nimbus/package-summary.html。使用Windows LAF可以做类似的事情吗?

最佳答案

我找到了解决方案。并不是一个漂亮的解决方案,但是一个解决方案:

扩展JTextField类并重写paintComponent方法以绘制所需颜色的矩形。

class CustomTextField extends JTextField {
  private Color inactiveColor = UIManager.getColor("TextField.inactiveBackground");

  public void setDisabledBackgroundColor(Color inactiveColor) {
    this.inactiveColor = inactiveColor;
    repaint();
  }

  @Override
  protected void paintComponent(Graphics g) {
    if (!isEditable() || !isEnabled()) {
      setOpaque(false);
      g.setColor(inactiveColor);
      g.fillRect(0, 0, getWidth(), getHeight());
    } else {
      setOpaque(true);
    }
    super.paintComponent(g);
  }
}

07-27 14:01