簡體   English   中英

Java Swing:整個ScrollBar的背景(不顯示)

[英]Java Swing: background of the whole ScrollBar (doesn't show up)

我正在開發一個 swing 應用程序(讓我們省略原因)。

我需要對滾動條進行自定義設計。 到目前為止一切順利,我實現了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) - 它不繪制背景

代碼被調用,我檢查了。 滾動條的內部元素 - 拇指,按鈕都很好。

滾動條,問題區域丑陋的圈出

我錯過了什么?

好的。 我的代碼中有 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);
    }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM