Swing:如何绘制焦点矩形,就像当前的LAF一样?

3

这可能是一个冒险的尝试,但有没有人知道一种方法来绘制虚线焦点矩形在我的自定义组件上,就像当前的LAF组件一样?我正在编写一个自定义组件,希望它的UI代理看起来非常像Windows 7 LAF。谢谢。

3个回答

4

要绘制类似虚线的边框,请使用 Border 类。

  import java.awt.Graphics;
  import java.awt.Insets;
  import javax.swing.UIManager;
  import javax.swing.border.Border;
  import java.awt.Component;


  public class DashedBorder implements Border {

    private static Insets EMPTY = new Insets(0,0,0,0);

    @Override
    public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
      int vx, vy;

      g.setColor(UIManager.getDefaults().getColor("Button.focus"));

      // draw upper and lower horizontal dashes
      for (vx = x; vx < (x + width); vx += 2) {
        g.fillRect(vx, y, 1, 1);
        g.fillRect(vx, y + height - 1, 1, 1);
      }

      // draw left and right vertical dashes
      for (vy = y; vy < (y + height); vy += 2) {
        g.fillRect(x, vy, 1, 1);
        g.fillRect(x + width - 1, vy, 1, 1);
      }
    }

    @Override
    public Insets getBorderInsets(Component c) {
      return EMPTY;
    }

    @Override
    public boolean isBorderOpaque() {
      return false;
    }
  }

实际上,我对此很好奇。我在常见问题解答中没有看到任何反对回答旧的、未被回答的问题的内容。这个问题仍然没有官方答案。我使用了不同的解决方案,并没有重新访问下面Rastislav的答案,这可能是官方答案。然而,上面/这里的答案与我尝试提出的问题略有不同 ;) - Vimes
感谢 UIManager.getDefaults().getColor("Button.focus")。我并不需要任何自定义绘制,所以我只是使用了从 UIManager 获取的颜色来创建一个 BorderFactory.createLineBorder - LoKi

2

这可能有些棘手,但是可以做到。例如,看一下WindowsButtonUI。那里有一个叫做paintFocus的方法,所有需要的信息都在那里了。正如您所看到的,所有值都是使用UIManager.get*(string)方法读取的,其中string的格式为button.*。这是UI默认表中常用的约定。


这听起来很像我正在寻找的东西。我会尽快深入研究并查看一下。 - Vimes

1

感谢您的回复。它可能会或可能不会使用虚线。如果外观稍后进行了调整,那该怎么办?我将不得不玩猫捉老鼠的游戏。我希望有一种公开可见的方法来绘制我的组件以被停用,就像当前的外观和感觉(无论是什么)一样。这可能是一厢情愿的想法。 - Vimes
如果你想让你的自定义组件在任何LAF上看起来正确,那么我很抱歉这是不可能的。但是可以编写特定于特定LAF的UI以使其看起来正确。 - Eugene Ryzhikov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接