我正在测试kivy,我想创建一个BoxLayout,以便堆叠一些按钮.我的问题是添加到布局中的子项遵循底层逻辑,而我想要相反.你知道我怎么能改变订单?谢谢!
我想摆脱jsplitpanes左边的空白区域:

这是我的代码:
getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
splitPane.add(downloadsPanel);
splitPane.add(filesPanel);
JSplitPane splitPane2 = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
splitPane2.add(processingPanel);
splitPane2.add(messagePanel);
JSplitPane splitPane3 = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
splitPane3.add(splitPane);
splitPane3.add(splitPane2);
getContentPane().add(addPanel);
getContentPane().add(splitPane3);
Run Code Online (Sandbox Code Playgroud) 我正在使用 BoxLayout 并动态地从中删除组件,如下所示:
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
final JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS));
final JLabel l = new JLabel("remove");
frame.add(l);
frame.add(new JLabel("Hello2"));
frame.add(new JLabel("Hello3"));
frame.pack();
frame.setVisible(true);
new Thread() {
public void run() {
Utils.sleep(1000);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
frame.remove(l);
frame.repaint();
}
});
}
}.start();
}
});
}
Run Code Online (Sandbox Code Playgroud)
但是,这样做时,即使有问题的标签已从布局中删除,其他组件也不会向上移动以覆盖其空间,直到我调整框架大小。我尝试在移除组件后重新绘制框架,但没有运气 - 标签不再显示,但仍然存在原来的间隙。
除了每次删除组件时自动调整窗口大小的明显可怕的困境之外,我如何获得所需的行为?
正如您在下面的可运行代码中所看到的,我尝试使用具有可扩展子框的Box.儿童盒可以改变它们的大小,这一切都很好.主要问题是大小始终相对于父级.但我希望它们具有特定的大小,以防万一没有地方使用JScrollPane.目前他们只收缩其他儿童盒子.
我尝试了Glue和Filler,但它没有用.胶水没有任何效果,填料具有副作用,始终保持一定的位置(即使ScrollPane正在运行).拥有如此多的自由空间是非常难看的.
所以,你知道防止盒子伸展孩子的好方法吗?
先感谢您!
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.border.TitledBorder;
public class ExpandableMenueDemo {
Box allBoxes;
ExpandableMenueDemo(){
allBoxes = Box.createVerticalBox();
TitledBorder title;
title = BorderFactory.createTitledBorder("Filter");
allBoxes.setBorder(title);
for (int i = 0 ;i<3;i++){
//generate collapsable components
SubBox b = new SubBox("SubBox"+i);
allBoxes.add(b.getSwingBox());
}
allBoxes.add(Box.createVerticalGlue());
}
public Container getMenue(){
return allBoxes;
}
public static void main(String[] args) {
JFrame frame = new JFrame();
ExpandableMenueDemo …Run Code Online (Sandbox Code Playgroud) 我正在构建一个小型的swing应用程序,我在其中创建了与BoxLayout对齐的内容窗格,并为其添加了另外2个JPanel.到现在为止还挺好.
现在我偶然发现了一个问题,我必须重新创建第一个JPanel并将其添加到其他两个JPanel的中间.
可能会有多个事件,其中另一个面板添加到布局中,所以我希望它会适当扩展.
结论:我正在寻找的是将组件添加到BoxLayout,并选择在最后一个组件之前添加它们.
谢谢.
嘿,我正在尝试将面板内的所有面板对齐到较大面板的左侧.
这是我目前面临的情况:
对于主面板(包含所有其他面板的面板 - 我将其称为主面板!)我在创建它时使用以下代码:
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
Run Code Online (Sandbox Code Playgroud)
对于其中的每个面板,我也使用BoxLayout,但我在每个面板上尝试了[jpanel] .setAlignmentX(Component.LEFT_ALIGNMENT)之类的东西,但这似乎不起作用.
任何帮助,将不胜感激!
:)
编辑:对于"盒子尺寸(m):"标签,有没有办法将它对齐到它所包含的面板顶部?它在自己的一个小组中.
编辑:修复后:

以下解决方案,谢谢大家的帮助:)
我已将 a 添加JTextField到JPanel正在使用的BoxLayout.PAGE_AXIS.
然后我将此面板添加到BorderLayout.CENTER.
现在我的文本字段正在拉伸BorderLayout.CENTER.
有没有办法在不使用空布局的情况下设置此文本字段的宽度和高度?或者只是以某种方式使它不拉伸整个宽度和高度BorderLayout.CENTER?
我看到有 aJTextField.setMaximumSize(Dimension arg0);但我不确定 aDimension是什么,或者如何在这种情况下使用它。
这是我试过的:
JPanel p1 = new JPanel();
BoxLayout b1 = new BoxLayout(p1, BoxLayout.X_AXIS);
p1.setLayout(b1);
p1.add(new JButton("1"));
p1.add(Box.createHorizontalGlue());
p1.add(new JButton("1"));
Run Code Online (Sandbox Code Playgroud)
它工作得很好.按钮位于左侧和右侧
但如果我把它包装成JPanel由FlowLayout胶水管理消失.
//Flow Layout
JPanel jp = new JPanel();
//Box Layout
JPanel p1 = new JPanel();
BoxLayout b1 = new BoxLayout(p1, BoxLayout.X_AXIS);
p1.setLayout(b1);
p1.add(new JButton("1"));
p1.add(Box.createHorizontalGlue());
p1.add(new JButton("1"));
//put it into a JPanel with FlowLayout
jp.add(p1);
panel.add(jp);
Run Code Online (Sandbox Code Playgroud)
为什么?我认为胶水就像任何其他组件一样,所以它不应该消失.这是它的样子:
不能有人解释一下吗?需要注意的是,如果我把它变成一个JPanel与BoxLayout它的罚款.
我正在尝试创建一个非常简单的应用程序,它在状态栏面板上方有一个JSplitPane(分为JTabbedPane和JPanel).我想使用一个简单的布局(即BoxLayout,FlowLayout或BorderLayout),但我已经尝试了,他们都给了我同样的错误.我尽可能地简化了代码以显示错误.
错误是主框布局(框架)中应该只有2个区域:顶部(带有黑色边框的JSplitPane)和底部(带有JPanel状态栏).但是,当我添加状态栏时,左上角创建的第三个区域不包含任何内容.关于如何摆脱它的任何想法?
public static void main(String[] args) {
JFrame frame = new JFrame("Application");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS));
// Create left side of the application
JTabbedPane tabby = new JTabbedPane(JTabbedPane.LEFT);
// Create right side of the application
JPanel rightPanel = new JPanel(new BorderLayout());
// Create the status bar at the bottom
JPanel statusBar = new JPanel(new BorderLayout());
JPanel statusBarPanel = new JPanel();
statusBarLabel = new JLabel("Status Bar");
statusBarPanel.add(statusBarLabel);
parent.add(statusBarPanel);
JSplitPane mainPain = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, tabby, rightPanel);
frame.add(mainPain);
frame.add(statusBar);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
Run Code Online (Sandbox Code Playgroud)
我有一个问题BorderLayout,但首先,这是我的GUI设置:
如你所见,我内部有3个不同的组件JFrame.添加JMenu和JList工作正常.但我JPanel应该有一个固定的大小,所以我想阻止我BorderLayout拉伸面板.我尝试了一切,setPreferredSize() setMinimumSize() setMaximumSize() setSize()但布局再次拉伸我的面板以适应框架.(使用面板添加到框架中BorderLayout.CENTER).
有没有办法阻止这个或你有其他建议来管理这个问题?
我有一个JPanel,在JPanel顶部有一个垂直BoxLayout,其布局为null.
我希望带有BoxLayout的JPanel随着组件的添加而增长.
看到这段代码:
public static void main (String[] args) {
JFrame f = new JFrame();
f.setSize(500,500);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel total = new JPanel();
total.setLayout(null);
total.setSize(f.getWidth(),f.getHeight());
total.setBackground(Color.green);
JPanel box = new JPanel();
box.setLocation(100,200);
box.setLayout(new BoxLayout(box, BoxLayout.Y_AXIS));
box.add(new JButton("test"));
box.add(new JLabel("hey"));
total.add(box);
f.add(total);
f.setVisible(true);
}
Run Code Online (Sandbox Code Playgroud)
您会注意到没有任何组件出现.
如何添加更多组件(垂直添加)时,如何使JPanel"框"大小动态增加.
提前:我需要"盒子"的位置正好是100,200所以请不要建议我不使用空布局.我必须使用null布局."total"的null布局不应影响我的问题的答案,该问题集中在"box"面板上.
我有一个JPanel并设置如下:
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));
Run Code Online (Sandbox Code Playgroud)
然后我添加一个JTextField占用整个面板的:
JTextField field = new JTextField();
panel.add(field);
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试调整它的大小时:
panel.setPreferredSize(new Dimension(20,400));
Run Code Online (Sandbox Code Playgroud)
什么都没发生.为什么?我正在使用BoxLayout以便将我JLabel和JTextField组件按垂直顺序排列.如果无法调整面板的大小,我是否可以至少调整大小JTextField以使其不占用整个空间?
import java.awt.Dimension;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class GUI extends JFrame
{
public GUI() {
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));
panel.setPreferredSize(new Dimension(20,400));
JTextField field1 = new JTextField();
JTextField field2 = new JTextField();
panel.add(field1);
panel.add(field2);
}
}
Run Code Online (Sandbox Code Playgroud) boxlayout ×12
java ×11
swing ×11
jpanel ×2
layout ×2
jsplitpane ×1
kivy ×1
python ×1
python-2.7 ×1