尝试将布局设置为 BoxLayout



我似乎无法在线找到解决方案,为什么我在尝试运行时收到此错误

我正在努力为不同的程序制作一个简单的测试系统,当按下按钮将在文本框中产生值时。 我希望它们在不同的线上以使其更干净,所以我研究了布局。 我决定盒子布局最适合我。 在尝试这样做之前,我查看了不同的示例,我的代码最终看起来像这样,(为混乱的代码道歉(

更新

使框布局错误消失,但代码不会将它们居中在面板/框架上。 标签和按钮向左对齐,而文本字段变得非常大。我不需要它来做那个

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import static javax.swing.BoxLayout.Y_AXIS;
import static javax.swing.SwingConstants.CENTER;
public class button extends JFrame {
static JFrame f;
static JButton b;
static JLabel l;
// main class
public static void main(String[] args)
{
// create a new frame to stor text field and button
f = new JFrame("panel");
BoxLayout layout = new BoxLayout(f, BoxLayout.Y_AXIS);
f.setLayout(layout);
// create a label to display text
l = new JLabel("panel label");
b = new JButton("button1");
JTextField textArea = new JTextField(5);
textArea.setEditable(false);
//textArea.append("Hello World");

// create a panel to add buttons
JPanel p = new JPanel();
// add buttons and textfield to panel
f.add(p);
f.setSize(300, 300);
p.add(l);
p.add(b);
p.setBackground(Color.white);
p.add(textArea);
f.show();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
Random r = new Random();
textArea.setText(String.valueOf(r));
}
});
}
}



Error
Exception in thread "main" java.awt.AWTError: BoxLayout can't be shared
at java.desktop/javax.swing.BoxLayout.checkContainer(BoxLayout.java:461)
at java.desktop/javax.swing.BoxLayout.invalidateLayout(BoxLayout.java:245)
at java.desktop/javax.swing.BoxLayout.addLayoutComponent(BoxLayout.java:278)
at java.desktop/java.awt.Container.addImpl(Container.java:1152)
at java.desktop/java.awt.Container.add(Container.java:1029)
at java.desktop/javax.swing.JFrame.addImpl(JFrame.java:553)
at java.desktop/java.awt.Container.add(Container.java:436)
at button.main(button.java:36)

我希望这三个项目都堆叠在另一个之上,并在它们之间留出空间。 顺序现在无关紧要。

Swing于 1998 年首次添加到 JDK 中,此后经历了许多更改。不幸的是,当您阅读有关Swing的网页时,该页面上次更新的时间并不明显。因此,您可能正在学习编写Swing代码的过时技术。

首先,根据您发布的代码,类button不需要扩展类JFrame,因为您使用静态变量作为应用程序的JFrame。此外,JFrame是一个顶级容器,这使它成为一种特殊的容器,而不是与JPanel相同的保持器。您需要为JPanel设置布局管理器,然后将JLabelJTextFieldJButton添加到该JPanel。然后将JPanel添加到JFrame.

调用类JFrame的方法pack()将自动设置JFrame内组件的首选大小。它出现在下面的代码中。

另请查看Java编码约定,它允许其他人更轻松地阅读和理解您的代码。请注意,根据这些约定,我将你的类从button重命名为Buttons,也因为 JDK 中已经有几个类名为Button.

这是我对您的代码的重写...

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
public class Buttons implements Runnable {
public void run() {
createAndShowGui();
}
private void createAndShowGui() {
JFrame f = new JFrame("Box");
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JPanel p = new JPanel();
BoxLayout layout = new BoxLayout(p, BoxLayout.Y_AXIS);
p.setLayout(layout);
JLabel l = new JLabel("panel label");
JTextField textField = new JTextField(5);
JButton b = new JButton("button1");
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
Random r = new Random();
textField.setText(String.valueOf(r.nextBoolean()));
}
});
p.add(l);
p.add(textField);
p.add(b);
f.add(p);
f.pack();
f.setLocationByPlatform(true);
f.setVisible(true);
}
public static void main(String[] args) {
Buttons instance = new Buttons();
EventQueue.invokeLater(instance);
}
}

相关内容

  • 没有找到相关文章

最新更新