我正在创建一个非常简单的包含可滚动文本区域的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上.
我的问题是如何使它平滑地滚动(逐像素),而不会闪烁白色且没有打印错误?
解决方法:
不要使用作为AWT组件的TextArea.
相反,您应该使用Swing组件JTextArea.
基本代码是:
JTextArea textArea = new JTextArea(5, 20);
JScrollPane scrollPane = new JScrollPane( textArea );
frame.add( scrollPane );
编辑:
it still scrolls by full rows instead of by pixel
滚动窗格支持单位滚动和块滚动的概念. JTextArea的单位滚动是一行文本,而块滚动是视口窗口的大小.使用鼠标时,滚动(在Windows中)基于单位滚动的倍数,在我的组件上是3 *单位滚动.
如果您关心的是鼠标滚轮完成的滚动量,则可以使用Mouse Wheel Controller,它可以将乘数更改为其他值.因此,您可以将其设置为1.
如果您关注的是实际单位增量,则可以使用以下方法更改默认值:
scrollPane.getVerticalScrollBar().setUnitIncrement(1);
标签:swing,java,macos
来源: https://codeday.me/bug/20191027/1942802.html