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



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

屏幕截图:窗口内只有100行文本,滚动条可见

屏幕截图:窗口内有1000行文本,滚动条不可见,但滚动条";背景";可见。

您的问题是类MyScrollBarUI的方法paintThumb()中的以下if

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

添加到JTextArea的行越多;拇指;即方法paintThumb()中的rectangle参数的高度和宽度。实际上,宽度保持恒定在12,但高度减小。在200行之后,高度变得小于宽度,因此从方法返回;拇指";。只需将if更改为:

if (!scrollBar.isEnabled()) {
return

最新更新