天天看點

java swing 空白_關于Java:在Swing GUI中提供空白

沒有空格的GUI顯得"擁擠"。 如何提供空白而不訴諸顯式設定元件的位置或大小? -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- --------

例如CardLayout(int,int),FlowLayout(int,int,int)和GridLayout(int,int,int,int),另一個示例GridLayout(int,int,int,int)和GridBagLayout()使用GridBagConstraints.insets

使用支援語義術語上的空白的LayoutManager。 您會看到它的到來,::) MigLayout可以幫助您:定義一個網格以及它們之間的間隙,例如相關的,不相關的段落-僅添加元件

使用各種LayoutManagers可以在各種元件之間提供間隔。

1.)BorderLayout:

重載的構造方法:BorderLayout(int horizo??ntalGap,int verticalGap)

擷取和設定方法

對于水準間距:BorderLayout.getHgap()和BorderLayout.setHgap(int hgap)

對于垂直間距:BorderLayout.getVgap()和BorderLayout.setVgap()

2.)FlowLayout:

重載的構造方法:FlowLayout(int align,int hgap,int vgap)

擷取和設定方法

對于水準間距:FlowLayout.getHgap()和FlowLayout.setHgap(int hgap)

對于垂直間距:FlowLayout.getVgap()和FlowLayout.setVgap()

3.)GridLayout:

重載的構造方法:GridLayout(int行,int列,int hgap,int vgap)

擷取和設定方法

對于水準間距:GridLayout.getHgap()和GridLayout.setHgap(int hgap)

對于垂直間距:GridLayout.getVgap()和GridLayout.setVgap()

4.)GridBagLayout:

GridBagConstraints.insets

5.)CardLayout(示例):

CardLayout(int hGap,int vGap)

顯示操作中所有構造函數的示例:

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class LayoutExample {

private final int hGap = 5;

private final int vGap = 5;

private String[] borderConstraints = {

BorderLayout.PAGE_START,

BorderLayout.LINE_START,

BorderLayout.CENTER,

BorderLayout.LINE_END,

BorderLayout.PAGE_END

};

private JButton[] buttons;

private GridBagConstraints gbc;

private JPanel borderPanel;

private JPanel flowPanel;

private JPanel gridPanel;

private JPanel gridBagPanel;

private JPanel cardPanel;

public LayoutExample() {

buttons = new JButton[16];

gbc = new GridBagConstraints();

gbc.anchor = GridBagConstraints.FIRST_LINE_START;

gbc.insets = new Insets(hGap, vGap, hGap, vGap);

}

private void displayGUI() {

JFrame frame = new JFrame("Layout Example");

frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

JPanel contentPane = new JPanel(

new GridLayout(0, 1, hGap, vGap));

contentPane.setBorder(

BorderFactory.createEmptyBorder(hGap, vGap, hGap, vGap));

borderPanel = new JPanel(new BorderLayout(hGap, vGap));

borderPanel.setBorder(

BorderFactory.createTitledBorder("BorderLayout"));

borderPanel.setOpaque(true);

borderPanel.setBackground(Color.WHITE);

for (int i = 0; i < 5; i++) {

buttons[i] = new JButton(borderConstraints[i]);

borderPanel.add(buttons[i], borderConstraints[i]);

}

contentPane.add(borderPanel);

flowPanel = new JPanel(new FlowLayout(

FlowLayout.CENTER, hGap, vGap));

flowPanel.setBorder(

BorderFactory.createTitledBorder("FlowLayout"));

flowPanel.setOpaque(true);

flowPanel.setBackground(Color.WHITE);

for (int i = 5; i < 8; i++) {

buttons[i] = new JButton(Integer.toString(i));

flowPanel.add(buttons[i]);

}

contentPane.add(flowPanel);

gridPanel = new JPanel(new GridLayout(2, 2, hGap, vGap));

gridPanel.setBorder(

BorderFactory.createTitledBorder("GridLayout"));

gridPanel.setOpaque(true);

gridPanel.setBackground(Color.WHITE);

for (int i = 8; i < 12; i++) {

buttons[i] = new JButton(Integer.toString(i));

gridPanel.add(buttons[i]);

}

contentPane.add(gridPanel);

gridBagPanel = new JPanel(new GridBagLayout());

gridBagPanel.setBorder(

BorderFactory.createTitledBorder("GridBagLayout"));

gridBagPanel.setOpaque(true);

gridBagPanel.setBackground(Color.WHITE);

buttons[12] = new JButton(Integer.toString(12));

addComp(gridBagPanel, buttons[12], 0, 0, 1, 1

, GridBagConstraints.BOTH, 0.33, 0.5);

buttons[13] = new JButton(Integer.toString(13));

addComp(gridBagPanel, buttons[13], 1, 0, 1, 1

, GridBagConstraints.BOTH, 0.33, 0.5);

buttons[14] = new JButton(Integer.toString(14));

addComp(gridBagPanel, buttons[14], 0, 1, 2, 1

, GridBagConstraints.BOTH, 0.66, 0.5);

buttons[15] = new JButton(Integer.toString(15));

addComp(gridBagPanel, buttons[15], 2, 0, 1, 2

, GridBagConstraints.BOTH, 0.33, 1.0);

contentPane.add(gridBagPanel);

cardPanel = new JPanel(new CardLayout(hGap, vGap));

cardPanel.setBorder(

BorderFactory.createTitledBorder("CardLayout"));

cardPanel.setOpaque(true);

cardPanel.setBackground(Color.WHITE);

cardPanel.add(getPanel(Color.BLUE));

cardPanel.add(getPanel(Color.GREEN));

contentPane.add(cardPanel);

frame.setContentPane(contentPane);

frame.pack();

frame.setLocationByPlatform(true);

frame.setVisible(true);

}

private JPanel getPanel(Color bColor) {

JPanel panel = new JPanel(new FlowLayout(

FlowLayout.CENTER, hGap, vGap));

panel.setOpaque(true);

panel.setBackground(bColor.darker().darker());

JButton swapperButton = new JButton("Next");

swapperButton.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent ae) {

CardLayout cardLayout = (CardLayout) cardPanel.getLayout();

cardLayout.next(cardPanel);

}

});

panel.add(swapperButton);

return panel;

}

private void addComp(JPanel panel, JComponent comp

, int x, int y, int gWidth

, int gHeight, int fill

, double weightx, double weighty) {

gbc.gridx = x;

gbc.gridy = y;

gbc.gridwidth = gWidth;

gbc.gridheight = gHeight;

gbc.fill = fill;

gbc.weightx = weightx;

gbc.weighty = weighty;

panel.add(comp, gbc);

}

public static void main(String[] args) {

Runnable runnable = new Runnable(){

@Override

public void run() {

new LayoutExample().displayGUI();

}

};

EventQueue.invokeLater(runnable);

}

}

輸出:

java swing 空白_關于Java:在Swing GUI中提供空白

我+1了一些GridBagConstraints插圖。 我們經常使用GBL,是以我編寫了一些幫助程式類來幫助我完成肮髒的工作,是以GBL代碼非常簡潔易讀。 就像這裡的示例一樣,我使用預設的Insets,這樣我就不必每次都鍵入它,是以外觀看起來更加"輕松"。

Swing GUI中有多種方法可以在元件之間以及元件周圍的空白之間提供分隔:

JToolBar具有方法addSeparator()和addSeparator(Dimension)。

JMenu使用更适合菜單的間距元件,可通過addSeparator()獲得。

但更一般地說,請注意:

可以在布局構造函數中定義的間距。

邊界。

這是一個使用布局分隔符hGap和vGap值和邊框(特别是EmptyBorder)提供"白色"(實際上顯示為紅色以使其非常明顯)空間的示例。調整微調器以檢視結果。

java swing 空白_關于Java:在Swing GUI中提供空白
java swing 空白_關于Java:在Swing GUI中提供空白

import java.awt.*;

import javax.swing.*;

import javax.swing.border.EmptyBorder;

import javax.swing.event.*;

public class WhiteSpace {

private JPanel gui = null;

private BorderLayout mainLayout =

new BorderLayout(0, 0);

private final FlowLayout buttonLayout =

new FlowLayout(FlowLayout.CENTER, 0, 0);

private final JPanel buttonPanel = new JPanel(buttonLayout);

private final SpinnerNumberModel hModel =

new SpinnerNumberModel(0, 0, 15, 1);

private final SpinnerNumberModel vModel =

new SpinnerNumberModel(0, 0, 15, 1);

private final SpinnerNumberModel hBorderModel =

new SpinnerNumberModel(0, 0, 15, 1);

private final SpinnerNumberModel vBorderModel =

new SpinnerNumberModel(0, 0, 15, 1);

private ChangeListener changeListener;

public Container getGui() {

if (gui == null) {

gui = new JPanel(mainLayout);

gui.setBackground(Color.RED);

JTree tree = new JTree();

tree.setVisibleRowCount(10);

for (int ii = tree.getRowCount(); ii > -1; ii--) {

tree.expandRow(ii);

}

gui.add(new JScrollPane(

tree,

JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,

JScrollPane.HORIZONTAL_SCROLLBAR_NEVER),

BorderLayout.LINE_START);

gui.add(new JScrollPane(new JTextArea(10, 30)));

gui.add(buttonPanel, BorderLayout.PAGE_START);

changeListener = (ChangeEvent e) -> {

int hGap = hModel.getNumber().intValue();

int vGap = vModel.getNumber().intValue();

int hBorder = hBorderModel.getNumber().intValue();

int vBorder = vBorderModel.getNumber().intValue();

adjustWhiteSpace(hGap, vGap, hBorder, vBorder);

};

addModel("H Gap", hModel);

addModel("V Gap", vModel);

addModel("H Border", hBorderModel);

addModel("V Border", vBorderModel);

}

return gui;

}

private void addModel(String label, SpinnerNumberModel model) {

buttonPanel.add(new JLabel(label));

final JSpinner spinner = new JSpinner(model);

spinner.addChangeListener(changeListener);

buttonPanel.add(spinner);

}

private void adjustWhiteSpace(

int hGap, int vGap, int hBorder, int vBorder) {

mainLayout.setHgap(hGap);

mainLayout.setVgap(vGap);

buttonLayout.setHgap(hGap);

gui.setBorder(new EmptyBorder

(vBorder, hBorder, vBorder, hBorder));

Container c = gui.getTopLevelAncestor();

if (c instanceof Window) {

Window w = (Window) c;

w.pack();

}

}

public static void main(String[] args) {

Runnable r = () -> {

WhiteSpace ws = new WhiteSpace();

Container gui1 = ws.getGui();

JFrame f = new JFrame("White (OK Red) Space");

f.add(gui1);

f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

f.setLocationByPlatform(true);

f.setResizable(false);

f.pack();

f.setVisible(true);

};

SwingUtilities.invokeLater(r);

}

}

使用BoxLayout時,Box.createVerticalGlue()方法可以幫助您留出一些空白。

另一種方法是BorderFactory.createEmptyBorder(int top, int left, int bottom, int right)。它可以幫助您在元件周圍留一些空白。

感謝安德魯·湯普森(Andrew Thompson)的提醒。最近幾天,我對BoxLayout進行了修改,我發現Box.createVerticalGlue()可以根據面闆的大小添加一些空白,并且您不能設定空白長度的顯式像素值。但是可以做到。這是一個MCTaRE,顯示了這兩種方法的效果。

java swing 空白_關于Java:在Swing GUI中提供空白

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import javax.swing.border.*;

import javax.swing.event.*;

public class WhiteSpace extends JFrame{

static WhiteSpace whiteSpace;

DemoPanel demoPanel;

boolean withGlue;

JSpinner spinner;

public WhiteSpace(){

initialWindow();

demoPanel = new DemoPanel();

ActionPanel actionPanel = new ActionPanel();

setLayout(new BorderLayout());

getContentPane().add(actionPanel,BorderLayout.NORTH);

getContentPane().add(demoPanel,BorderLayout.CENTER);

setVisible(true);

}

public void initialWindow(){

setSize(220, 300);

setTitle("White Space");

setResizable(false);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setLocationRelativeTo(null);

//Show the window in the middle of the screen

}

public static void main(String[] args) {

Runnable runnable = new Runnable() {

@Override

public void run() {

whiteSpace = new WhiteSpace();

}

};

SwingUtilities.invokeLater(runnable);

}

class DemoPanel extends JPanel{

//Show the vertical white space between label1 and label2

JLabel label1;

JLabel label2;

public void initialDemoPanel(){

setBorder(BorderFactory.createTitledBorder(getBorder(),"DemoPanel", TitledBorder.LEADING, TitledBorder.TOP, new Font("Default",Font.PLAIN,10), Color.gray));

setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));

label1 = new JLabel("This is first line");

label2 = new JLabel("This is second line");

}

public DemoPanel(){

initialDemoPanel();

add(label1);

if(withGlue){

add(Box.createVerticalGlue());

}

add(label2);

}

public DemoPanel(int strutValue){

initialDemoPanel();

add(label1);

add(Box.createVerticalStrut(strutValue));

add(label2);

}

}

class ActionPanel extends JPanel{

public ActionPanel(){

setBorder(BorderFactory.createTitledBorder(getBorder(),"ActionPanel", TitledBorder.LEADING, TitledBorder.TOP, new Font("Default",Font.PLAIN,10), Color.gray));

setLayout(new BoxLayout(this,BoxLayout.X_AXIS));

JRadioButton glueButton = new JRadioButton("With Glue");

glueButton.addActionListener(new glueButtonListener());

add(glueButton);

add(Box.createHorizontalStrut(10));

//To create horizontal white space

JLabel strutLabel = new JLabel("Strut Value");

add(strutLabel);

spinner = new JSpinner(new SpinnerNumberModel(0,0,50,1));

spinner.addChangeListener(new spinnerListener());

add(spinner);

//public SpinnerNumberModel(Number value,Comparable minimum,Comparable maximum,Number stepSize)

}

}

class glueButtonListener implements ActionListener{

@Override

public void actionPerformed(ActionEvent e) {

spinner.setValue(new Integer(0));

withGlue = (withGlue == true ? false:true);

whiteSpace.getContentPane().remove(demoPanel);

demoPanel = new DemoPanel();

whiteSpace.getContentPane().add(demoPanel,BorderLayout.CENTER);

whiteSpace.getContentPane().validate();

}

}

class spinnerListener implements ChangeListener{

@Override

public void stateChanged(ChangeEvent e) {

int strutValue = (Integer) spinner.getValue();

whiteSpace.getContentPane().remove(demoPanel);

demoPanel = new DemoPanel(strutValue);

whiteSpace.getContentPane().add(demoPanel,BorderLayout.CENTER);

whiteSpace.getContentPane().validate();

}

}

}

Box.createHorizontalGlue()和Box.createHorizontalStrut(int height)也可以使用。此外,Box.createRigidArea(Dimension d)也具有建立空白的能力。

MigLayout具有多種建立空間的方式。 (在此布局中,空格稱為間隙。)

可以在具有布局限制的最進階别上建立間隙,可以

在行和列之間建立間隙,也可以在各個之間設定間隙

具有元件限制的元件。邊界周圍也有特定的空白

一個名為insets的容器,它具有要設定的特定關鍵字。

以下示例建立了所有這些類型的差距:

package com.zetcode;

import java.awt.EventQueue;

import javax.swing.BorderFactory;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JTextField;

import net.miginfocom.swing.MigLayout;

public class MigLayoutGaps2 extends JFrame {

public MigLayoutGaps2() {

initUI();

setTitle("Gaps");

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setLocationRelativeTo(null);

}

private void initUI() {

JPanel base = new JPanel(new MigLayout("flowy, ins 30, gap 15"));

setContentPane(base);

JPanel pnl1 = new JPanel();

pnl1.setBorder(

BorderFactory.createTitledBorder("Grid gaps")

);

pnl1.setLayout(new MigLayout("gap 5 5, ins 10, wrap 3"));

pnl1.add(new JButton("1"));

pnl1.add(new JButton("2"));

pnl1.add(new JButton("3"));

pnl1.add(new JButton("4"));

pnl1.add(new JButton("5"));

pnl1.add(new JButton("6"));

JPanel pnl2 = new JPanel();

pnl2.setBorder(

BorderFactory.createTitledBorder("Column gaps")

);

pnl2.setLayout(new MigLayout("wrap 3","[]10[]"));

JLabel lbl1 = new JLabel();

lbl1.setBorder(

BorderFactory.createEtchedBorder()

);

JLabel lbl2 = new JLabel();

lbl2.setBorder(

BorderFactory.createEtchedBorder()

);

JLabel lbl3 = new JLabel();

lbl3.setBorder(

BorderFactory.createEtchedBorder()

);

pnl2.add(lbl1,"w 40, h 110");

pnl2.add(lbl2,"w 40, h 110");

pnl2.add(lbl3,"w 40, h 110");

JPanel pnl3 = new JPanel();

pnl3.setBorder(

BorderFactory.createTitledBorder("Row gaps")

);

pnl3.setLayout(new MigLayout("wrap","","[]15[]"));

JLabel lbl4 = new JLabel();

lbl4.setBorder(

BorderFactory.createEtchedBorder()

);

JLabel lbl5 = new JLabel();

lbl5.setBorder(

BorderFactory.createEtchedBorder()

);

JLabel lbl6 = new JLabel();

lbl6.setBorder(

BorderFactory.createEtchedBorder()

);

pnl3.add(lbl4,"w 150, h 20");

pnl3.add(lbl5,"w 150, h 20");

pnl3.add(lbl6,"w 150, h 20");

JPanel pnl4 = new JPanel();

pnl4.setBorder(

BorderFactory.createTitledBorder("Component gaps")

);

pnl4.setLayout(new MigLayout());

pnl4.add(new JLabel("Name:"),"gapright 5");

pnl4.add(new JTextField(10),"gapbottom 20, gaptop 20");

base.add(pnl1);

base.add(pnl2);

base.add(pnl3);

base.add(pnl4);

pack();

}

public static void main(String[] args) {

EventQueue.invokeLater(new Runnable() {

@Override

public void run() {

MigLayoutGaps2 ex = new MigLayoutGaps2();

ex.setVisible(true);

}

});

}

}

布局中有四個面闆。每個面闆都有一個MigLayout管理器。

JPanel base = new JPanel(new MigLayout("flowy, ins 30, gap 15"));

這條線會産生容器插圖和面闆之間的垂直間隙。

pnl1.setLayout(new MigLayout("gap 5 5, ins 10, wrap 3"));

在這裡,我們為整個網格結構應用間隙,并設定容器間隙。

pnl2.setLayout(new MigLayout("wrap 3","[]10[]"));

這條線在列之間産生間隙。

pnl3.setLayout(new MigLayout("wrap","","[]15[]"));

行間隙是用此代碼定義的。

pnl4.add(new JLabel("Name:"),"gapright 5");

pnl4.add(new JTextField(10),"gapbottom 20, gaptop 20");

最後,有可能在各個元件之間産生間隙。

java swing 空白_關于Java:在Swing GUI中提供空白

JGoodies FormLayout。

作者Karsten Lentzsch收集了有關UI設計的示範文稿。特别是,此PDF談到了美學空白的需求。增加有意義的空間,同時還要注意雜亂,使小麥與谷殼分離。

每當遇到此問題時,我都隻使用JPanels。例如在GridLayout中:

JFrame frame = new JFrame;

frame.setLayout(new GridLayout(2, 0));

//We want the bottom left to be blank

frame.add(new JLabel("Top Left"));

frame.add(new JLabel("Top Right"));

//This is the position we want empty

frame.add(new JPanel());

//Now we can continue with the rest of the script

希望這有幫助:)