在流程布局中更改面板大小

时间:2015-01-28 10:39:39

标签: java swing layout-manager flowlayout

我正在开发java中的GUI表单。我在主框架中添加两个面板FlowLayout。但现在我想改变面板的大小,我尝试使用setsize()进行更改,我看不出有任何区别。

这是我的代码:

public class Main_window extends JFrame implements ActionListener {

    JFrame MainFrm = new JFrame("MCQ Generator");
    JPanel LeftPanel = new JPanel();
    JPanel RightPanel = new JPanel();
    JButton BrowseButton = new JButton("Browse/Open");
    TextArea ta1 = new TextArea();
    TextArea ta2 = new TextArea();
    JButton ClearWindow = new JButton("Clear Window");
    JButton generateButton = new JButton("Generate MCQs");
    String fname;

    Main_window() {
        MainFrm.setLayout(new FlowLayout(FlowLayout.LEFT));
        MainFrm.setSize(1050, 400);
        MainFrm.add(LeftPanel, FlowLayout.LEFT);
        MainFrm.add(RightPanel);
        LeftPanel.setLayout(new BorderLayout(30, 30));
    //LeftPanel.setSize(10, 10);
        //RightPanel.setSize(10, 10);
        RightPanel.setLayout(new BorderLayout(40, 40));
        LeftPanel.setOpaque(true);
        LeftPanel.setBackground(Color.LIGHT_GRAY);
        LeftPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        RightPanel.setOpaque(true);
        RightPanel.setBackground(Color.LIGHT_GRAY);
        RightPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        JPanel InnerPanel = new JPanel();
        InnerPanel.setLayout(new FlowLayout());
        InnerPanel.setBackground(Color.LIGHT_GRAY);
        InnerPanel.add(new JLabel("Choose File: "));
        LeftPanel.add(InnerPanel, BorderLayout.NORTH);
        LeftPanel.add(ta1, BorderLayout.CENTER);
        RightPanel.add(new JLabel("Questions Generated:"), BorderLayout.NORTH);
        RightPanel.add(ta2, BorderLayout.CENTER);
    //ta1.setSize(10, 100);
        //ta2.setSize(10, 100);
        BrowseButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {

                JFileChooser chooser = new JFileChooser();
                FileNameExtensionFilter filter = new FileNameExtensionFilter(
                        "Text Documents(*.txt)", "txt");
                chooser.setFileFilter(filter);
                int returnVal = chooser.showOpenDialog(LeftPanel);
                if (returnVal == JFileChooser.APPROVE_OPTION) {
                    System.out.println("You choose to open this file: " + chooser.getCurrentDirectory() + "\\" + chooser.getSelectedFile().getName());
                    fname = new String(chooser.getCurrentDirectory() + "\\" + chooser.getSelectedFile().getName());
                    try {
                        Jdbc_conn.truncateInputTable(ta1);
                        displayInput(fname);
                        //Jdbc_conn.truncateInputTable(ta1);
                        Give_input.getInput(fname);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }

        });
        InnerPanel.add(BrowseButton);
        LeftPanel.add(generateButton, BorderLayout.SOUTH);
        generateButton.addActionListener(this);
        RightPanel.add(ClearWindow, BorderLayout.SOUTH);
        ClearWindow.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                try {
                    Jdbc_conn.truncateMcqAndNew_nountab(ta2);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
        MainFrm.setVisible(true);
        MainFrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

2 个答案:

答案 0 :(得分:2)

通常,当setSize()不起作用时,请尝试使用setPreferredSize()

在这种情况下,正如Oracle tutorial所说:" FlowLayout类将组件放在一行中,按其首选大小调整大小。如果容器中的水平空间太小而无法将所有组件放在一行中,则FlowLayout类将使用多行。如果容器比一行组件所需的宽,则默认情况下,该行在容器内水平居中。要指定行要向左或向右对齐,请使用带有对齐参数的FlowLayout构造函数。 FlowLayout类的另一个构造函数指定在组件周围放置多少垂直或水平填充。"

答案 1 :(得分:2)

首先,请查看Laying Out Components Within a Container以获取有关布局API的信息。

你永远不应该(好的,很少)需要直接在组件上调用setSize。布局管理器管理下的任何组件都将调整大小以满足布局管理器的要求,因此一般来说,调用setSize是一项毫无意义的练习

您可以使用EmptyBorder来影响组件的大小,但这只是向组件添加内部填充,这可能是不可取的。

另一种选择是使用不同的布局管理器,它可以为您提供更多控制,例如MigLayoutGridBagLayout,但这会增加代码的一般复杂性。

另一种选择是覆盖要调整大小的组件的getPreferredSize方法,并返回要使用的值。但要注意,这不是轻易做到的,也不是要考虑“为什么”要更改默认大小。主要原因是,不同的平台可以改变任何组件可能需要的空间量,以便正确布局。