gpt4 book ai didi

java - Swing:如何使JFrame滚动流畅?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:06:29 25 4
gpt4 key购买 nike

我正在创建一个非常简单的 Swing GUI,其中包含一个可滚动的文本区域。但是,我在 UI 的响应能力方面遇到了一些问题。这是我用来尝试一些不同配置的类:

public class ComponentSample {
public void createWindow() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
TextArea textArea = new TextArea(getFillerText(), 40, 120);

setViews(frame, textArea);

frame.pack();
frame.setVisible(true);
}

private void setViews(JFrame frame, TextArea textArea) {
...
}

private String getFillerText() {
String threeLines = "Why isn't scrolling smooth? \nSteve Jobs would not approve\n\n";
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < 100; i++) {
stringBuilder.append(threeLines);
}
return stringBuilder.toString();
}

public static void main(String[] args) throws Exception {
SwingUtilities.invokeLater(
() -> new ComponentSample().createWindow()
);
}
}

在这里,我为 setViews() 方法尝试了几种不同的方法体,结果如下:

在 JPanel 中添加 textArea

    JPanel panel = new JPanel();
panel.add(textArea);
frame.add(panel);

滚动 1 或 2 行而不是像素(不平滑)。快速滚动时也会闪烁白色(重绘问题?)。

在视口(viewport)中添加文本区域

    JViewport viewport = new JViewport();
viewport.setView(textArea);
frame.add(viewport);

与 JPanel 相同的结果。

直接添加textArea

    frame.add(textArea);

与 JPanel 相同的结果。

在 ScrollPane 中添加 textArea

    JScrollPane scrollPane = new JScrollPane(textArea);
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
frame.add(scrollPane);

似乎无法正确处理滚动 - 它不响应滚轮(仅单击滚动条)。滚动 ~0.5 行而不是像素。

此外,在上述每种情况下,当用鼠标拖动滚动条时,它会将以下内容(错误?IDEA 以红色显示)打印到标准输出:

2016-03-17 09:45:33.413 java[40977:2845515] inOptions: {
JavaCUIThumbStartKey = 0;
"is.flipped" = 0;
kCUIOrientationKey = kCUIOrientVertical;
kCUIThumbProportionKey = "0.1328903585672379";
max = 0;
pressedpart = 0;
state = normal;
value = 0;
widget = scrollbar;
}
2016-03-17 09:45:33.413 java[40977:2845515] inOptions: {
JavaCUIThumbStartKey = 0;
"is.flipped" = 0;
kCUIOrientationKey = kCUIOrientVertical;
kCUIThumbProportionKey = "0.1328903585672379";
max = 0;
pressedpart = 0;
state = normal;
value = 0;
widget = scrollbar;
}
2016-03-17 09:45:33.414 java[40977:2845515] outHitPart = 0

如果重要的话,我在 OS X 上。

我的问题是如何让它平滑滚动(逐个像素)而不闪烁白色且没有打印错误?

最佳答案

不要使用作为 AWT 组件的 TextArea。

相反,您应该使用 JTextArea,它是 Swing 组件。

基本代码是:

JTextArea textArea = new JTextArea(5, 20);
JScrollPane scrollPane = new JScrollPane( textArea );
frame.add( scrollPane );

编辑:

it still scrolls by full rows instead of by pixel

滚动 Pane 支持单元滚动和 block 滚动的概念。 JTextArea 的单位滚动是一行文本, block 滚动是视口(viewport)窗口的大小。使用鼠标时,滚动(在 Windows 中)基于单位滚动的倍数,在我的组件上是 3 * 单位滚动。

如果您担心鼠标滚轮的滚动量,那么也许您可以使用 Mouse Wheel Controller这允许您将乘数更改为不同的值。所以你可以将它设置为 1。

如果您关心的是实际单位增量,那么您可以使用以下方法更改默认值:

scrollPane.getVerticalScrollBar().setUnitIncrement(1);

关于java - Swing:如何使JFrame滚动流畅?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36066892/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com