gpt4 book ai didi

java - JScrollPane 问题

转载 作者:行者123 更新时间:2023-11-30 09:43:25 24 4
gpt4 key购买 nike

如果我将 JTable 添加到 JPanel,然后将该 JPanel 添加到 JScrollPane,无论何时JTable 获得焦点,滚动 Pane 自动滚动到最底部,这是不好的。

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

哦,更重要的是......它似乎只在通过 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();
}
});
}
}

最佳答案

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

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

  2. 不要设置框架的首选大小,而是在表格上使用 setPreferredScrollableViewportSize()

  3. 如果不需要的滚动是由于更新表的模型引起的,请参阅此 example如何暂时停止滚动。

  4. 感谢使用 event dispatch thread .

  5. 附录:具有(默认)FlowLayout 的嵌套面板 是多余的。

enter image description here

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();
}
});
}
}

关于java - JScrollPane 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8319388/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com