Java JScrollPane垂直滚动条出现问题-It';太小了

Java JScrollPane垂直滚动条出现问题-It';太小了,java,swing,user-interface,scroll,Java,Swing,User Interface,Scroll,目前我正在尝试编写一个有2个滚动条的应用程序。我遇到了一个问题,如果你有超过200行,滚动条就会消失。如果有人能帮我设置滚动条高度的最小值,我将不胜感激 下面,我将代码与滚动条(深灰色)的照片一起包括在可见和不可见的情况下: import java.awt.Color; import java.awt.Container; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import

目前我正在尝试编写一个有2个滚动条的应用程序。我遇到了一个问题,如果你有超过200行,滚动条就会消失。如果有人能帮我设置滚动条高度的最小值,我将不胜感激

下面,我将代码与滚动条(深灰色)的照片一起包括在可见和不可见的情况下:

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ScrollPaneLayout;
import javax.swing.WindowConstants;
import javax.swing.plaf.basic.BasicScrollBarUI;
import javax.swing.JViewport;

public class Main {
    public static void main(String[] args) {
        JTextArea cmp = new JTextArea();
        for (int i = 0; i < 100; i++) {
            cmp.append(Integer.toString(i) + "\n");
        }

        JScrollPane scrollPane = new JScrollPane(cmp);
        scrollPane.setComponentZOrder(scrollPane.getVerticalScrollBar(), 0);
        scrollPane.setComponentZOrder(scrollPane.getViewport(), 1);
        scrollPane.getVerticalScrollBar().setOpaque(true);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        scrollPane.getViewport().setScrollMode(JViewport.SIMPLE_SCROLL_MODE); // Remove scrollbar glitching

        scrollPane.setLayout(new ScrollPaneLayout() {
            @Override
            public void layoutContainer(Container parent) {
                JScrollPane scrollPane = (JScrollPane) parent;

                Rectangle availR = scrollPane.getBounds();
                // availR.x = availR.y = 0;

                Insets parentInsets = parent.getInsets();
                availR.x = parentInsets.left;
                availR.y = parentInsets.top;
                availR.width -= parentInsets.left + parentInsets.right;
                availR.height -= parentInsets.top + parentInsets.bottom;

                Rectangle vsbR = new Rectangle(); // Rectangle behind the scrollbar thumb?
                vsbR.width = 12;
                vsbR.height = availR.height;
                vsbR.x = availR.x + availR.width - vsbR.width;
                vsbR.y = availR.y;

                if (viewport != null) {
                    viewport.setBounds(availR);
                }
                if (vsb != null) {
                    vsb.setVisible(true);
                    vsb.setBounds(vsbR);
                }
            }
        });
        scrollPane.getVerticalScrollBar().setUI(new MyScrollBarUI());

        JFrame f = new JFrame();
        f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        f.getContentPane().add(scrollPane);
        f.setSize(320, 240);
        f.setVisible(true);
    }
}

class MyScrollBarUI extends BasicScrollBarUI {
    private final Dimension d = new Dimension();

    @Override
    protected JButton createDecreaseButton(int orientation) {
        return new JButton() {
            @Override
            public Dimension getPreferredSize() {
                return d;
            }
        };
    }

    @Override
    protected JButton createIncreaseButton(int orientation) {
        return new JButton() {
            @Override
            public Dimension getPreferredSize() {
                return d;
            }
        };
    }

    @Override
    protected void paintTrack(Graphics g, JComponent component, Rectangle rectangle) {
        // paint the track?????????
    }

    @Override
    protected void paintThumb(Graphics g, JComponent component, Rectangle rectangle) {
        Graphics2D g2d = (Graphics2D) g.create();
        g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
        g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE);
        g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
        g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
        g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);

        Color color = null;
        JScrollBar scrollBar = (JScrollBar) component;
        if (!scrollBar.isEnabled() || rectangle.width > rectangle.height) {
            return;
        } else if (isDragging) {
            color = Color.DARK_GRAY;
        } else if (isThumbRollover()) {
            color = Color.LIGHT_GRAY;
        } else {
            color = Color.GRAY;
        }

        g2d.setPaint(color);
        g2d.fillRoundRect(rectangle.x, rectangle.y, rectangle.width, rectangle.height, 10, 10);
        g2d.setPaint(Color.WHITE); // Set the border color
        g2d.drawRoundRect(rectangle.x, rectangle.y, rectangle.width, rectangle.height, 10, 10);
        g2d.dispose();
    }

    @Override
    protected void setThumbBounds(int x, int y, int width, int height) {
        super.setThumbBounds(x, y, width, height);
        scrollbar.repaint();
    }
}
导入java.awt.Color;
导入java.awt.Container;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Insets;
导入java.awt.Rectangle;
导入java.awt.RenderingHints;
导入javax.swing.JButton;
导入javax.swing.JComponent;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JScrollBar;
导入javax.swing.JScrollPane;
导入javax.swing.JTextArea;
导入javax.swing.ScrollPaneLayout;
导入javax.swing.WindowConstants;
导入javax.swing.plaf.basic.BasicScrollBarUI;
导入javax.swing.JViewport;
公共班机{
公共静态void main(字符串[]args){
JTextArea cmp=新的JTextArea();
对于(int i=0;i<100;i++){
append(Integer.toString(i)+“\n”);
}
JScrollPane scrollPane=新的JScrollPane(cmp);
scrollPane.setComponentZOrder(scrollPane.getVerticalScrollBar(),0);
scrollPane.setComponentZOrder(scrollPane.getViewport(),1);
scrollPane.getVerticalScrollBar().Set不透明(true);
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL\u SCROLLBAR\u ALWAYS);
scrollPane.getViewport().setScrollMode(JViewport.SIMPLE_SCROLL_MODE);//删除滚动条闪烁
scrollPane.setLayout(新的ScrollPanel布局(){
@凌驾
公共无效布局容器(容器父级){
JScrollPane scrollPane=(JScrollPane)父级;
Rectangle availR=scrollPane.getBounds();
//可用性x=可用性y=0;
Insets parentInsets=parent.getInsets();
availR.x=parentInsets.left;
availR.y=parentInsets.top;
availR.width-=parentInsets.left+parentInsets.right;
availR.height-=parentInsets.top+parentInsets.bottom;
矩形vsbR=new Rectangle();//滚动条拇指后面的矩形?
vsbR.width=12;
vsbR.height=可用高度;
vsbR.x=availR.x+availR.width-vsbR.width;
vsbR.y=可用y;
如果(视口!=null){
viewport.setBounds(可用);
}
如果(vsb!=null){
vsb.setVisible(真);
vsb.立根(vsbR);
}
}
});
scrollPane.getVerticalScrollBar().setUI(新的MyScrollBarUI());
JFrame f=新的JFrame();
f、 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f、 getContentPane().add(滚动窗格);
f、 设置大小(320240);
f、 setVisible(真);
}
}
类MyScrollBarUI扩展了BasicScrollBarUI{
私有最终维度d=新维度();
@凌驾
受保护的JButton createDecreaseButton(int方向){
返回新的JButton(){
@凌驾
公共维度getPreferredSize(){
返回d;
}
};
}
@凌驾
受保护的JButton createIncreaseButton(int方向){
返回新的JButton(){
@凌驾
公共维度getPreferredSize(){
返回d;
}
};
}
@凌驾
受保护的void paintrack(图形g、JComponent组件、矩形){
//在轨道上刷油漆?????????
}
@凌驾
受保护的void paintThumb(图形g、JComponent组件、矩形){
Graphics2D g2d=(Graphics2D)g.create();
g2d.setRenderingHint(RenderingHits.KEY\u ALPHA\u插值,RenderingHits.VALUE\u ALPHA\u插值\u质量);
g2d.setRenderingHint(renderingHits.KEY\u抗锯齿,renderingHits.VALUE\u抗锯齿\u开启);
g2d.setRenderingHint(RenderingHints.KEY\u COLOR\u RENDERING,RenderingHints.VALUE\u COLOR\u RENDER\u QUALITY);
g2d.setRenderingHint(renderingHits.KEY\u抖动,renderingHits.VALUE\u抖动\u启用);
g2d.setRenderingHint(renderingHits.KEY_分数矩阵,renderingHits.VALUE_分数矩阵开);
g2d.setRenderingHint(RenderingHits.KEY\u插值,RenderingHits.VALUE\u插值\u双线性);
g2d.setRenderingHint(renderingHits.KEY_RENDERING,renderingHits.VALUE_RENDER_QUALITY);
g2d.setRenderingHint(renderingHits.KEY\u STROKE\u控件,renderingHits.VALUE\u STROKE\u PURE);
颜色=空;
JScrollBar滚动条=(JScrollBar)组件;
如果(!scrollBar.isEnabled()| | rectangle.width>rectangle.height){
返回;
}else if(IsDraging){
颜色=颜色。深灰色;
}else if(isThumbRollover()){
颜色=颜色。浅灰色;
}否则{
颜色=颜色。灰色;
}
g2d.setPaint(颜色);
g2d.fillRoundRect(矩形.x,矩形.y,矩形.width,矩形.height,10,10);
g2d.setPaint(Color.WHITE);//设置边框颜色
g2d.drawRoundRect(矩形.x,矩形.y,矩形.width,矩形.height,10,10);
g2d.dispose();
}
@凌驾
受保护的void setThumbBounds(整数x、整数y、整数宽度、整数高度){
super.setThumbBounds(x,y,宽度,高度);
scrollbar.repaint();
}
}


您的问题是,如果类
MyScrollBarUI
的方法
paintThumb()
中出现以下
if

if(!scrollBar.isEnabled()| | rectangle.width>rectangle.height){
返回;
添加到
JTextArea
的行越多,“thumb”越小,即