我有这个Java JFrame类,我想在其中使用boxlayout,但是我得到一个错误说法java.awt.AWTError: BoxLayout can't be shared.我见过其他人有这个问题,但是他们通过在contentpane上创建boxlayout来解决它,但这就是我在这里所做的.这是我的代码:
class edit_dialog extends javax.swing.JFrame{
javax.swing.JTextField title = new javax.swing.JTextField();
public edit_dialog(){
setDefaultCloseOperation(javax.swing.JFrame.DISPOSE_ON_CLOSE);
setTitle("New entity");
getContentPane().setLayout(
new javax.swing.BoxLayout(this, javax.swing.BoxLayout.PAGE_AXIS));
add(title);
pack();
setVisible(true);
}
}
Run Code Online (Sandbox Code Playgroud) 我在一BoxLayout组中有四个按钮.这只是两个样本,因为它都是重复的代码.我想在每个按钮之间创建一个小空间,这样它们就不会相互碰撞.我几乎尝试了所有方法,但.add(Box.Create....)没有任何效果.
enter.add(Box.createVerticalGlue());
enter.add(Box.createHorizontalGlue());
//enter.add(new JSeparator(SwingConstants.HORIZONTAL));
JButton float = new JButton("LOWER");
float.add(Box.createVerticalGlue());
float.add(Box.createHorizontalGlue());
Run Code Online (Sandbox Code Playgroud) 我浏览过,并没有找到专门针对我的情况定制的解决方案.我有一个面板,我在对话框中显示:
//create dialog panel
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.add(headerPanel);
panel.add(type1Panel);
panel.add(type2Panel);
panel.add(type3Panel);
panel.add(type4Panel);
panel.add(type5Panel);
panel.add(type6Panel);
int result = JOptionPane.showConfirmDialog(null, panel, "Please enter values.", JOptionPane.OK_CANCEL_OPTION);
Run Code Online (Sandbox Code Playgroud)
最后两个面板的大小,类型5和类型6,大小相同,所以它们看起来很好.但是,标题和前4个面板的大小不同,我希望它们全部左对齐.到目前为止,我还没有找到一个很好的解决方案,如何解决这个问题.
问题是,我怎么能保持对齐前5个面板,而不是最后2个?如果不是,我怎么能将它们全部对齐?setalignmentx()不适用于面板.我已经使用网格布局尝试过,但随后的GUI的主窗口的宽度相当大,不能很好地适应屏幕,因此BoxLayout的沿Ÿaxis.Thanks任何帮助或建议.
我觉得我需要稍微改一下这个问题.
更新了以下问题.
我有一个JPanel包含:
myjpanel.setLayout(new BoxLayout(selectors, BoxLayout.PAGE_AXIS));
Run Code Online (Sandbox Code Playgroud)
它包含以下三个面板:
固定大小为'x'和'y'的JPanel
JPanel没有固定的大小
JPanel没有固定的尺寸和小的高度
第二个JPanel包含一个JTable,因此它会扩展以填充整个高度,并按预期方式将底部面板完全按下.
像这样:
t
t
m
m
m
m
m
b
Run Code Online (Sandbox Code Playgroud)
t =顶部面板,m =中间面板,b =底部面板.
这样可行.但是底部面板不像填充父级的整个宽度那样是一个问题.
ttt
mmm
b
Run Code Online (Sandbox Code Playgroud)
我想要这个,面板填充整个宽度:
ttt
mmm
bbb
Run Code Online (Sandbox Code Playgroud)
或者,底部面板保持居中的位置:
ttt
mmm
b
Run Code Online (Sandbox Code Playgroud)
老问题如下:
我有一个JPanel包含:
.setLayout(new BoxLayout(selectors, BoxLayout.PAGE_AXIS));
Run Code Online (Sandbox Code Playgroud)
在其中,还有三个JPanels.前两个是固定大小而中间一个不是.
我希望我的底部面板只占用它所需的高度,但使用外部JPanel的所有可用宽度.
我尝试过使用胶水,但无济于事,我宁愿不设置首选和最小/最大尺寸.有没有办法告诉组件只使用布局管理器和框架"填充整个父级宽度".我宁愿不开始做像设置大小和重写方法的黑客.
注意:我不能在内部面板中放置任何胶水或填充物,只能修改外部面板及其布局管理器.
尝试1:
使用myPanel.setLayout(new GridLayout(3, 1));没有产生预期的结果.它做了一个像这样的网格:
XX
X
Run Code Online (Sandbox Code Playgroud)
但我预计:
X
X
X
Run Code Online (Sandbox Code Playgroud)
尝试2:
使用myPanel.setLayout(new GridLayout(0,1));没有产生预期的结果.它做了一个像这样的网格:
x
x
x
Run Code Online (Sandbox Code Playgroud)
但是所有面板的尺寸都相同,忽略了限制.
大多数布局管理器都没有参数构造函数(也就是说,你可以创建一个FlowLayout new FlowLayout (),一个GridLayout new GridLayout (),一个GridBagLayout new GridBagLayout ()等).但是,BoxLayout要求您传递将要管理的容器和应该布置组件的轴.
我的问题是:既然你已经告诉布局管理器要布局哪个组件,你为什么要写
BoxLayout bl = new BoxLayout(myPanel, BoxLayout.Y_AXIS);
myPanel.setLayout(bl);
Run Code Online (Sandbox Code Playgroud)
而不只是第一行?
我参加了一个快速浏览的BoxLayout源代码,看到的构造我使用(178-185线)不拨打电话到target.setLayout(this)的那种或任何东西.看起来添加它真的很简单.有没有理由为什么它不包含在Swing库中?
如果重要,我正在使用
java版本1.7.0
Java(TM)SE运行时环境(版本1.7.0-b147)
在Win7Pro上.
谢谢!
SSCCE:
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;
public class BoxLayoutSSCCE extends JFrame {
// Change this to see what I mean
public static final boolean CALL_SET_LAYOUT = true;
public BoxLayoutSSCCE () {
super("Box Layout SSCCE");
JPanel panel = new JPanel();
BoxLayout bl = new …Run Code Online (Sandbox Code Playgroud) 面对使用BoxLayout的问题
在我的示例中,我尝试降低文本字段的高度并更改按钮的宽度(如图中的绿色标记所示).我知道setPrefferedSize()和setMaximumSize()技术,但它没有按预期工作.行添加(Box.createHorizontalGlue())也没有帮助.
谢谢你的想法
public class Testy extends JPanel {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
constructGUI();
}
});
}
private static void constructGUI() {
JFrame frame = new JFrame("Testy");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JPanel centerPanel = new JPanel();
centerPanel.setBackground(Color.DARK_GRAY);
centerPanel.setPreferredSize(new Dimension(100, 400));
frame.add(centerPanel, BorderLayout.CENTER);
Testy eastPanel = new Testy();
frame.add(eastPanel, BorderLayout.EAST);
frame.pack();
frame.setVisible(true);
}
public Testy() {
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
JButton button = new JButton("Button ...... 1");
//button.setPreferredSize(...);
//button.setMaximumSize(...);
add(button);
button = new JButton("Button 2"); …Run Code Online (Sandbox Code Playgroud) 我想做什么
在Swing中,我试图使用一个BoxLayout或等效的线性容器,但容器中的项目是垂直拉伸的.在我的应用程序中,我不希望它们垂直拉伸.
我知道我可以在组件上设置preferredSize或maximumSize,但是下面的代码只是一个复制器,我不能硬编码或最大化组件的大小,这些组件的真实性更加复杂和动态.而我只是不能使用BorderLayout与BorderLayout.TOP位置,因为没有滚动条都不会显示如果我这样做.我可能需要滚动窗格.
我试过了什么
所以我尝试使用fillersin in BoxLayoutin In Inibleible Components as Filler,但它只是不起作用.虽然在Oracle文档中,它似乎正是我所需要的.以下是我的尝试:
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class TestBoxLayout implements Runnable {
public static void main(String[] args) {
SwingUtilities.invokeLater(new TestBoxLayout());
}
@Override
public void run() {
JFrame f = new JFrame("test box layout");
JPanel b = new JPanel();
b.setLayout(new BoxLayout(b, BoxLayout.PAGE_AXIS));
b.add(new JTextField("field 1"));
b.add(new JTextField("field 2"));
b.add(new JTextField("field 3")); …Run Code Online (Sandbox Code Playgroud) 在下面的代码,通过调用setAlignmentX与Component.LEFT_ALIGNMENT我预计在居中滑块获得靠左对齐的标签.由于某种原因,标签也是居中的,看起来无论传递给setAlignmentX的值是什么.
我必须将什么值传递给setAlignmentX以使其保持对齐?
package myjava;
import java.awt.Component;
import java.awt.Container;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JSlider;
public class LayoutTest {
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame("BoxLayoutDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// create left aligned label over centered column
Container contentPane = frame.getContentPane();
contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS));
JLabel label = new JLabel("test");
label.setAlignmentX(Component.LEFT_ALIGNMENT);
contentPane.add(label);
contentPane.add(new JSlider());
frame.pack();
frame.setVisible(true);
}
});
}
}
Run Code Online (Sandbox Code Playgroud) 在Java中沿y轴将某些字符对齐到BoxLayout的中心似乎存在问题.我不知道是什么导致这种情况,我已经创建了一个SSCCE来证明这种效果.在这个例子中,我只使用了字符'a',我在每个JPanel的正中间画一条线来演示每个案例离中心有多远.粗体文本的情况似乎很好,但正常的格式和斜体都非常偏离中心,尽管同时使用了setAlignmentX和setHorizontalAlignment.任何帮助理解这种效果的人都表示赞赏.
在我的特定计算机上以某种方式出现问题的情况下,这是我运行SSCCE时屏幕上显示的内容的图像,SSCCE沿着y轴加载三个不同的带有BoxLayouts的JPanel并仅放置一个居中的JLabel每个角色'a':

这是SSCCE的代码:
import javax.swing.*;
import java.awt.*;
import javax.swing.border.*;
public class AlignmentTest extends JPanel
{
public AlignmentTest(char label, int style)
{
JLabel l = new JLabel(Character.toString(label));
setBorder(BorderFactory.createLineBorder(Color.BLACK,1));
setBackground(Color.WHITE);
setLayout(new BoxLayout(this,BoxLayout.Y_AXIS));
setPreferredSize(new Dimension(300,50));
add(Box.createVerticalGlue());
add(l);
l.setFont(l.getFont().deriveFont(style));
l.setAlignmentX(CENTER_ALIGNMENT);
l.setHorizontalAlignment(JLabel.CENTER);
add(Box.createVerticalGlue());
}
public static void main(String[] args)
{
JFrame f = new JFrame("Alignment Test");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLayout(new GridLayout(1,0,5,5));
f.add(new AlignmentTest('a',Font.PLAIN));
f.add(new AlignmentTest('a',Font.BOLD));
f.add(new AlignmentTest('a',Font.ITALIC));
f.pack();
f.setVisible(true);
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.drawLine(getWidth()/2,0,getWidth()/2,getHeight());
}
}
Run Code Online (Sandbox Code Playgroud) 我对此感到困惑.
案例A.
案例B
为什么案例A抛出异常而案例B没有抛出异常?为什么FlowLayout和BoxLayout在这方面表现不同?在案例A中,"BoxLayout无法共享"是什么意思?
我在这个网站上读过一些关于这个异常消息的类似线程,但我仍然对与FlowLayout的比较以及异常消息的确切含义感到困惑.