Java swing - 可滚动GridLayout中的项目不可见

时间:2016-07-18 12:53:04

标签: java swing

我正在尝试创建一个简单的Swing UI,它显示一个文本区域列表,所有这些都在彼此之下。 我想要一个滚动条,允许我在列表中垂直滚动。

但是,我似乎无法使网格中的条目可见并保持这种状态。

似乎条目出现了几分之一秒然后再次消失。我根本无法理解它。

这是我的代码:

public class MyWindow extends JFrame {
JPanel stretchPanel;
JScrollPane scrollpane;
JPanel centrePanel;
JScrollBar scrollbar;

public MyWindow(String title) {
    super(title);
    BorderLayout layout = new BorderLayout();
    setLayout(layout);

    stretchPanel = new JPanel();
    scrollpane = new JScrollPane();
    stretchPanel.setLayout(new FlowLayout());
    centrePanel = new JPanel();
    centrePanel.setLayout(new GridLayout(0, 1));
    scrollbar = new JScrollBar(JScrollBar.VERTICAL);
    scrollpane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
    scrollpane.setVerticalScrollBar(scrollbar);

    scrollpane.setViewportView(stretchPanel);
    stretchPanel.add(centrePanel);
    scrollpane.add(stretchPanel);
    add(scrollpane, BorderLayout.CENTER);
    fillGrid();
    setVisible(true);
}

public void fillGrid() {
    centrePanel.removeAll();
    for (int i = 0; i < 20; i++) {
        TextField entry = new TextField("Hello");
        centrePanel.add(entry);
    }
    scrollpane.setPreferredSize(new Dimension(800, 700));
    pack();
}

public static void main(String[] args) {
    new MyWindow("d");
}

}

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

您正在将您的JPanel添加到JScrollPane,这是您永远不应该做的事情。您需要使用JPanel设置视图端口视图,以便将其添加到JScrollPane的视口中,如JScrollPane教程和API解释。所以不是

scrollpane.add(stretchPanel);

而是

scrollpane.setViewportView(stretchPanel);

其他问题:

  • 为什么要创建自己的JScrollBar而不使用JScrollPane提供的默认值?
  • 由于您正在显示JTextField的网格,因此您应该创建并显示JTable。