簡體   English   中英

隨着窗口擴展,Gridbag布局中的Java-TitledBorder擴展

[英]Java- TitledBorder in gridbag layout expanding as the window expands

我正在使用帶有標題邊框的GridBag布局制作表單。 第一個TitledBorder panel即“客戶詳細信息”)可以正常工作,除了我想知道如何在第一個標題和textfield (例如名字)和其后的后續標題和textfield (例如姓氏)之間添加一些間距。

第二個panel是“房間詳細信息”,它的問題在於它會隨着我擴大/擴展窗口而擴展,並且在這種情況下,其中的組件也會移動。 我希望它像第一個panel的組件一樣保持固定。

這是form.java類:

public class form extends JFrame{


JPanel pnl= new JPanel();
JPanel pnl1= new JPanel();
JLabel fname= new JLabel("First name: ");
JLabel lname= new JLabel("Last name: ");
JLabel contact= new JLabel("Contact number: ");
JLabel email= new JLabel("Email address: ");
JLabel address= new JLabel("Address: ");
JLabel numpsns= new JLabel("Number of persons: ");
JTextField fnameField= new JTextField(25);
JTextField lnameField= new JTextField(25);
JTextField contactField= new JTextField(25);
JTextField emailField= new JTextField(25);
JTextArea txtadd= new JTextArea(5, 25);

SpinnerModel sm= new SpinnerNumberModel(1,0,30,1);
JSpinner spinner= new JSpinner(sm);

public form(){

    this.setTitle("Reservation Form");


    pnl.setBorder(new TitledBorder(null,"Customer Details", TitledBorder.CENTER, TitledBorder.TOP, null, null));
    getContentPane().add(pnl, BorderLayout.NORTH);

    pnl.setLayout(new GridBagLayout());
    GridBagConstraints gc= new GridBagConstraints();

    //first column of the grid//
    gc.anchor= GridBagConstraints.EAST;
    gc.weightx=0.5;
    gc.weighty=0.5;

    gc.gridx=0;
    gc.gridy=0;

    pnl.add(fname, gc);

    gc.gridx=0;
    gc.gridy=1;
    pnl.add(lname,gc);

    gc.gridx=0;
    gc.gridy=2;
    pnl.add(contact, gc);

    gc.gridx=0;
    gc.gridy=3;
    pnl.add(email, gc);

    gc.gridx=0;
    gc.gridy=4;
    pnl.add(address, gc);

    //second column//
    gc.anchor= GridBagConstraints.WEST;
    gc.gridx=1;
    gc.gridy= 0;
    pnl.add(fnameField,gc);

    gc.gridx=1;
    gc.gridy=1;
    pnl.add(lnameField, gc);

    gc.gridx=1;
    gc.gridy=2;
    pnl.add(contactField, gc);

    gc.gridx=1;
    gc.gridy=3;
    pnl.add(emailField, gc);

    gc.gridx=1;
    gc.gridy=4;
    pnl.add(txtadd, gc);

    //second Titled Border//        

    pnl1.setBorder(BorderFactory.createTitledBorder(null, "Booking Details", TitledBorder.CENTER, TitledBorder.CENTER));

    add(pnl1, BorderLayout.CENTER);

    pnl1.setLayout(new GridBagLayout());
    GridBagConstraints gc1= new GridBagConstraints();


    //first column//

    gc1.weightx= 0.5;
    gc1.weighty=0.5;

    gc1.gridx=0;
    gc1.gridy=0;

    pnl1.add(numpsns, gc1);

    gc1.anchor= GridBagConstraints.WEST;
    gc1.gridx=1;
    gc1.gridy= 0;
    pnl1.add(spinner,gc1);




       }

 }

form_main.java類

public class form_main {

 public static void main(String[] args) {

    form form_display= new form();
     form_display.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
     form_display.pack();
     form_display.setSize(500,280);
     form_display.setVisible(true);

    }

 }

這是它的屏幕截圖: 在此處輸入圖片說明

您已經將第二個面板添加到BorderLayoutCENTRE位置,這是這種布局的預期行為。 也許您應該使用另一個GridBagLayout來布局兩個面板

要向面板添加內部間距,可以使用CompoundLayout ,將TitledBorderEmptyBorder在一起,或者設置GridBagConstraints#insets屬性

簡單的例子...

簡單

import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SpinnerModel;
import javax.swing.SpinnerNumberModel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.Border;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import javax.swing.border.TitledBorder;

public class Form extends JFrame {

    JPanel pnl = new JPanel();
    JPanel pnl1 = new JPanel();
    JLabel fname = new JLabel("First name: ");
    JLabel lname = new JLabel("Last name: ");
    JLabel contact = new JLabel("Contact number: ");
    JLabel email = new JLabel("Email address: ");
    JLabel address = new JLabel("Address: ");
    JLabel numpsns = new JLabel("Number of persons: ");
    JTextField fnameField = new JTextField(25);
    JTextField lnameField = new JTextField(25);
    JTextField contactField = new JTextField(25);
    JTextField emailField = new JTextField(25);
    JTextArea txtadd = new JTextArea(5, 25);

    SpinnerModel sm = new SpinnerNumberModel(1, 0, 30, 1);
    JSpinner spinner = new JSpinner(sm);

    public Form() {

        this.setTitle("Reservation Form");
        setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridwidth = GridBagConstraints.REMAINDER;
        gbc.fill = gbc.HORIZONTAL;

        Border border = new CompoundBorder(
                new TitledBorder(null, "Customer Details", TitledBorder.CENTER, TitledBorder.TOP, null, null),
                new EmptyBorder(10, 10, 10, 10));

        pnl.setBorder(border);
        getContentPane().add(pnl, gbc);

        pnl.setLayout(new GridBagLayout());
        GridBagConstraints gc = new GridBagConstraints();

        //first column of the grid//
        gc.anchor = GridBagConstraints.EAST;
        gc.weightx = 0.5;
        gc.weighty = 0.5;

        gc.gridx = 0;
        gc.gridy = 0;

        pnl.add(fname, gc);

        gc.gridx = 0;
        gc.gridy = 1;
        pnl.add(lname, gc);

        gc.gridx = 0;
        gc.gridy = 2;
        pnl.add(contact, gc);

        gc.gridx = 0;
        gc.gridy = 3;
        pnl.add(email, gc);

        gc.gridx = 0;
        gc.gridy = 4;
        pnl.add(address, gc);

        //second column//
        gc.anchor = GridBagConstraints.WEST;
        gc.gridx = 1;
        gc.gridy = 0;
        pnl.add(fnameField, gc);

        gc.gridx = 1;
        gc.gridy = 1;
        pnl.add(lnameField, gc);

        gc.gridx = 1;
        gc.gridy = 2;
        pnl.add(contactField, gc);

        gc.gridx = 1;
        gc.gridy = 3;
        pnl.add(emailField, gc);

        gc.gridx = 1;
        gc.gridy = 4;
        pnl.add(txtadd, gc);

        //second Titled Border//        
        pnl1.setBorder(BorderFactory.createTitledBorder(null, "Booking Details", TitledBorder.CENTER, TitledBorder.CENTER));

        add(pnl1, gbc);

        pnl1.setLayout(new GridBagLayout());
        GridBagConstraints gc1 = new GridBagConstraints();

        //first column//
        gc1.weightx = 0.5;
        gc1.weighty = 0.5;

        gc1.gridx = 0;
        gc1.gridy = 0;

        pnl1.add(numpsns, gc1);

        gc1.anchor = GridBagConstraints.WEST;
        gc1.gridx = 1;
        gc1.gridy = 0;
        pnl1.add(spinner, gc1);

    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                Form frame = new Form();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

}

非常感謝。 您能告訴我如何更改邊框標題的字體和大小(例如客戶詳細信息,預訂詳細信息)嗎? Font.BOLD在createTitledBorder中似乎不起作用

...

new TitledBorder(null, "Customer Details", TitledBorder.CENTER, TitledBorder.TOP, UIManager.getFont("Label.font").deriveFont(Font.BOLD), null);

...

那沒用

對我來說很好...

的TitledBorder

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.TitledBorder;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new GridBagLayout());
            JPanel p1 = new JPanel();
            p1.setBorder(new TitledBorder(null, "Customer Details", TitledBorder.CENTER, TitledBorder.TOP, null, null));
            JPanel p2 = new JPanel();
            p2.setBorder(new TitledBorder(null, "Customer Details", TitledBorder.CENTER, TitledBorder.TOP, UIManager.getFont("Label.font").deriveFont(Font.BOLD), null));
            JPanel p3 = new JPanel();
            p3.setBorder(new TitledBorder(null, "Customer Details", TitledBorder.CENTER, TitledBorder.TOP, UIManager.getFont("Label.font").deriveFont(Font.ITALIC), null));
            JPanel p4 = new JPanel();
            p4.setBorder(new TitledBorder(null, "Customer Details", TitledBorder.CENTER, TitledBorder.TOP, UIManager.getFont("Label.font").deriveFont(Font.BOLD | Font.ITALIC), null));

            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            gbc.weightx = 1;
            gbc.weighty = 1;
            gbc.fill = GridBagConstraints.BOTH;

            add(p1, gbc);
            add(p2, gbc);
            add(p3, gbc);
            add(p4, gbc);
        }

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

    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM