0

我有一个名为 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);
4

2 回答 2

3

1)看看你的代码,这似乎是什么;让它离开屏幕:

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

看起来像JTextField120 列?!

而是使用:

  • 如果你必须将你的包装JTextField在一个JScrollPane. 有关详细信息,请参阅如何使用滚动窗格

  • JTextArea// . JTextPane_ JTextComponent有关更多信息,请参阅使用文本组件

您还可以将上述 (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类,而是创建和实例化并使用它,并确保在事件调度线程上创建/操作 Swing 组件。请参阅此处了解更多信息。IE:

SwingUtilities.invokeLater(new Runnable() {

    @Override
    public void run() {

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

    }

});
于 2013-06-25T21:29:32.963 回答
0

Gridbag 布局会根据元素的大小自动拉伸并适合其元素如果您想使用 gridbag 定位事物。您可以将空面板放在面板内以充当缓冲区,填充空间以防止主要元素过度拉伸。

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

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

于 2013-06-25T20:40:07.583 回答