java - 将 JPanel 动态添加到 JTable 或 JScrollPane

标签 java swing

当前正在处理一个项目,我需要动态地将我制作的面板添加到滚动 Pane 或表格中。滚动 Pane 应从空开始并添加面板。

GuiConstructor 是我制作窗口的地方。

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

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


}

最佳答案

这是这种 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() 将正常工作。

关于java - 将 JPanel 动态添加到 JTable 或 JScrollPane,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29705744/

相关文章:

java - JTextField 只接受有效的未签名短裤? (使用 key 适配器)

java - 在 Jframe 中绘制一个圆

java - 是否可以在 while 循环中简洁地使用复杂的条件?

java - 如何使用 Volley 进行并发 GET 调用?

java - 直接播放给定 mp3 的 url 的 mp3 文件

java - JSF 全局异常处理程序让异常冒泡

java - 根据调用的选项卡更新组件

java - JToolBar/JMenu位置重叠

java - 每次单击 JButton 时都会打开新的 JFrame

java - 实例化一个带有某些注释的类