gpt4 book ai didi

java - 尝试将布局设置为 BoxLayout

转载 作者:行者123 更新时间:2023-12-01 19:34:39 26 4
gpt4 key购买 nike

我似乎无法在网上找到解决方案来解释为什么我在尝试运行时遇到此错误

我正在为不同的程序制作一个简单的测试系统,当按下按钮时将在文本框中产生值。我希望它们位于不同的行以使其更清晰,所以我研究了布局。我认为盒子布局最适合我。在尝试此操作之前,我查看了不同的示例,我的代码最终看起来像这样,(对困惑的代码表示歉意)

更新

使框布局错误消失,但代码不会将它们集中在面板/框架上。当文本字段变得非常大时,标签和按钮左对齐。我不需要它来做到这一点

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 代码的过时技术。

首先,根据你贴出的代码,class button不需要扩展类JFrame因为您使用静态变量作为应用程序的 JFrame 。另外,JFrame是一个顶级容器,这使得它成为一种特殊的容器,而不是与 JPanel 相同的容器。 。您需要为您的 JPanel 设置布局管理器然后添加 JLabel , JTextFieldJButton到那个JPanel 。然后添加JPanelJFrame .

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

另请查看Java coding conventions这使其他人可以更轻松地阅读和理解您的代码。请注意,根据这些约定,我将您的类从 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);
}
}

关于java - 尝试将布局设置为 BoxLayout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58279916/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com