繁体   English   中英

JScrollPane 垂直滚动条的问题 - 它太小了

[英]Problem with JScrollPane Vertical Scrollbar- It's too small

目前我正在尝试编写一个具有 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();
    }
}

屏幕截图:window 中只有 100 行文本,滚动条可见

屏幕截图:window 中有 1000 行文本,滚动条不可见,但滚动条“背景”可见。

if在 class MyScrollBarUI的方法paintThumb()中,您的问题如下:

if (!scrollBar.isEnabled() || rectangle.width > rectangle.height) {
    return;

添加到JTextArea的行越多,“拇指”就变得越小,即方法paintThumb()rectangle参数的高度和宽度。 实际上,宽度保持不变为 12,但高度减小了。 在 200 行之后,高度变得小于宽度,因此您从该方法返回而不绘制“拇指”。 只需if其更改为:

if (!scrollBar.isEnabled()) {
    return

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM