Java GUI 中单选按钮的对齐方式

Alignment of RadioButtons in Java GUI

我的程序应该是这样的:

但我似乎无法让我的单选按钮和我的 JLabel 正确对齐。如何在右侧对齐我的单选按钮并堆叠?另外,如何让我的 JLabel 和 JTextField 显示堆叠? 这是我的代码:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class SeriesCalc extends JFrame {

private final int WIDTH = 300;
private final int HEIGHT = 300;
private JFrame frame = new JFrame("Recursion");
private JPanel panel = new JPanel();
private JPanel labels = new JPanel();
private JPanel buttons = new JPanel();
private JPanel radioButtonsPanel = new JPanel();
private JLabel inputLabel = new JLabel("Enter i:");
private JLabel resultLabel = new JLabel("Result:");
private JTextField inputField = new JTextField(15);
private JTextField resultField = new JTextField(15);
private JButton compute = new JButton("Compute");
private JRadioButton iterative, recursive;

public SeriesCalc() {
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    radioButtonsPanel.add(iterative = new JRadioButton("Iterative"));
    radioButtonsPanel.add(recursive = new JRadioButton("Recursive"));
    add(radioButtonsPanel);
    ButtonGroup radioButtons = new ButtonGroup();
    radioButtons.add(iterative);
    radioButtons.add(recursive);

    iterative.addActionListener(new Calculations());
    recursive.addActionListener(new Calculations());
    compute.addActionListener(new Calculations());

    resultField.setEditable(false);

    panel.setLayout(new GridLayout(4, 1));
    labels.add(inputLabel);
    labels.add(inputField);
    labels.add(resultLabel);
    labels.add(resultField);
    buttons.add(compute);
    panel.add(radioButtonsPanel);
    panel.add(labels);
    panel.add(buttons);
    frame.getContentPane().add(panel);
}

public void display() {
    frame.setSize(WIDTH, HEIGHT);
    frame.setVisible(true);
}

public class Calculations implements ActionListener {

    public void actionPerformed(ActionEvent e) {
        Object calc = e.getSource();
        try {
            if (calc == compute) {
                if (iterative.isSelected()) {
                    double n = Double.parseDouble(inputField.getText());
                    double product = 1;
                    for (int i = 3; i < n; i++) {
                        product *= i;
                    }
                    resultField.setText(Double.toString(product));
                } else if (recursive.isSelected()) {
                    double i = Double.parseDouble(inputField.getText());
                    double y = 0;
                    if (i == 1) {
                resultField.setText(Double.toString(i / (2. * i +     1)));
                    } else {
             resultField.setText(Double.toString(i / (2. * i + 1)+ (i -1)));
                    }
                }
            }
        } catch (NumberFormatException nfe) {
            System.err.println(nfe.getMessage());
        }
    }
}

public static void main(String[] args) {
    SeriesCalc calculator = new SeriesCalc();
    calculator.display();
}
}

我不知道您使用的是 IDE,如 Eclipse 还是 NetBeans。例如,在 Eclipse 中,您可以使用 windowbuilder 打开此 class,您可以想象您的框架将如何显示。显然,您可以在此视图中移动元素(window 构建器)并将所有对象放在您想要的位置和您想要的大小。在下图中,如果您在 Eclipse 的模式设计中使用 window 构建器打开它,您可以看到编辑框架的视图。在这种模式(设计)中,您可以对这些对象进行绝对布局,并且可以使用该布局将它们放置在您想要的位置。我建议您使用 IDE 之类的 eclipse 进行 Java 开发,它非常有用并且有很多便利。我希望我能帮助你: 在此处输入图像描述

我发现你的程序有一些错误:

  1. 您正在扩展 JFrame 并在同一个程序中创建它的一个实例。使用其中之一(我推荐后者),见Using extends vs calling it inside of class.

  2. 您正在设置 frame.setSize() 虽然这不是错误,但最好在您的程序中调用 frame.pack()。它将遵守所有组件都显示在其 preferredSize 中的最小尺寸。如果您的 window 需要确切的尺寸,请改写 getPreferredSize() 方法。

  3. 您没有将您的程序放在 Event Dispatch Thread (EDT) 上,这可能会在将来导致线程问题,因为 Swing 不是线程安全的,这可以通过以下方式解决:

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                //Call your constructor here
            }
        });
    }
    

but I can't seem to get my radio buttons and my JLabel to be aligned properly

这是因为 JPanel 的默认布局管理器是 FlowLayout,因此它将把您的组件放在一行中。

我想要获得所需的 GUI 的想法是使用具有 0 行(它将根据需要添加任意数量)和 2 列的单个 GridLayout,并且您需要 "blank" space 你可以添加空 JLabels.

我没有在我的代码上放置 ActionListener,因为这个问题是关于 GUI 设计而不是其中的逻辑。

我想我没有遗漏任何东西,这是以下代码创建的输出:

import java.awt.GridLayout;

import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class SeriesCalc {

    private JFrame frame;

    private JRadioButton iterative;
    private JRadioButton recursive;
    private ButtonGroup group;

    private JLabel label;
    private JLabel resultLabel;

    private JTextField field;
    private JTextField resultField;

    private JButton computeButton;

    private JPanel pane;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new SeriesCalc().createAndShowGui();
            }
        });
    }

    public void createAndShowGui() {
        frame = new JFrame(getClass().getSimpleName());

        pane = new JPanel();
        pane.setLayout(new GridLayout(0, 2, 2, 5));

        iterative = new JRadioButton("Iterative");
        recursive = new JRadioButton("Recursive");

        group = new ButtonGroup();

        group.add(iterative);
        group.add(recursive);

        computeButton = new JButton("Compute");

        label = new JLabel("Enter \"i\": ");
        resultLabel = new JLabel("Result: ");

        field = new JTextField(5);
        resultField = new JTextField(5);
        resultField.setEnabled(false);

        pane.add(new JLabel(""));
        pane.add(iterative);

        pane.add(new JLabel(""));
        pane.add(recursive);

        pane.add(label);
        pane.add(field);

        pane.add(new JLabel(""));
        pane.add(computeButton);

        pane.add(resultLabel);
        pane.add(resultField);

        frame.add(pane);
        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}