首页 > 解决方案 > 如何将一个 JButton 与一组 JRadioButtons 连接起来?

问题描述

我正在创建一个基本的 GUI 框架。该框架有 10 个单选按钮和一个提交按钮。用户选择一个选项(JRadioButtons)并单击提交(JButton)按钮。单击提交按钮时,用户选择的选项出现在不同的框架上。

我希望提交按钮能够识别用户选择的 JRadioButton。我在这里放了我的一些代码以供参考。

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class Frame2 extends JFrame{

private JFrame frame2;
private JLabel label2;
private JButton button2;
private JRadioButton r1;
private JRadioButton r2;
private JRadioButton r3;
private JRadioButton r4;
private JRadioButton r5;
private JRadioButton r6;
private JRadioButton r7;
private JRadioButton r8;
private JRadioButton r9;
private JRadioButton r10;
public ButtonGroup group;


Frame2(){
    setLayout(new BorderLayout());
    setSize(new Dimension(1304,690));
    getContentPane().setBackground(Color.DARK_GRAY);
    label2= new JLabel(" Choose a topic: ");
    label2.setFont(new Font("Seriff",Font.BOLD, 14));
    label2.setForeground(Color.WHITE);
    button2=new JButton("Submit");
    add(label2, BorderLayout.NORTH);        
    JPanel centerPanel = new JPanel(new GridLayout(2, 5));
    centerPanel.add(r1=new JRadioButton("Introduction"));
    centerPanel.add(r2=new JRadioButton("Class and Objects"));
    centerPanel.add(r3=new JRadioButton("Object Oriented Programming Concepts"));
    centerPanel.add(r4=new JRadioButton("JAVA literals, constants, variables"));
    centerPanel.add(r5=new JRadioButton("Loops"));
    centerPanel.add(r6=new JRadioButton("Functions/Methods"));
    centerPanel.add(r7=new JRadioButton("Strings"));
    centerPanel.add(r8=new JRadioButton("Arrays"));
    centerPanel.add(r9=new JRadioButton("Time Complexity"));
    centerPanel.add(r10=new JRadioButton("Data Structures"));
    add(centerPanel, BorderLayout.CENTER);
    group= new ButtonGroup();
    group.add(r1); 
    group.add(r2); 
    group.add(r3);
    group.add(r4);
    group.add(r5);
    group.add(r6);
    group.add(r7);
    group.add(r8);
    group.add(r9);
    group.add(r10);
    add(button2, BorderLayout.SOUTH);
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
    
    
    button2.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if(e.getSource()==button2) {
                Layouts l=new Layouts();
                l.main(null);
                dispose();
                
            }
            
        }
    });
}



public static void main(String[] args) {
    Frame2 fr2=new Frame2();
    
}   
}`

提前致谢。

标签: javaswingjbuttonjradiobutton

解决方案


如果你把它JRadioButtons放在一个数组中会容易得多。

以下是我对您的代码所做的更改,以使其更易于修改和理解。

  1. 我添加了对该SwingUtilities invokeLater方法的调用,以确保 Swing 组件的创建和执行发生在Event Dispatch Thread上。

  2. 我在方法中创建了个人JPanels。通过分离JPanel代码,我可以更轻松地一次专注于 GUI 的一部分。

  3. JFrame必须以正确的顺序调用构造 a 的方法。JFrame在使可见之前,您必须创建所有 Swing 组件。

这是将 aJButton与一组JRadioButtons.

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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.SwingUtilities;

public class RadioButtonTest {

    private JButton button2;

    private JRadioButton[] rb;

    private ButtonGroup group;

    public RadioButtonTest() {
        JFrame frame = new JFrame("Java Tutorials");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBackground(Color.DARK_GRAY);

        frame.add(createMainPanel());
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private JPanel createMainPanel() {
        JPanel panel = new JPanel(new BorderLayout());

        JLabel label2 = new JLabel(" Choose a topic: ");
        label2.setFont(new Font("Seriff", Font.BOLD, 14));
        label2.setForeground(Color.WHITE);
        panel.add(label2, BorderLayout.NORTH);

        panel.add(createButtonPanel(), BorderLayout.CENTER);

        button2 = new JButton("Submit");
        button2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (e.getSource() == button2) {
                    for (int i = 0; i < rb.length; i++) {
                        if (rb[i].isSelected()) {
                            String text = rb[i].getText();
                            System.out.println(text);
                            // Do your second JFrame
                        }
                    }
                }
            }
        });
        panel.add(button2, BorderLayout.SOUTH);

        return panel;
    }

    private JPanel createButtonPanel() {
        JPanel centerPanel = new JPanel(new GridLayout(0, 2));

        String[] titles = { "Introduction", "Class and Objects",
                "Object Oriented Programming Concepts",
                "JAVA literals, constants, variables", "Loops",
                "Functions/Methods", "Strings", "Arrays",
                "Time Complexity", "Data Structures" };
        rb = new JRadioButton[titles.length];
        group = new ButtonGroup();

        for (int i = 0; i < titles.length; i++) {
            rb[i] = new JRadioButton(titles[i]);
            group.add(rb[i]);
            centerPanel.add(rb[i]);
        }

        return centerPanel;
    }

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

}

推荐阅读