如果我将JTable添加到JPanel,然后将该JPanel添加到JScrollPane,则每当JTable获得焦点时,滚动窗格就会自动滚动到最底部,这是不好的。
我这样做的原因有很多,所以我希望有某种解决方案来停止这种自动滚动。
哦,这里的kicker...It似乎只有在通过JNLP/WebStart运行应用程序时才会发生,而在Eclipse中却不会发生,这更令人沮丧。
这里有一个简单的示例,如果您通过JLNP启动,单击文本字段,单击表格,然后它会自动滚动到底部:
import java.awt.*;
import javax.swing.*;
public class ScrollDemo extends JPanel{
private static final long serialVersionUID = 1L;
public ScrollDemo()
{
this.setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
JTable table = new JTable(100,6);
this.add(new JTextField());
JPanel panel = new JPanel();
panel.add(table);
JScrollPane scroll = new JScrollPane(panel);
this.add(scroll);
}
/**
* Create the GUI and show it. For thread safety, this method should be
* invoked from the event-dispatching thread.
*/
private static void createAndShowGUI() {
// Create and set up the window.
JFrame frame = new JFrame("ScrollDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Create and set up the content pane.
JComponent newContentPane = new ScrollDemo();
newContentPane.setOpaque(true); // content panes must be opaque
frame.setContentPane(newContentPane);
frame.setPreferredSize(new Dimension(500, 500));
// Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
// Schedule a job for the event-dispatching thread:
// creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}发布于 2011-11-30 11:11:35
我无法重现这个问题,但我可以提供一些观察结果:
对于框架的add()方法,请将组件转发到设置框架首选大小的代码。如果不需要的滚动是由于更新表的模型造成的,请参见how to temporarily scrolling.
add() contentPane setPreferredScrollableViewportSize()
setPreferredScrollableViewportSize()>d16> is superfluous.

import java.awt.*;
import javax.swing.*;
/** @see https://stackoverflow.com/questions/8319388 */
public class ScrollDemo extends JPanel {
public ScrollDemo() {
this.setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
JTable table = new JTable(100, 6);
table.setPreferredScrollableViewportSize(new Dimension(320, 240));
this.add(new JTextField());
this.add(new JScrollPane(table));
}
private static void createAndShowGUI() {
// Create and set up the window.
JFrame frame = new JFrame("ScrollDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Create and set up the content pane.
frame.add(new ScrollDemo());
frame.pack();
// Display the window.
frame.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
createAndShowGUI();
}
});
}
}发布于 2012-02-11 06:02:50
为了防止有人关心,问题是eclipse启动程序和JNLP启动程序有一个不同的KeyboardFocusManager,而JNLP one有一些奇怪的地方。
我不知道在JLNP端添加了自定义KeyboardFocusManager,但至少它解释了一些事情。
谢谢大家。
发布于 2011-12-01 04:55:52
当我把它们放在中间的JPanel上而不是直接放在JScrollPane的视窗中时,我在JTables上遇到了自动滚动问题。在这些情况下,删除无关的面板并将表直接放在滚动窗格上就解决了我的问题。
https://stackoverflow.com/questions/8319388
复制相似问题