【问题标题】:Java Swing: background of the whole ScrollBar (doesn't show up)Java Swing:整个 ScrollBar 的背景(不显示)
【发布时间】:2021-05-27 02:42:39
【问题描述】:

我正在开发一个摇摆应用程序(让我们省略原因)。

我需要对滚动条进行自定义设计。到目前为止一切顺利,我实现了 ScrollBarUI 的后代 - 我有自定义按钮、自定义拇指、自定义轨道......除了按钮周围的区域 - 我在那里添加了一些填充,我想换行我所有的滚动条都变成了一个圆角矩形。

由于我还没有找到在 ScrollBarUI 中执行此操作的方法,因此我决定扩展 JScrollPane(以扩展那里使用的 ScrollBar,这样我就可以绘制圆形paintComponent 中的矩形)。这是我做的:

public class MyScrollPane extends JScrollPane {
  public MyScrollPane(Component view) {
    super(view);
  }

  @Override
  public JScrollBar createVerticalScrollBar() {
    return new MyScrollBar(JScrollBar.VERTICAL);
  }

  @Override
  public JScrollBar createHorizontalScrollBar() {
    return new MyScrollBar(JScrollBar.HORIZONTAL);
  }

  protected class MyScrollBar extends ScrollBar {
    public MyScrollBar(int orientation) {
      super(orientation);
      setUI(MyScrollBarUI.createUI(this));
      setOpaque(true);
    }

    public void paintComponent(Graphics g) {
      super.paintComponent(g);

      Graphics2D g2 = (Graphics2D) g;

      int borderDiameterX = 32;
      int borderDiameterY = 32;
  
      g2.translate(this.getX(), this.getY());
      g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
      g2.setColor(Color.gray);
      g2.fillRoundRect(0, 0, getWidth() - 1, getHeight() - 1, borderDiameterX, borderDiameterY);
      g2.translate(-this.getX(), -this.getY());
    }
  }
}

很遗憾,这不起作用:

  • 如果setOpacity(true) - 它会在按钮周围绘制默认颜色的正方形
  • 如果setOpacity(false) - 它不绘制背景

代码被调用,我检查了。滚动条的内部元素-拇指,按钮都很好。

我错过了什么?

【问题讨论】:

  • Nimbus look and feel 具有圆形滚动条。您是否查看了代码以了解他们是如何做到的?据我所知,您只需要更改 UI 类即可更改外观。
  • @Abra 不。谢谢,我去看看。

标签: java swing scrollbar styling


【解决方案1】:

好的。我的代码中有 3 个问题。

  1. setOpacity 必须是 false 以防止内置背景绘图。
  2. g2.translate - 不需要,从 ScrollBarUI 代码中盲目复制
  3. super.paintComponent(g) - 我将它移到了我的paintComponent 的末尾,否则在 MyScrollBarUI 中的绘制在我绘制的背景后面。

所以现在看起来像这样:

public class MyScrollPane extends JScrollPane {
  public MyScrollPane(Component view) {
    super(view);
  }

  @Override
  public JScrollBar createVerticalScrollBar() {
    return new MyScrollBar(JScrollBar.VERTICAL);
  }

  @Override
  public JScrollBar createHorizontalScrollBar() {
    return new MyScrollBar(JScrollBar.HORIZONTAL);
  }

  protected class MyScrollBar extends ScrollBar {
    public MyScrollBar(int orientation) {
      super(orientation);
      setUI(MyScrollBarUI.createUI(this));
      setOpaque(false);
    }

    public void paintComponent(Graphics g) {
      Graphics2D g2 = (Graphics2D) g;

      int borderDiameter = 32;

      g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
      g2.setColor(Color.gray);
      g2.fillRoundRect(0, 0, getWidth() - 1, getHeight() - 1, borderDiameter, borderDiameter);

      super.paintComponent(g);
    }
  }
}

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 2012-11-08
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    相关资源
    最近更新 更多