Jpanel元素大小过多

时间:2013-06-25 20:36:31

标签: java swing jpanel gridbaglayout

我有一个名为MyPanel的类扩展JPanel,使用GridLayout。每个单元格包含一个小部件(JComboBox,JTextField,JLabel)。

我的主要类,扩展JFrame,使用GridBagLayout。当我将MyPanel添加到它时,它会占用大量空间(所有窗口都在我的桌面空间之外水平移动)。我怎么能修理? 这是我的主类

的构造函数
public Client() {
    super("title");
    setResizable(false);

    Container main_container = getContentPane();
    GridBagLayout layout = new GridBagLayout();
    GridBagConstraints c = new GridBagConstraints();
    main_container.setLayout(layout);

    MyPanel jpanel_acquisto = new MyPanel();
    c.gridx = 0; 
    c.gridy = 0; 
    c.anchor = GridBagConstraints.FIRST_LINE_START;
    c.fill = GridBagConstraints.NONE;
    layout.setConstraints(jpanel_acquisto, c);
    main_container.add(jpanel_acquisto);

    pack();  
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);

}

MyPanel构造函数

    super();
    this.setLayout(new GridLayout(2,5));

    combo_box_produttori = new JComboBox(lista_produttori);
    combo_box_magazzini = new JComboBox(lista_magazzini);
    descrizione = new JTextField("120 caratteri max", DESCRIPTION_MAX_LENGHT);
    label_descrizione = new JLabel("Descrizione");

    quantita_prodotti = new JTextField(20);
    label_quantità = new JLabel("Numero prodotti");

    salva_acquisto = new JButton("Salva acquisto");


    this.add(Box.createGlue());
    this.add(label_descrizione);
    this.add(label_quantità);
    this.add(Box.createGlue());
    this.add(Box.createGlue());

    this.add(combo_box_produttori);
    this.add(descrizione);
    this.add(quantita_prodotti);
    this.add(combo_box_magazzini);
    this.add(salva_acquisto);

2 个答案:

答案 0 :(得分:3)

1)看看你的代码,这似乎就是这样;它让它脱离屏幕:

descrizione = new JTextField("120 caratteri max", DESCRIPTION_MAX_LENGHT);

看起来像JTextField有120列?!

而是使用:

您还可以将上述(JTextComponent)包装在JScrollPane

您可以这样做:

int rows=6;
int cols=20;//20*6=120 characters
JTextArea ja=new JTextArea(rows,cols);
ja.setWrapStyleWord(true);
ja.setLineWrap(true);
JScrollPane jsp=new JScrollPane(ja);

2)也不要扩展JFrame类而是创建和实例并使用它,并确保在Event Dispatch Thread上创建/操作Swing组件。有关详情,请参阅here。即:

SwingUtilities.invokeLater(new Runnable() {

    @Override
    public void run() {

        JFrame frame=new JFrame();
        frame.add(..);
        frame.setVisible(true);

    }

});

答案 1 :(得分:0)

Gridbag布局根据尺寸自动拉伸并适合其元素如果您想使用gridbag定位内容。您可以在面板内放置空面板作为缓冲区,填充空间以防止主要元素过度拉伸。

main_container.add(fillerPanel);
main_container.add(jpanel_acquisto);
main_container.add(fillerPanel);

您还需要调整您的网格包约束,使用提供的静态常量here是完整列表