簡體   English   中英

如何在GridBagLayout中添加TiltledBorder?

[英]how to add a TiltledBorder in a GridBagLayout?

我正在嘗試使用GridBagLayout僅使用一個Container與Swing制作UI!

我的問題是我想在界面中的一個標題( TitledBorder )下重新組合一些JtextFieldsJlabels ,有沒有一種方法可以直接在容器中添加邊框,還是應該創建另一個JPanel來重新組合組件並添加孔面板到我的GridBagLayout嗎?

嘗試這個 :

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;

class SwingLayoutDemo {
private JFrame mainFrame;
private JLabel headerLabel;
private JLabel statusLabel;
private JPanel controlPanel;
private JLabel msglabel;

public SwingLayoutDemo(){
   prepareGUI();
}

 public static void main(String[] args){
  SwingLayoutDemo swingLayoutDemo = new SwingLayoutDemo();  
  swingLayoutDemo.showGridBagLayoutDemo();       
}

  private void prepareGUI(){
  mainFrame = new JFrame("Java SWING Examples");
  mainFrame.setSize(400,400);
  mainFrame.setLayout(new GridLayout(3, 1));

  headerLabel = new JLabel("",JLabel.CENTER );
  statusLabel = new JLabel("",JLabel.CENTER);        

  statusLabel.setSize(350,100);
  mainFrame.addWindowListener(new WindowAdapter() {
     public void windowClosing(WindowEvent windowEvent){
        System.exit(0);
     }        
  });    
  controlPanel = new JPanel();
  controlPanel.setBorder(new TitledBorder (
  new LineBorder (Color.black, 5),
  "Title String"));
  controlPanel.add(new JLabel("TitledBorder using LineBorder"));

  controlPanel.setLayout(new FlowLayout());

  mainFrame.add(headerLabel);
  mainFrame.add(controlPanel);
  mainFrame.add(statusLabel);
  mainFrame.setVisible(true);  
  }

  private void showGridBagLayoutDemo(){
  headerLabel.setText("Layout in action: GridBagLayout");      

  JPanel panel = new JPanel();
  panel.setBackground(Color.darkGray);
  panel.setSize(300,300);
  GridBagLayout layout = new GridBagLayout();

  panel.setLayout(layout);        
  GridBagConstraints gbc = new GridBagConstraints();

  gbc.fill = GridBagConstraints.HORIZONTAL;
  gbc.gridx = 0;
  gbc.gridy = 0;
  panel.add(new JButton("Button 1"),gbc);

  gbc.gridx = 1;
  gbc.gridy = 0;
  panel.add(new JButton("Button 2"),gbc); 

  gbc.fill = GridBagConstraints.HORIZONTAL;
  gbc.ipady = 20;   
  gbc.gridx = 0;
  gbc.gridy = 1;
  panel.add(new JButton("Button 3"),gbc); 

  gbc.gridx = 1;
  gbc.gridy = 1;       
  panel.add(new JButton("Button 4"),gbc);  

  gbc.gridx = 0;
  gbc.gridy = 2;      
  gbc.fill = GridBagConstraints.HORIZONTAL;
  gbc.gridwidth = 2;
  panel.add(new JButton("Button 5"),gbc);  

  controlPanel.add(panel);

  mainFrame.setVisible(true);  
 }
 }

在此處輸入圖片說明

根據您提供的圖片,典型的解決方案是有2個單獨的面板,每個面板都有自己的TitledBorder,然后將這兩個面板都放在第三個外部面板上。

但是,可以通過用JLabel和JSeparator的組合替換TitledBorders在單個面板上創建類似的效果。

區別在於,字段的邏輯“組”現在僅由不圍繞整個組的標題定義。 有些人喜歡,其他人則不喜歡。

這是您的圖片示例,可為您提供想法:

在此處輸入圖片說明

import java.awt.*;
import javax.swing.*;

public class Test implements Runnable
{
  private JTextField firstName;
  private JTextField lastName;
  private JTextField title;
  private JTextField nickname;
  private JComboBox format;

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

  public Test()
  {
    firstName = new JTextField(20);
    lastName = new JTextField(20);
    title = new JTextField(20);
    nickname = new JTextField(20);
    format = new JComboBox();
  }

  public void run()
  {
    JFrame frame = new JFrame();
    frame.getContentPane().add(createPanel());
    frame.pack();
    frame.setVisible(true);
  }

  private JPanel createPanel()
  {
    JPanel p = new JPanel(new GridBagLayout());
    GridBagConstraints gbc = new GridBagConstraints();

    gbc.gridx = 0;
    gbc.gridy = 0;
    gbc.insets = new Insets(4,4,4,4);
    gbc.ipadx = 1;
    gbc.ipady = 1;
    gbc.anchor = GridBagConstraints.WEST;

    JLabel nameHeader = new JLabel("Name:");
    nameHeader.setForeground(Color.RED.darker());
    p.add(nameHeader, gbc);

    gbc.gridx = 1;
    gbc.gridwidth = 3;
    gbc.fill = GridBagConstraints.HORIZONTAL;
    p.add(new JSeparator(JSeparator.HORIZONTAL), gbc);

    gbc.gridx = 0;
    gbc.gridy = 1;
    gbc.gridwidth = 1;
    gbc.fill = GridBagConstraints.NONE;
    p.add(new JLabel("First Name"), gbc);

    gbc.gridx = 1;
    p.add(firstName, gbc);

    gbc.gridx = 2;
    p.add(new JLabel("Last Name"), gbc);

    gbc.gridx = 3;
    p.add(lastName, gbc);

    gbc.gridx = 0;
    gbc.gridy = 2;
    p.add(new JLabel("Title"), gbc);

    gbc.gridx = 1;
    p.add(title, gbc);

    gbc.gridx = 2;
    p.add(new JLabel("Nickname"), gbc);

    gbc.gridx = 3;
    p.add(nickname, gbc);

    gbc.gridx = 0;
    gbc.gridy = 3;
    p.add(new JLabel("Format"), gbc);

    gbc.gridx = 1;
    gbc.gridwidth = 3;
    gbc.fill = GridBagConstraints.HORIZONTAL;
    p.add(format, gbc);

    return p;
  }
}

您可以玩一些約束來完善它,但是您明白了。

這種方法的好處是,在“電子郵件”部分添加更多字段時,可以使它們與“名稱”部分中的字段對齊。 使用單獨的面板,這將更加困難(您可以為此使用一堆Box.createHorizo​​ntalStrut(...))。

這種方法的缺點是您現在擁有一個包含許多字段的大型面板,並且如果需要添加更多字段,可能難以維護。

暫無
暫無

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

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