如何 link JRadiobutton 到 JButton 以获得准确的输出

How to link JRadiobutton to JButton for accurate Output

背景信息: 在我的程序中,我有一个文本文件,它被读入,其中包含不同书籍类型的列表及其相关信息。我已成功将这些文本值的数组传递到我的字典 class。在字典 class 中,我用正确的数据加载它,换句话说,所有被整数 2 标识为字典的书籍。然后我将它传回我的 GUI class并利用 ActionListener 和 actionPerformed 方法。我创建了一个单选按钮列表(在此示例中仅关注字典),当我 select 字典并点击“单击以查看库内容”时,它应该会在一个漂亮的 JTable 中为我提供所有字典结果(JTable 已经可以正常工作了)。

我的问题:单选按钮没有链接到“点击查看库内容”按钮,所以我可以点击任何单选按钮,它会给出相同的词典结果。我什至不能 select 任何东西,只需点击“点击查看图书馆内容”按钮,它就会给我字典。

问题:如何让词典单选按钮,而且只有词典按钮,打印出词典结果?

GUI Class(查看构造函数中class的第一个方法):

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.io.*;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.Box;
import static javax.swing.Box.createHorizontalBox;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class GUICommandFunctions extends JPanel {

    private final JButton ViewAllContentButton;
    private final JPanel radioButtonPanelOne;
    private final JPanel radioButtonPanelTwo;
    private final JRadioButton allBookTypes;
    private final JRadioButton dictionary;
    private final JRadioButton cookbook;
    private final JRadioButton novel;
    private final JRadioButton graphicNovel;
    private final JRadioButton allAuthors;
    private final JRadioButton DouglasAdams;
    private final JRadioButton BrianKVaughan;
    private final JRadioButton AlanMoore;
    private final JRadioButton NealStephenson;
    private final JRadioButton BrandonSanderson;
    private final JRadioButton MichaelShaara;
    private final JRadioButton NeilGaiman;
    private final JRadioButton english;
    private final JRadioButton french;
    private final JTextArea MiddleField;
    private final JPanel searchPanel;
    private JTextField searchFunction = new JTextField();
    private final JLabel searchInventory = new JLabel("Library Inventory");
    private ButtonGroup btnGroup1 = new ButtonGroup();
    private ButtonGroup btnGroup2 = new ButtonGroup();
    public String ArrayRecords[];
    public JFrame f;
    public JTable j;
    
    // Constructor
    GUICommandFunctions() {
        
         Frame initialization  ***// FROM HERE***
        f = new JFrame();
        // Frame Title
        f.setTitle("JTable Example");
 
        LoadArrayData();
     
        this.setLayout(new BorderLayout()); // Setting Layout 
  
        // Add a view content button
        ViewAllContentButton = new JButton("Click to View Library Content");
        ViewAllContentButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) { // When clicked display content of dictionary
                    Dictionary dictionary = new Dictionary();
                    dictionary.LoadArrayData();
                    String[][] data = new String[dictionary.arrayCount][5]; 
                    if (dictionary.arrayCount == 0 ) {
                        System.out.println("No Dictionary Record Found!");
                    } else {
                        for (int i = 0; i < dictionary.arrayCount; i++) {
                            
                            String[] tokens = dictionary.ArrayRecords[i].split(",") ;
                            System.out.println(tokens[1] + " " + tokens[4] + " " + tokens[2] + " " + tokens[3] + " " + tokens[5] + " ");
                            // Data to be displayed in the JTable
                            data[i][0] = tokens[1];
                            data[i][1] = tokens[4];
                            data[i][2] = tokens[2];
                            data[i][3] = tokens[3];
                            data[i][4] = tokens[5];
                        }    
                        // Column Names
                        String[] columnNames = { "Title", "Author/Language", "Publisher", "Page Cunt", "Version"};
 
                        // Initializing the JTable
                        j = new JTable(data, columnNames);
                        j.setBounds(30, 40, 200, 300);
 
                        // adding it to JScrollPane
                        JScrollPane sp = new JScrollPane(j);
                        f.add(sp);
                        // Frame Size
                        f.setSize(500, 200);               
                        f.setVisible(true);
                        // Frame Visible = true                    
                    }                 
                }
            }
        ); ***// TO HERE***
                

        this.add(ViewAllContentButton, BorderLayout.SOUTH); // Set button to the left
        ViewAllContentButton.setForeground(Color.BLACK);
        ViewAllContentButton.setFont(new Font("Times New Roman", Font.BOLD, 15));
        // Create a panels for the radio buttons
        radioButtonPanelOne = new JPanel(new GridLayout(5, 1));
        radioButtonPanelOne.setBackground(Color.LIGHT_GRAY);
        radioButtonPanelTwo = new JPanel(new GridLayout(5, 1));
        radioButtonPanelTwo.setBackground(Color.LIGHT_GRAY);
        
        // Create genre buttons
        allBookTypes = new JRadioButton("ALL CATEGORY TYPES");
        dictionary = new JRadioButton("Dictionaries");
        cookbook = new JRadioButton("Cookbooks");
        novel = new JRadioButton("Novels");
        graphicNovel = new JRadioButton("Graphic Novels");
        // Create author buttons
        allAuthors = new JRadioButton("ALL AUTHORS");
        DouglasAdams = new JRadioButton("Douglas Adams");
        BrianKVaughan = new JRadioButton ("Brian K Vaughan");
        AlanMoore = new JRadioButton("Alan Moore");
        NealStephenson = new JRadioButton("Neal Stephenson");
        BrandonSanderson = new JRadioButton("Brandon Sanderson");
        MichaelShaara = new JRadioButton("Michael Shaara");
        NeilGaiman = new JRadioButton("Neil Gaiman");
        // Add author buttons
        btnGroup1.add(allAuthors);
        btnGroup1.add(DouglasAdams);
        btnGroup1.add(BrianKVaughan);
        btnGroup1.add(AlanMoore);
        btnGroup1.add(BrandonSanderson);
        btnGroup1.add(MichaelShaara);
        btnGroup1.add(NeilGaiman);
        btnGroup1.add(NealStephenson);
        
        // Create language buttons
        english = new JRadioButton("English Dictionaries");
        french = new JRadioButton("French Dictionaries");
        
        // Button group for radio buttons
        btnGroup2.add(allBookTypes);
        btnGroup2.add(french);
        btnGroup2.add(allBookTypes);
        radioButtonPanelOne.add(allBookTypes);
        allBookTypes.setFont(new Font("Times New Roman", Font.ITALIC, 15));
        allBookTypes.setSelected(true);
        // Adding genre radio buttons
        btnGroup2.add(dictionary);
        radioButtonPanelOne.add(dictionary);
        dictionary.setFont(new Font("Times New Roman", Font.ITALIC, 15));
        btnGroup2.add(cookbook);
        radioButtonPanelOne.add(cookbook);
        cookbook.setFont(new Font("Times New Roman", Font.ITALIC, 15));
        btnGroup2.add(novel);
        radioButtonPanelOne.add(novel);
        novel.setFont(new Font("Times New Roman", Font.ITALIC, 15));
        btnGroup2.add(graphicNovel);
        radioButtonPanelOne.add(graphicNovel);
        graphicNovel.setFont(new Font("Times New Roman", Font.ITALIC, 15));
        radioButtonPanelOne.setPreferredSize(new Dimension(600,50));
        
        //Button group for author buttons
        radioButtonPanelTwo.add(allAuthors);
        allAuthors.setFont(new Font("Times New Roman", Font.ITALIC, 15));
        allAuthors.setSelected(true);
        radioButtonPanelTwo.add(DouglasAdams);
        DouglasAdams.setFont(new Font("Times New Roman", Font.ITALIC, 15));
        radioButtonPanelTwo.add(BrianKVaughan);
        BrianKVaughan.setFont(new Font("Times New Roman", Font.ITALIC, 15));
        radioButtonPanelTwo.add(AlanMoore);
        AlanMoore.setFont(new Font("Times New Roman", Font.ITALIC, 15));
        radioButtonPanelTwo.add(NealStephenson);
        NealStephenson.setFont(new Font("Times New Roman", Font.ITALIC, 15));
        radioButtonPanelTwo.add(BrandonSanderson);
        BrandonSanderson.setFont(new Font("Times New Roman", Font.ITALIC, 15));
        radioButtonPanelTwo.add(MichaelShaara);
        MichaelShaara.setFont(new Font("Times New Roman", Font.ITALIC, 15));
        radioButtonPanelTwo.add(NeilGaiman);
        NeilGaiman.setFont(new Font("Times New Roman", Font.ITALIC, 15));
        this.add(radioButtonPanelTwo, BorderLayout.NORTH);
         
        // Button group for language buttons
        btnGroup2.add(english);
        radioButtonPanelOne.add(english);
        english.setFont(new Font("Times New Roman", Font.ITALIC, 15));
        btnGroup2.add(french);
        radioButtonPanelOne.add(french);
        french.setFont(new Font("Times New Roman", Font.ITALIC, 15));        
        this.add(radioButtonPanelOne, BorderLayout.CENTER);
        
        // Add text area with all radio buttons        
        MiddleField = new JTextArea();
        MiddleField.setPreferredSize(new Dimension(400,400));
        MiddleField.setEditable(false);
        MiddleField.setBackground(Color.LIGHT_GRAY);
        //this.add(MiddleField, BorderLayout.CENTER);
        
        //Create a panel for search bar feature
        searchPanel = new JPanel();
        searchPanel.setLayout(new GridLayout(100, 1, 5, 5));
        searchPanel.add(searchInventory);
        searchInventory.setFont(new Font("Times New Roman", Font.BOLD, 15));
        JScrollPane newScroll = new JScrollPane(searchPanel);
        newScroll.setPreferredSize(new Dimension(200, 1000));
        this.add(newScroll, BorderLayout.EAST);
        
        // Add focus lost/gained listeners for text field
        searchFunction = new JTextField("Search by book reference...");
        searchFunction.setForeground(Color.LIGHT_GRAY);
        searchPanel.add(searchFunction);
        TextFieldHandler handler = new TextFieldHandler();
        searchFunction.addActionListener(handler);
        searchFunction.addFocusListener(handler);
        
        
    } // End constructor GUICommandFunctions
   
    // Private class to handle events
    private class TextFieldHandler implements ActionListener, FocusListener {
        
        @Override
        public void actionPerformed (ActionEvent e) {
            String str = String.format("%s", e.getActionCommand());
            
            // Show message to users with text input
            JOptionPane.showMessageDialog(null, str);
        } // End actionPerformed
        
        // If you click inside text field and it gains focus, remove text
        @Override
        public void focusGained(FocusEvent e) {
            ((JTextField)e.getSource()).setText("");            
        } // End focusGained
        
        // But if you leave text field and it loses focus without text, reset field
        
        @Override
        public void focusLost(FocusEvent e) {
            if (((JTextField)e.getSource()).getText().equals(""))
            {
                ((JTextField)e.getSource()).setText("Search by book refernece...");
            }
            
        } // End focusLost
    
    } // End private class TextFieldHandler
    
    // Create JTable that opens on ViewAllContentButton

    public void  LoadArrayData () {

        String ArrayRecords[];
        int arrayCount;
        FileReader fr = null;
            
        try {
              fr = new FileReader("C:\Users\MarkC\Documents\NetBeansProjects\case_1\case_1\src\case_1\library.txt"); //Reads in text file
        } catch (FileNotFoundException ex) {
            Logger.getLogger(GUICommandFunctions.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        BufferedReader reader = new BufferedReader(fr);  
        ArrayList<String> str = new ArrayList<>();
        String line = "";
        arrayCount = 0;
        try {
            while((line=reader.readLine())!=null) {
                str.add(line);
                arrayCount = arrayCount + 1;                
            }
        } catch (IOException ex) {
            Logger.getLogger(GUICommandFunctions.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        ArrayRecords = new String[arrayCount];       
        for (int i = 0; i < arrayCount; i++) {
            ArrayRecords[i] = str.get(i);
            //System.out.println(ArrayRecords[i]);          
        }
        
        // Here we would actually set the type to what the user wants (note: Set it to a "0" if the user wants all Books)
        String selType = "0";  
        
        // Call method to select Books by category type
        String methodResult = SelectType(str, arrayCount, selType);
        
    }  

    private static String SelectType (ArrayList<String> str, int arrayCount, String selType) {
        for (int i = 1; i < arrayCount; i++) {
           
            String buffer = str.get(i);
            String bookCat = buffer.substring(0,1);
            
            // Print books by Category - "0" type means print all Books
            if (selType.equals(bookCat)) {
                System.out.println(buffer);
            }          
            else if (selType.equals("0")) {
                System.out.println(buffer);
            }
        }
        return "0";   
    }
    
} // End public class GUICommandFunctions

词典Class:

import java.io.*;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Dictionary extends NonFictionBook {
    
    public String ArrayRecords[];
    public int arrayCount;  
    
    public void  LoadArrayData () {
           
        FileReader fr = null;
            
        try {
              fr = new FileReader("C:\Users\MarkC\Documents\NetBeansProjects\case_1\case_1\src\case_1\library.txt"); //Reads in text file
        } catch (FileNotFoundException ex) {
            Logger.getLogger(GUICommandFunctions.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        BufferedReader reader = new BufferedReader(fr);  
        ArrayList<String> str = new ArrayList<>();
        String line = "";
        arrayCount = 0;
        try {
            while((line=reader.readLine())!=null) {
                str.add(line);
                arrayCount = arrayCount + 1;                
            }
        } catch (IOException ex) {
            Logger.getLogger(GUICommandFunctions.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        int dictCount = 0;
        ArrayRecords = new String[arrayCount];       
        for (int i = 0; i < arrayCount; i++) {
            if (str.get(i).substring(0,1).equals("1") && i > 0) {
                ArrayRecords[dictCount] = str.get(i);
                dictCount = dictCount + 1;
            }
                
        }
        arrayCount =  dictCount;  
    } 
}

界面设计:

您的代码需要处理 ActionListener 中的 JRadioButton 信息,要获取选定的单选按钮,一种方法是使用 ButtonGroup 的 .getSelection() 方法。 returns 已为该组选择的单选按钮的 ButtonModel,如果未选择任何内容,则为 null。

ActionListener 中会有这样的代码:

private void getAuthor() {
    ButtonModel model = authorBtnGroup.getSelection();
    if (model != null) {
        String actionCommand = model.getActionCommand();
        System.out.println("Selection: " + actionCommand);
    }
}

你在哪里查询当前选择的both ButtonGroups(这里我只做一个来展示一个例子)并从获得的模型中提取所需的信息(如果不为空)。

我的最小可重现示例来说明此情况:

import java.awt.BorderLayout;
import java.awt.GridLayout;
import javax.swing.*;

@SuppressWarnings("serial")
public class GettingRadioButtonResults extends JPanel {
    public static final String[] AUTHORS = { "all Authors", "Douglas Adams", 
            "Brian K Vaughan", "Alan Moore", "Brandon Sanderson", 
            "Michael Shaara", "Neil Gaiman", "Neal Stephenson" };
    private ButtonGroup authorBtnGroup = new ButtonGroup();

    public GettingRadioButtonResults() {
        JPanel radioPanel = new JPanel(new GridLayout(0, 2));
        for (String author : AUTHORS) {
            JRadioButton radioBtn = new JRadioButton(author);
            radioBtn.setActionCommand(author);
            radioPanel.add(radioBtn);
            authorBtnGroup.add(radioBtn);
        }

        JButton getAuthorBtn = new JButton("Get Author");
        getAuthorBtn.addActionListener(e -> getAuthor());
        JPanel buttonPanel = new JPanel();
        buttonPanel.add(getAuthorBtn);

        setLayout(new BorderLayout());
        add(radioPanel);
        add(buttonPanel, BorderLayout.PAGE_END);
    }

    private void getAuthor() {
        ButtonModel model = authorBtnGroup.getSelection();
        if (model != null) {
            String actionCommand = model.getActionCommand();
            System.out.println("Selection: " + actionCommand);
        }
    }

    public static void main(String[] args) {

        SwingUtilities.invokeLater(() -> {
            GettingRadioButtonResults mainPanel = new GettingRadioButtonResults();

            JFrame frame = new JFrame("GUI");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(mainPanel);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        });
    }

}

其他建议:

  • 给你的变量起个有意义的名字,比如代码 self-commenting,ButtonGroup 变量的名字更好,btnGroup1authorBtnGroup?
  • 为简单起见,尝试将相似的信息分组到数组或集合中。例如,请注意我用来创建单选按钮的作者字符串数组。
public static final String[] AUTHORS = { "all Authors", "Douglas Adams", 
            "Brian K Vaughan", "Alan Moore", "Brandon Sanderson", 
            "Michael Shaara", "Neil Gaiman", "Neal Stephenson" };

创建单选按钮:

JPanel radioPanel = new JPanel(new GridLayout(0, 1));
for (String author : AUTHORS) {
    JRadioButton radioBtn = new JRadioButton(author);
    radioBtn.setActionCommand(author);
    radioPanel.add(radioBtn);
    authorBtnGroup.add(radioBtn);
}

关于如何过滤或更改JTable中显示的内容,除了向您展示如何获取JRadioButton选择状态外,我对此无能为力,因为这个问题,代码,最重要的是,数据,仍不清楚。如果您仍然需要帮助,新问题中的有效 MRE 代码 post 可能会帮助我们更好地理解这一点。