将JPanels动态添加到JTable或JScrollPane

时间:2015-04-17 17:25:59

标签: java swing

目前正在处理一个项目,我需要动态添加一个滚动窗格或表格的面板。滚动窗格应该从空开始并添加面板。

GuiConstructor是我制作窗口的地方。

我的问题是,如果我没有在setSize中注释掉GuiConstructor,那么窗口就会非常小。 其次,当我按下添加按钮时,它不会添加面板。

public GuiConstructor(){
    super(APPLICATION_NAME);
    setLayout(new BorderLayout());
    LoopControlWindow loopwin = new LoopControlWindow(connect);
    add(loopwin , BorderLayout.NORTH);
    pack();
    setLocationRelativeTo(null);
    setResizable(false);
    setVisible(true);
    //this.setSize(500, 500);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


}


public class LoopControlWindow extends JPanel {

IConnector connect;

public LoopControlWindow(IConnector connect) {
    super(new BorderLayout());
    this.connect = connect;
    initPane();
}

private void initPane() {
    JPanel panel = new JPanel(new GridLayout(3,1));
    FolderSearchComp fsc = new FolderSearchComp(connect);
    JScrollPane scrollPane = new JScrollPane();
    JButton button = new JButton("Add");

    button.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            panel.add(new FolderSearchComp(connect));
            scrollPane.getViewport().setView(panel);
        }
    });



    scrollPane.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
    scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
    scrollPane.setViewportBorder(new LineBorder(Color.BLACK));


    add(scrollPane, BorderLayout.CENTER);
    add(button, BorderLayout.SOUTH);


}

2 个答案:

答案 0 :(得分:2)

这是这种GUI应用程序的典型特征。您需要告诉布局管理器在不使用setSize()的情况下初始化窗口有多大。执行此操作的方法是覆盖getPreferredSize()以返回默认大小。在你的情况下:

public LoopControlWindow extends JPanel {
    private Dimension size;

    public LoopControlWindow() {
        Preferences prefs = Preferences.userNodeForPackge("your.java.package");
        size = new Dimension(prefs.getInt("width", 800), prefs.getInt("height", 600));
    }
    public Dimension getPreferredSize() {
        return size;
    }
}

通过这种方式,您可以存储窗口尺寸的用户首选项,但也提供合理的默认值来启动。

您还应确保此JPanel是您的主面板,并添加到BorderLayout.CENTER的JFrame中,以确保正确绘制窗口。所有其他面板应该在这个面板的某个位置。

完成此设置后,调用pack()将正常运行。

答案 1 :(得分:0)

对于第一个问题,您需要为初始JFrame()指定大小。一种方法是像你一样调用setSize。另一种方法是重写getPreferredSize()以返回默认大小。另一个选项是查找用户监视器的大小,并将JFrame设置为该大小的百分比。这样您就可以确保您的窗口始终适合您的用户屏幕。

    int height = GraphicsEnvironment.getLocalGraphicsEnvironment()
            .getDefaultScreenDevice().getDefaultConfiguration().
            getBounds().height;
    height = (int) (height * .85);
    int width = GraphicsEnvironment.getLocalGraphicsEnvironment()
            .getDefaultScreenDevice().getDefaultConfiguration().
            getBounds().width;
    width = (int) (width * .85);
    frame.setSize(width, height);

其次,您需要在布局中添加或删除时调用revalidate()和repaint()以查看更改。

button.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
        panel.add(new FolderSearchComp(connect));
        scrollPane.getViewport().setView(panel);
        revalidate();
        repaint();
    }
});

关于边框布局的一点说明。其中的组件不会使用您的JFrame调整大小。但是,无论在BorderLayout.CENTER中放置什么组件。随着JFrame的增长,该组件将增长以填充所有额外空间。它也将是JFrame窗口变小时缩小的组件。