Java JScrollBar自定义滚动条ui图形留下痕迹

Java JScrollBar自定义滚动条ui图形留下痕迹,java,swing,graphics2d,jscrollbar,Java,Swing,Graphics2d,Jscrollbar,我正在做一个定制的JScrollBar ScrollBar.java public class ScrollBar extends JScrollBar { ScrollBar() { super(); setUI(new CustomScrollBarUI()); } } public class CustomScrollBarUI extends BasicScrollBarUI { @Override protected v

我正在做一个定制的JScrollBar

ScrollBar.java

public class ScrollBar extends JScrollBar {
    ScrollBar() {
        super();
        setUI(new CustomScrollBarUI());
    }
}
public class CustomScrollBarUI extends BasicScrollBarUI {
    @Override
    protected void paintTrack(Graphics g, JComponent c, Rectangle trackBounds) {
        Graphics2D g2d = (Graphics2D) g;
        g.setColor(Color.BLACK);
        g2d.fill(trackBounds);
        g2d.draw(trackBounds);
    }
    @Override
    protected void paintThumb(Graphics g, JComponent c, Rectangle thumbBounds) {
        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(Color.WHITE);
        g2d.fill(thumbBounds);
        g2d.draw(thumbBounds);
    }
}
public class CustomScrollBarUI extends BasicScrollBarUI {
    @Override
    protected void paintTrack(Graphics g, JComponent c, Rectangle trackBounds) {
        Graphics2D g2d = (Graphics2D) g;
        g.setColor(Color.BLACK);
        g2d.fill(trackBounds);
        g2d.draw(trackBounds);
    }
    @Override
    protected void paintThumb(Graphics g, JComponent c, Rectangle thumbBounds) {
        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(Color.WHITE);
        g2d.fill(thumbBounds);
//      g2d.draw(thumbBounds);
    }
}
CustomScrollBarUI.java

public class ScrollBar extends JScrollBar {
    ScrollBar() {
        super();
        setUI(new CustomScrollBarUI());
    }
}
public class CustomScrollBarUI extends BasicScrollBarUI {
    @Override
    protected void paintTrack(Graphics g, JComponent c, Rectangle trackBounds) {
        Graphics2D g2d = (Graphics2D) g;
        g.setColor(Color.BLACK);
        g2d.fill(trackBounds);
        g2d.draw(trackBounds);
    }
    @Override
    protected void paintThumb(Graphics g, JComponent c, Rectangle thumbBounds) {
        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(Color.WHITE);
        g2d.fill(thumbBounds);
        g2d.draw(thumbBounds);
    }
}
public class CustomScrollBarUI extends BasicScrollBarUI {
    @Override
    protected void paintTrack(Graphics g, JComponent c, Rectangle trackBounds) {
        Graphics2D g2d = (Graphics2D) g;
        g.setColor(Color.BLACK);
        g2d.fill(trackBounds);
        g2d.draw(trackBounds);
    }
    @Override
    protected void paintThumb(Graphics g, JComponent c, Rectangle thumbBounds) {
        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(Color.WHITE);
        g2d.fill(thumbBounds);
//      g2d.draw(thumbBounds);
    }
}
但是,向下滚动时会留下白色痕迹,向上滚动时会清除

我试过很多东西

  • 添加
    super.method()
  • 所以我将
    super.paintThumb(g,c,thumbBounds)
    super.paintrack(g,c,trackBounds)
    添加到这两个函数中,但没有任何更改

  • 清除上一个矩形
  • 添加了一组变量来存储以前的位置

    double last_posx = -1d;
    double last_posy = -1d;
    double last_posw = -1d;
    double last_posh = -1d;
    
    然后清除上一个矩形

    if (last_posx != -1d) {
        g.clearRect((int) last_posx, (int) last_posy, (int) last_posw, (int) last_posh);
    }
    
    这会导致效果增加更多,因此会留下更多的白色

  • 重新粉刷轨道
  • 这一次我想到了我自己。因此,我添加了
    super.paintTrack(g,c,super.getTrackBounds())
    在绘制拇指之前重新绘制轨迹,以尝试清除之前的拇指

    这产生了与1相同的效果

    那么我该怎么做才能清除留下的白色痕迹呢

    编辑

    正如LuxxMiner提到的,这解决了问题,但我想知道为什么

    CustomScrollBarUI.java

    public class ScrollBar extends JScrollBar {
        ScrollBar() {
            super();
            setUI(new CustomScrollBarUI());
        }
    }
    
    public class CustomScrollBarUI extends BasicScrollBarUI {
        @Override
        protected void paintTrack(Graphics g, JComponent c, Rectangle trackBounds) {
            Graphics2D g2d = (Graphics2D) g;
            g.setColor(Color.BLACK);
            g2d.fill(trackBounds);
            g2d.draw(trackBounds);
        }
        @Override
        protected void paintThumb(Graphics g, JComponent c, Rectangle thumbBounds) {
            Graphics2D g2d = (Graphics2D) g;
            g2d.setColor(Color.WHITE);
            g2d.fill(thumbBounds);
            g2d.draw(thumbBounds);
        }
    }
    
    public class CustomScrollBarUI extends BasicScrollBarUI {
        @Override
        protected void paintTrack(Graphics g, JComponent c, Rectangle trackBounds) {
            Graphics2D g2d = (Graphics2D) g;
            g.setColor(Color.BLACK);
            g2d.fill(trackBounds);
            g2d.draw(trackBounds);
        }
        @Override
        protected void paintThumb(Graphics g, JComponent c, Rectangle thumbBounds) {
            Graphics2D g2d = (Graphics2D) g;
            g2d.setColor(Color.WHITE);
            g2d.fill(thumbBounds);
    //      g2d.draw(thumbBounds);
        }
    }
    

    我不知道为什么,但是删除了
    g2d.draw(thumbunds)为我修复了它…是的,这也为我修复了轨迹。也许它自己画出了指界?