【发布时间】:2016-03-20 13:44:39
【问题描述】:
我正在创建一个由可滚动文本区域组成的非常简单的 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 行而不是像素(不平滑)。快速滚动时也会闪烁白色(重绘问题?)。
在视口中添加 textArea
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 上。
我的问题是如何使它平滑滚动(逐个像素)而不会闪烁白色且不会出现打印错误?
【问题讨论】: