首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JScrollPane问题

JScrollPane问题
EN

Stack Overflow用户
提问于 2011-11-30 07:45:58
回答 5查看 897关注 0票数 2

如果我将JTable添加到JPanel,然后将该JPanel添加到JScrollPane,则每当JTable获得焦点时,滚动窗格就会自动滚动到最底部,这是不好的。

我这样做的原因有很多,所以我希望有某种解决方案来停止这种自动滚动。

哦,这里的kicker...It似乎只有在通过JNLP/WebStart运行应用程序时才会发生,而在Eclipse中却不会发生,这更令人沮丧。

这里有一个简单的示例,如果您通过JLNP启动,单击文本字段,单击表格,然后它会自动滚动到底部:

代码语言:javascript
复制
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();
        }
    });
}
}
EN

回答 5

Stack Overflow用户

发布于 2011-11-30 11:11:35

我无法重现这个问题,但我可以提供一些观察结果:

对于框架的add()方法,请将组件转发到设置框架首选大小的代码。如果不需要的滚动是由于更新表的模型造成的,请参见how to temporarily scrolling.

  • Kudos

  • using add() contentPane setPreferredScrollableViewportSize()

  • example a (default) <setPreferredScrollableViewportSize()>d16> is superfluous.

代码语言:javascript
复制
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();
            }
        });
    }
}
票数 2
EN

Stack Overflow用户

发布于 2012-02-11 06:02:50

为了防止有人关心,问题是eclipse启动程序和JNLP启动程序有一个不同的KeyboardFocusManager,而JNLP one有一些奇怪的地方。

我不知道在JLNP端添加了自定义KeyboardFocusManager,但至少它解释了一些事情。

谢谢大家。

票数 1
EN

Stack Overflow用户

发布于 2011-12-01 04:55:52

当我把它们放在中间的JPanel上而不是直接放在JScrollPane的视窗中时,我在JTables上遇到了自动滚动问题。在这些情况下,删除无关的面板并将表直接放在滚动窗格上就解决了我的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8319388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档