Java调整JPanel的各个组件的大小

时间:2016-05-19 22:20:57

标签: java swing jpanel window-resize

我有一个JPAnel,Box.createVerticalBox()布局包含五个JPanel。 (1)标签,(2)表(3)JTextField(4)JTextArea(5)按钮。调整大小:

标签应贴在左上角并保持相同的尺寸,
JTextField应该在(2)和(4)之间保持左边的大小,并扩展到框架的全宽 按钮应粘在右下角并保持相同的尺寸,
JTable和JTextArea应扩展到帧的全宽并均等地划分剩余空间

我尝试了几种布局,但无法调整工作大小。 要运行此程序,需要两个类EditPanel.java:

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class EditPanel extends JPanel {
    private JPanel p1Labels;
    private JPanel p2Table;
    private JPanel p3ecnTitle;
    private JPanel p5Buttons;    
    private JTextField fieldK;
    private JTextField fieldS;
    private JScrollPane myScrollBar;
    private Box theBox;

    public EditPanel() {
        init();
    }

    public void init() {  // Creating a vertical Box layout with five sections, placing jpanels there

        //First panel with buttons

        p1Labels = new JPanel(new FlowLayout(FlowLayout.LEFT, 2, 2));
        fieldK = new JTextField("Animal");
        fieldS = new JTextField("Fox");        
        p1Labels.add(new JLabel("Kindom: "));
        p1Labels.add(fieldK);
        p1Labels.add(new JLabel("Species: "));
        p1Labels.add(fieldS);

        //Second panel with a table

        p2Table = new JPanel(new FlowLayout(FlowLayout.LEFT, 2, 2));
        String[] columnNames = {"First", "Second", "Third", "Fourth"};
        Object[][] data = {{"11", "12", "13", "Forteen"},{"21", "22", "23", "Twenty four"}}; 
        JTable table = new JTable(data, columnNames);
        JScrollPane scrollPane1 = new JScrollPane(new JTable(data, columnNames));
        table.setFillsViewportHeight(true);
        p2Table.add(scrollPane1, BorderLayout.CENTER);

        //Third panel with a JTextField

        p3ecnTitle = new JPanel(new FlowLayout(FlowLayout.LEFT, 2, 2)); 
        p3ecnTitle.add(new JLabel("Title: "));
        p3ecnTitle.add(new JTextField("", 14));

        //Forth panel with JTextArea
        //p4TextArea = new JPanel(new FlowLayout(FlowLayout.LEFT, 2, 2));//tried this too
        JTextArea ecnArea = new JTextArea(10, 20);        
        ecnArea.setText("");
        ecnArea.setName("Note");
        ecnArea.setLineWrap(true);
        ecnArea.setWrapStyleWord(true);
        myScrollBar = new JScrollPane(ecnArea,
                JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
                JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);  

        //Fifth container with buttons

        p5Buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT, 2, 2));
        p5Buttons.add(new JButton("SAVE"));
        p5Buttons.add(new JButton("DELETE"));
        p5Buttons.add(new JButton("CANCEL")); 

        //Placing everything in a container
        theBox = Box.createVerticalBox();
        theBox.add(p1Labels);
        theBox.add(p2Table);
        theBox.add(p3ecnTitle);
        //theBox.add(p4TextArea);
        theBox.add(myScrollBar);
        theBox.add(Box.createVerticalGlue());
        theBox.add(p5Buttons);
        this.add(theBox);
    }
}

和main.java

import javax.swing.JFrame;
public class Main {
    public static void main(String[] args) {
        JFrame myFrame;
        myPanel EditECNDialog;
        myFrame = new JFrame();     
        EditECNDialog = new myPanel();
        myFrame.setTitle("Notes");
        myFrame.add(EditECNDialog);
        myFrame.pack();
        myFrame.setLocationRelativeTo(null);
        myFrame.setVisible(true);
    }
}

哪种布局可以处理最佳调整大小? boxlayout可以处理大小调整吗?

3 个答案:

答案 0 :(得分:3)

GridBagLayout是您应用的最佳布局管理器。见https://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html

答案 1 :(得分:2)

你可以像Wabbi已经建议的那样使用GridBagLayout。但是,确实有我在评论中提到的限制。

但是,如果您确实希望textarea和table始终具有相同的大小,那么您可以使用Relative Layout。此布局将首先为具有固定大小的组件分配空间。然后,剩余的剩余空间将分配给具有相对约束的组件。

所以基本代码是:

RelativeLayout rl = new RelativeLayout(RelativeLayout.Y_AXIS);
rl.setFill( true );
JPanel panel = new JPanel( rl );
panel.add(labelPanel);
panel.add(tableScrollPane, new Float(1));
panel.add(textField);
panel.add(textAreaScrollPane, new Float(1)); 
panel.add(buttonsPanel);

现在,随着帧的大小调整,表格和文本区域将会增大/缩小。

  

boxlayout可以处理大小调整吗?

是的,它可以处理这种类型的调整大小。框布局尊重组件的最大大小。因此,如果您覆盖面板的getMaximumSize()方法以返回getPreferredSize(),则面板的高度不会增加。

因此,文本区域和表格的滚动窗格将获得额外的空间。同样,同样的担忧。每个组件最初将根据其首选大小分配空间。

答案 2 :(得分:1)

你应该为gridbagconstraints使用一个变量。这样您就可以执行c.gridy++; c.gridx=0;c.gridx++; 稍后插入新组件会更容易。 显式d.gridy=4;使插入新组件变得困难。