ปรับขนาด jpanel ตามส่วนประกอบที่มีอยู่ในนั้น

ในตัวอย่างด้านล่าง ทางฝั่งตะวันตกของเค้าโครงเส้นขอบ มีแผงหลักซึ่งมี BoxLayout และแผงสองแผงอยู่ข้างใน ปัญหาคือแผงด้านทิศตะวันตกครอบคลุมพื้นที่ทั้งหมดตั้งแต่บนลงล่าง FlowLayout ที่ใช้สำหรับแผงย่อยภายในแผงหลักใช้พื้นที่มาก เป็นไปได้ไหมที่จะบีบอัดแต่ละ JPanel ตามส่วนประกอบ? นอกจากนี้ มันควรจะยังคงเหมือนเดิมแม้ว่าหน้าต่างจะขยายใหญ่สุดแล้วก็ตาม

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.BoxLayout;
import javax.swing.JTextField;
import javax.swing.JCheckBox;
import javax.swing.JButton;

public class Sample extends JFrame {

    private JPanel contentPane;
    private JTextField textField;
    private JTextField textField_1;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Sample frame = new Sample();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public Sample() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);

        JPanel panel = new JPanel();
        contentPane.add(panel, BorderLayout.NORTH);

        JLabel lblNewLabel = new JLabel("New label");
        panel.add(lblNewLabel);

        JPanel panel_1 = new JPanel();
        contentPane.add(panel_1, BorderLayout.WEST);
        panel_1.setLayout(new BoxLayout(panel_1, BoxLayout.Y_AXIS));

        JPanel panel_2 = new JPanel();
        panel_1.add(panel_2);

        textField = new JTextField();
        panel_2.add(textField);
        textField.setColumns(2);

        textField_1 = new JTextField();
        panel_2.add(textField_1);
        textField_1.setColumns(2);

        JPanel panel_3 = new JPanel();
        panel_1.add(panel_3);

        JCheckBox chckbxNewCheckBox = new JCheckBox("New check box");
        panel_3.add(chckbxNewCheckBox);

        JPanel panel_4 = new JPanel();
        panel_1.add(panel_4);

        JButton btnNewButton = new JButton("New");
        panel_4.add(btnNewButton);

        JButton btnNewButton_1 = new JButton("New");
        panel_4.add(btnNewButton_1);
    }

}

person Mercenary    schedule 30.03.2014    source แหล่งที่มา
comment
ลองใช้ GridBagLayout   -  person Braj    schedule 30.03.2014


คำตอบ (1)


วิธีหนึ่งคือเพิ่ม panel_1 ลงในแผงปิดล้อม ค่าเริ่มต้น FlowLayout จะสอดคล้องกับขนาดที่ต้องการของส่วนประกอบที่ล้อมรอบเมื่อคุณ pack() ส่วนที่ล้อมรอบ Window ฉันได้เพิ่มแผงสีเทาให้กับ CENTER เป็นตัวยึดตำแหน่ง ปรับขนาดเฟรมเพื่อดูเอฟเฟกต์

JPanel flowPanel = new JPanel();
flowPanel.add(panel_1);

รูปภาพ

ตามที่ทดสอบ:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.BoxLayout;
import javax.swing.JTextField;
import javax.swing.JCheckBox;
import javax.swing.JButton;

public class Sample extends JFrame {

    private JPanel contentPane;
    private JTextField textField;
    private JTextField textField_1;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    Sample frame = new Sample();
                    frame.pack();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public Sample() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);

        JPanel panel = new JPanel();
        contentPane.add(panel, BorderLayout.NORTH);

        JLabel lblNewLabel = new JLabel("New label");
        panel.add(lblNewLabel);

        JPanel panel_1 = new JPanel();
        panel_1.setLayout(new BoxLayout(panel_1, BoxLayout.Y_AXIS));

        JPanel panel_2 = new JPanel();
        panel_1.add(panel_2);

        textField = new JTextField();
        panel_2.add(textField);
        textField.setColumns(2);

        textField_1 = new JTextField();
        panel_2.add(textField_1);
        textField_1.setColumns(2);

        JPanel panel_3 = new JPanel();
        panel_1.add(panel_3);

        JCheckBox chckbxNewCheckBox = new JCheckBox("New check box");
        panel_3.add(chckbxNewCheckBox);

        JPanel panel_4 = new JPanel();
        panel_1.add(panel_4);

        JButton btnNewButton = new JButton("New");
        panel_4.add(btnNewButton);

        JButton btnNewButton_1 = new JButton("New");
        panel_4.add(btnNewButton_1);

        JPanel flowPanel = new JPanel();
        flowPanel.add(panel_1);
        contentPane.add(flowPanel, BorderLayout.WEST);
        contentPane.add(new JPanel(){

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(320, 240);
            }

            @Override
            public Color getBackground() {
                return Color.lightGray;
            }

        }, BorderLayout.CENTER);
    }

}
person trashgod    schedule 30.03.2014
comment
ขอบคุณ. นั่นได้ผล! จำเป็นต้องรู้ด้วยว่าจะต้องทำอย่างไรหากฉันต้องเพิ่มส่วนประกอบชุดเดียวกันอีกครั้งด้านล่างนั้น เนื่องจากนี่คือ FlowLayout มีวิธีอื่นอีกไหมที่สามารถทำได้ - person Mercenary; 30.03.2014
comment
ใช่; เพิ่มสองอินสแตนซ์ของแผงโฟลว์ในแนวตั้ง Box หรือ GridLayout; โปรดดู NestedLayoutExample นี้ด้วย - person trashgod; 30.03.2014
comment
อืมใช่ เข้าใจแล้ว! ขอบคุณ - person Mercenary; 30.03.2014