Java调整JPanel单个组件的大小

Java调整JPanel单个组件的大小,java,swing,jpanel,window-resize,Java,Swing,Jpanel,Window Resize,我有一个JPanel,其Box.createVerticalBox()布局包含五个JPanel。(1) 标签,(2)表格(3)JTextField(4)JTextArea(5)按钮。调整大小时: 标签应贴在左上角并保持相同大小, JTextField应保持在(2)和(4)之间的左侧大小,并扩展到帧的全宽 按钮应贴在右下角并保持相同大小, JTable和JTextArea应扩展到帧的全宽,并平均分配剩余空间 我尝试过几种布局,但无法调整大小。 要运行此程序,需要两个类EditPanel.java:

我有一个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可以处理大小调整吗

GridBagLayout
是应用程序的最佳布局管理器。请参见

GridBagLayout
是应用程序的最佳布局管理器。请参见

您可以按照Wabbi的建议使用GridBagLayout。然而,它确实有我在评论中提到的局限性

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

因此,基本准则是:

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()
,那么面板的高度将不会增加


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

您可以按照Wabbi的建议使用GridBagLayout。然而,它确实有我在评论中提到的局限性

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

因此,基本准则是:

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()
,那么面板的高度将不会增加


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

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

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

我知道提醒,但如何设置布局,使其在两个组件(JTextArea和JTable)之间分割空间?为两个组件的
weightx
提供相同的值0.5。(1+)由于这是一个垂直布局,您将使两个组件的
权重值均为0.5。还要注意,
weight
仅用于调整帧大小时的“额外”空间。也就是说,如果您希望表格和文本区域的大小相同,那么它们也必须具有相同的首选高度,因为GridBagLayout首先根据首选大小分配空间,然后将额外的空间分配给weightx值。我知道提醒,但如何设置布局,以便在两个组件之间分割空间(JTextArea和JTable)?为两个组件的
weightx
提供相同的值0.5。(1+)因为这是一个垂直布局,您将使两个组件的
weighty
值均为0.5。还请注意
weighty
仅用于“额外”调整框架大小时的空间。也就是说,如果希望表格和文本区域的大小相同,那么它们也必须具有相同的首选高度,因为GridBagLayout首先根据首选大小分配空间,然后将额外的空间分配给weightx值。