Swing Jpanel Autofit内容问题

时间:2011-09-01 18:58:21

标签: swing dynamic jpanel

我想使用Swing实现以下屏幕设计:

-----------------------------------------------
File Type 1:   JTextfield1  Browse Button1  ADD ROW BUTTON
               JTextfield2  Browse Button2

File Type 2:   JTextfield3  Browse Button3  ADD ROW BUTTON
               JTextfield4  Browse Button4

File Type 1:   JTextfield5  Browse Button5  ADD ROW BUTTON
               JTextfield6  Browse Button6

点击ADD ROW BUTTON一套新的JTextfield&浏览按钮被添加到适当的文件类型部分,每个文件类型部分是一个具有miglayout的Jpanel,但问题是添加新行时Jpanel不会展开,因此新行仅显示部分而屏幕的部分显示为不被推倒。

如何实现同样的目标。 请帮忙。

Rajiv Jha

1 个答案:

答案 0 :(得分:3)

我并不完全明白你需要什么。但试试这个例子。它应该做你想要的。

enter image description here enter image description here

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class DynaFrame extends JFrame{

    private JPanel basePnl = new JPanel();

    public DynaFrame(){
        this.setTitle("Dynamic panel addition");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //this.setSize(600, 700);
        this.add(getMainPanel());
        this.setLocationRelativeTo(null);
        this.pack();
        this.setVisible(true);
    }

    public static void main(String[] args){
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new DynaFrame();
            }
        });
    }

    public JPanel getMainPanel(){
        basePnl.setLayout(new BoxLayout(basePnl, BoxLayout.Y_AXIS));
        basePnl.add(getRowPanel());
        return basePnl;
    }

    public JPanel getRowPanel(){
        JPanel pnl = new JPanel();
        GridLayout gLayout = new GridLayout();
        gLayout.setColumns(4);
        gLayout.setRows(1);
        pnl.setLayout(gLayout);
        pnl.add(new JLabel("Filetype"));
        pnl.add(new JTextField());
        pnl.add(new JButton("Browse"));
        JButton addBtn = new JButton("Add");
        addBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                basePnl.add(getRowPanel());
                DynaFrame.this.pack();
            }
        });
        pnl.add(addBtn);
        return pnl;
    }
}