2

如果我将 a 添加JTable到 aJPanel然后将其添加JPanel到 a JScrollPane,只要JTable获得焦点,滚动窗格就会自动滚动到最底部,这很糟糕。

我这样做有很多理由,所以我希望有某种解决方案来阻止这种自动滚动。

哦,这是踢球者......它似乎只在通过 运行应用程序时发生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();
        }
    });
}
}
4

5 回答 5

2

我无法重现该问题,但我可以提供一些意见:

  1. 框架的add()方法将组件contentPane自动转发到。

  2. 不要设置框架的首选尺寸,而是setPreferredScrollableViewportSize()在桌子上使用。

  3. 如果不需要的滚动是由于更新表的模型,请参阅如何临时暂停滚动的示例。

  4. 感谢使用事件调度线程

  5. 附录:嵌套panel有一个(默认)FlowLayout是多余的。

在此处输入图像描述

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();
            }
        });
    }
}
于 2011-11-30T03:11:34.570 回答
1

以防万一有人关心,问题是应用程序的 eclipse 启动器和 JNLP 启动器有不同的 KeyboardFocusManager,而 JNLP 有一些怪癖。

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

感谢大家。

于 2012-02-10T22:02:50.453 回答
0

好吧,我最终不得不重新设计如何将对象添加到滚动窗格以避免这个问题。具体来说,如果表格要高于视口高度,那么我只需将表格直接添加到滚动窗格,然后更改我使用中间面板的方式。

感谢大家的意见!

于 2011-12-02T17:58:13.197 回答
0

当我将 JTables 放在中间 JPanel 上而不是直接将它们作为 JScrollPane 的视口放置时,我在 JTables 上遇到了自动滚动问题。在这些情况下,移除多余的面板并将表格直接放在滚动窗格上已经解决了我的问题。

于 2011-11-30T20:55:51.647 回答
-1

据此要为您更改选择,您JTable需要更改选择模型。尝试使用以下方法将所选项目设置为第一个项目。

ListSelectionModel selectionModel = table.getSelectionModel();
selectionModel.setSelectionInterval(start, end);

看看这是否将焦点放在顶部JTable

编辑:我以前没有这样做过,所以不确定开始和结束需要是什么,尝试 0,0 或 0,1 可能吗?

于 2011-11-30T02:14:59.823 回答