2012-01-08 48 views
1

我有这个应用,但是,当我调整窗口大小时,内部的元素JTextArea,它不会调整窗口大小。为什么?该应用不会调整其组件

import java.awt.*; 
import java.awt.event.*; 

import javax.swing.*; 

public class ExampleGUI { 

private JTextArea text_area; 
private JScrollPane scroll_bar; 

private JFrame frame; 
private JPanel panel; 

public ExampleGUI(){ 

    frame = new JFrame("Example GUI"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    text_area = new JTextArea(); 
    scroll_bar = new JScrollPane(text_area); 

    panel = new JPanel(); 
    panel.add(scroll_bar); 

    frame.add(panel); 

    frame.pack(); 
    frame.setVisible(true); 
} 

public static void main(String[] args) { 

    SwingUtilities.invokeLater(new Runnable(){public void run(){new ExampleGUI();}}); 
} 
} 
+0

为什么不简单评论此行frame.setLayout(new FlowLayout());此致 – 2012-01-08 16:22:21

+0

为了更好地提供帮助,请发布[SSCCE](http://sscce.org/)。 – 2012-01-08 16:44:28

+0

我发布了一个SSCCE – Mazzy 2012-01-08 17:09:43

回答

3

您需要将GridBagConstraint x和y的权重(的weightx和沉重 - 第5和第6的参数在GridBagConstraint构造函数)设置为0.0的正值。你应该阅读关于GridBagLayout的教程,如果你打算使用它,因为它非常复杂。一些嵌套更简单的布局或使用第三方布局如MigLayout取得了巨大成功。

+0

对嵌套简单布局的建议+1。只需'BorderLayout','FlowLayout','BoxLayout'和'Box'组件,您就可以做很多事情,而不需要头疼GridBagLayout。 – Paul 2012-01-08 18:03:16

3

您的框架布局是FlowLayout。这不会调整儿童的大小。从the docs

流布局让每个组件都采用其自然(首选)大小。

使用BorderLayout并将窗格置于CENTER中将会更好。

替换此:

frame.setLayout(new FlowLayout()); 
frame.add(pane); 

与此:

frame.setLayout(new BorderLayout()); 
frame.add(pane, BorderLayout.CENTER); 

而且,气垫船指出,如果你需要的各个组件当窗格调整大小来调整,那么你需要有非GridBagConstraints中的零权重。

+0

没有看到,1+。听起来像OP需要阅读整个布局管理器教程。 – 2012-01-08 16:27:13

+0

但文本区域保持相同的维度。 – Mazzy 2012-01-08 16:28:51

+1

@Mazzy:当然文本区域保持不变 - 您已经设置了封闭JScrollPane的首选大小。 – 2012-01-08 16:53:07

3

这考虑到了气垫船Full Of Eels的建议&特德霍普与其他一些调整。

import java.awt.*; 
import java.awt.event.*; 

import javax.swing.*; 

import java.util.Collection; 

public class AziendaGUI implements ActionListener { 

private JButton view_list; 
private JButton save_list; 
private JTextArea text_area; 
private JScrollPane scrollpane; 
private JPanel pane; 

private JFrame frame; 
private GridBagLayout grid; 

public AziendaGUI() { 

    frame = new JFrame("Immobiliari s.p.a"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    frame.setLayout(new BorderLayout()); 

    view_list = new JButton("View Property"); 
    view_list.setActionCommand("view_list"); 
    view_list.addActionListener(this); 

    save_list = new JButton("Save List"); 
    save_list.setActionCommand("save_list"); 
    save_list.addActionListener(this); 

    text_area = new JTextArea(10,22); 
    text_area.setEditable(false); 
    scrollpane = new JScrollPane(text_area); 

    grid = new GridBagLayout(); 
    pane = new JPanel(); 
    pane.setLayout(grid); 

    /* Set Constraints view_list button */ 
    grid.setConstraints(view_list, new GridBagConstraints(0,0,1,1,0.0,0.0,GridBagConstraints.WEST,GridBagConstraints.NONE,new Insets(5,5,5,5),0,0)); 
    pane.add(view_list); 

    /* Set Constraints save_list button */ 
    grid.setConstraints(save_list,new GridBagConstraints(1,0,1,1,0.1,0.1,GridBagConstraints.EAST,GridBagConstraints.NONE,new Insets(5,5,5,5),0,0)); 
    pane.add(save_list); 

    frame.add(scrollpane); 

    frame.add(pane, BorderLayout.NORTH); 

    frame.pack(); 
    frame.setVisible(true); 
} 

private void store(){ 

    String file_name = JOptionPane.showInputDialog("Inserisci il nome del file"); 

} 

@Override 
public void actionPerformed(ActionEvent e){ 

    String s = e.getActionCommand(); 

    if(s.equals("view_list")){ 
    } 
    if(s.equals("save_list")){ 

     store(); 
    } 
} 


public static void main(String[] args) { 

    SwingUtilities.invokeLater(new Runnable(){@Override 
               public void run(){new AziendaGUI();}}); 
} 
} 
+0

为什么将窗格添加为NORTH组件?将窗格添加为CENTER组件会更有意义,因此它可以垂直和水平方向展开。 – 2012-01-08 17:29:03

+0

@TedHopp仔细查看代码。测试显示分配给文本区域的额外垂直空间。 – 2012-01-08 17:32:46

相关问题