我正在尝试使用Java Layouts创建一个非常简单的窗口.我有三个元素可以安排:按钮,进度条和标签.按钮必须垂直居中,进度条必须采用全宽,标签必须左对齐.
这是一些代码(只是假设窗格是JFrame的内容窗格,并且之前已创建了按钮,progressBar和标签):
BoxLayout layout = new BoxLayout(pane, BoxLayout.Y_AXIS);
pane.setLayout(layout);
button.setAlignmentX(Component.CENTER_ALIGNMENT);
pane.add(button);
progressBar.setAlignmentX(Component.CENTER_ALIGNMENT);
pane.add(progressBar);
label.setAlignmentX(Component.LEFT_ALIGNMENT);
pane.add(label);
Run Code Online (Sandbox Code Playgroud)
当我测试应用程序时,我发现所有内容都未对齐并搞砸了:按钮和标签是随机缩进的,如果我调整窗口大小,缩进量会以一种奇怪的方式变化.进度条看起来很好(全宽).
我只是不明白发生了什么.你能给我一个线索吗?
有人知道如何开始在 Java Swing 中调试此错误吗?
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at javax.swing.BoxLayout.preferredLayoutSize(BoxLayout.java:282)
at java.awt.Container.preferredSize(Container.java:1599)
at java.awt.Container.getPreferredSize(Container.java:1584)
at javax.swing.JComponent.getPreferredSize(JComponent.java:1636)
at java.awt.BorderLayout.layoutContainer(BorderLayout.java:804)
at java.awt.Container.layout(Container.java:1421)
at java.awt.Container.doLayout(Container.java:1410)
at java.awt.Container.validateTree(Container.java:1507)
at java.awt.Container.validateTree(Container.java:1513)
at java.awt.Container.validate(Container.java:1480)
at javax.swing.plaf.basic.BasicTabbedPaneUI.ensureCurrentLayout(BasicTabbedPaneUI.java:1429)
at javax.swing.plaf.basic.BasicTabbedPaneUI.getTabBounds(BasicTabbedPaneUI.java:1449)
at javax.swing.plaf.synth.SynthTabbedPaneUI.setRolloverTab(SynthTabbedPaneUI.java:491)
at javax.swing.plaf.basic.BasicTabbedPaneUI$TabbedPaneLayout.layoutContainer(BasicTabbedPaneUI.java:2384)
at java.awt.Container.layout(Container.java:1421)
at java.awt.Container.doLayout(Container.java:1410)
at java.awt.Container.validateTree(Container.java:1507)
at java.awt.Container.validate(Container.java:1480)
at javax.swing.plaf.basic.BasicTabbedPaneUI.ensureCurrentLayout(BasicTabbedPaneUI.java:1429)
at javax.swing.plaf.basic.BasicTabbedPaneUI.getTabBounds(BasicTabbedPaneUI.java:1449)
at javax.swing.plaf.synth.SynthTabbedPaneUI.setRolloverTab(SynthTabbedPaneUI.java:498)
at javax.swing.plaf.basic.BasicTabbedPaneUI.setRolloverTab(BasicTabbedPaneUI.java:558)
at javax.swing.plaf.basic.BasicTabbedPaneUI.access$2000(BasicTabbedPaneUI.java:37)
at javax.swing.plaf.basic.BasicTabbedPaneUI$Handler.mouseMoved(BasicTabbedPaneUI.java:3645)
at java.awt.Component.processMouseMotionEvent(Component.java:6333)
at javax.swing.JComponent.processMouseMotionEvent(JComponent.java:3285)
at java.awt.Component.processEvent(Component.java:6057)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4651)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4481)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4251)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at …Run Code Online (Sandbox Code Playgroud) 这是一个SSCCE:
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class BoxLayoutTest extends JFrame {
public BoxLayoutTest(){
JPanel main = new JPanel();
main.setLayout(new BoxLayout(main, BoxLayout.Y_AXIS));
main.setBackground(Color.red);
this.add(main);
JPanel northPanel = new JPanel();
JPanel middle = new JPanel();
middle.setLayout(new BoxLayout(middle, BoxLayout.X_AXIS));
middle.add(new JButton("FOO"));
middle.add(Box.createHorizontalGlue());
JPanel aPanel = new JPanel();
aPanel.setBackground(Color.black);
JComboBox b = new JComboBox();
//b.setPreferredSize(new Dimension(100,16)); //uncomment this to see the layout I would like to achieve
//b.setMaximumSize(new Dimension(100,16));
//middle.add(b); //uncomment this …Run Code Online (Sandbox Code Playgroud) 我正在尝试用 C# 设计 UI。我有 Java 背景,熟悉 Java 中的不同布局管理器。
所以我想做的是:
我有一个窗格。我希望在此窗格中逐个添加控件。在 Java 中,我会使用 BoxLayout(Y 轴),然后添加控件。此外,可以通过为每个单独的容器使用不同的布局来进一步定制单独的控件/容器。
我如何在 C# 中执行此操作?
我需要做的是:
1)添加一个在另一个之下的控件。每个单独的控件都可以是较小控件的集合。
所以我能拥有的是这样的:
Control 1 here
Control 2 here
Control 3 here
Run Code Online (Sandbox Code Playgroud)
每个控件都可以有自己的布局,例如 X 轴上的 BoxLayout 等等。我该如何做这一切?
PS:我用的是WINFORMS。
这是代码:
Box twoPanelBox= new Box(BoxLayout.Y_AXIS);
twoPanelBox.add(panelA); // red
twoPanelBox.add(new JSeparator(SwingConstants.HORIZONTAL) );
twoPanelBox.add(panelB); // black
Run Code Online (Sandbox Code Playgroud)
这就是我得到的:

红色和黑色面板按预期显示,其中分隔符(绿色框周围)之间有一个边距.
如何避免这种萎缩,并消除这个空间(灰色区域)?谢谢
我想保持我的两个 JLabel 文本左对齐,同时将我的 boxLayout 放在 JFrame 的中心。
我在我的 boxlayout 面板上尝试了 setAlignmentX(CENTER_ALIGNMENT) 但它没有将我的 boxlayout 放在中心。
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class GuiTest extends JFrame {
private static final long serialVersionUID = 1L;
private JLabel jLabelOne = new JLabel();
private JLabel jLabelTwo = new JLabel();
private JPanel panel = new JPanel();
private BoxLayout boxLayout = new BoxLayout(panel,BoxLayout.Y_AXIS);
public GuiTest() {
jLabelOne.setAlignmentX(LEFT_ALIGNMENT);
jLabelTwo.setAlignmentX(LEFT_ALIGNMENT);
jLabelOne.setText("This is text one");
jLabelTwo.setText("This is text two");
panel.setLayout(boxLayout);
panel.add(jLabelOne);
panel.add(jLabelTwo);
panel.setAlignmentX(CENTER_ALIGNMENT);
add(panel);
pack();
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setSize(1024,768); …Run Code Online (Sandbox Code Playgroud) 我有这门课:
package com.erikbalen.game.rpg;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class Gui extends JFrame implements ActionListener {
/**
*
*/
private static final long serialVersionUID = -384241835772507459L;
JLabel playerInfo;
JTextField textField;
private final static String newline = "\n";
JTextArea feed;
JScrollPane scrollPane;
Player player;
public Gui() {
super("Erik's RPG");
//setLayout(new FlowLayout());
Container contentPane = this.getContentPane();
contentPane.setLayout(new BoxLayout(contentPane,BoxLayout.PAGE_AXIS));
textField = new JTextField(30);
textField.addActionListener(this);
feed = new JTextArea(15, 30);
feed.setEditable(false);
scrollPane = new JScrollPane(feed);
}
Run Code Online (Sandbox Code Playgroud)
当你运行它时,它会使textField真的很高,如果我扩展它,即使我只希望它是一定的高度.我怎么能够
我正在用 Swing 编写一个简单的输入图。我使用 boxLayout 创建一个简单的用户输入 GUI。问题是在所有标签的 JPanel 和 JTextFields 的 JPanel 之间创建水平支柱会导致整个面板向下移动(奇怪)这是整个面板:
private JPanel secondCard() {
//main panel. set the boxlayout
secondCard = new JPanel();
secondCard.setLayout(new BoxLayout(secondCard,BoxLayout.Y_AXIS));
// create vertical strut for looks
secondCard.add(Box.createVerticalStrut(20));
// create title. center it.
JLabel title = new JLabel("Configure main network parameters ");
title.setAlignmentX(CENTER_ALIGNMENT);
secondCard.add(title);
// create vertical strut for looks
secondCard.add(Box.createVerticalStrut(20));
// create panel for the description labels
JPanel labelPanel = new JPanel();
labelPanel.setLayout(new BoxLayout(labelPanel,BoxLayout.Y_AXIS));
labelPanel.setAlignmentX(LEFT_ALIGNMENT);
JLabel inPut =new JLabel("number of inputs");
inPut.setAlignmentX(LEFT_ALIGNMENT);
labelPanel.add(inPut); …Run Code Online (Sandbox Code Playgroud) 我希望能够有三个JPanels p1 p2和p3,并让它们像这样布局:

我一直在玩FlowLayout,BoxLayout等,但我不确定我是否朝着正确的方向前进.我是Java的新手,所以如果我很诚实,我不知道该怎么办.
我喜欢BoxLayout如何工作,调整面板的大小,但我希望能够给它一些宽度属性.
我没有使用视觉设计师,这是我目前的窗口代码:
private void initialize() {
Dimension dimensions = Toolkit.getDefaultToolkit().getScreenSize();
frame = new JFrame();
frame.setLayout(new GridLayout(1, 3));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(dimensions.width / 2 - WINDOW_WIDTH / 2,
dimensions.height / 2 - WINDOW_HEIGHT / 2,
WINDOW_WIDTH, WINDOW_HEIGHT);
JPanel p1 = new JPanel(new BorderLayout());
p1.setBackground(Color.red);
JPanel p2 = new JPanel(new BorderLayout());
p2.setBackground(Color.black);
JPanel p3 = new JPanel(new BorderLayout());
p3.setBackground(Color.blue);
frame.add(p2);
frame.add(p1);
frame.add(p3);
}
Run Code Online (Sandbox Code Playgroud)
任何指针赞赏!
编辑:感谢mKorbel,我已经设法让它按照我想要的方式工作.正确的列没有完全像我要做的那样布局,但实际上我改变了主意并决定保留其他布局.

代码:
import java.awt.*;
import javax.swing.*;
public class PanelWindow extends JFrame {
private static final long …Run Code Online (Sandbox Code Playgroud) 这是一个功能:
/**
* Creates an instance of a JLabel with the given arguments
* @param text The text to be displayed on the Label
* @param font The font of the label
* @param bold set to true if you want the label's text to be bold
* @param fontSize The size of the font to be rendered
* @param alignment An alignment (E.g. CENTER_ALIGNMENT)
* @param verticleAlignment an optional argument to allow one to choose the Y alignment
* …Run Code Online (Sandbox Code Playgroud)