Search code examples
javaswingjbuttonjradiobutton

How to link JRadiobutton to JButton for accurate Output


Background info: In my program I have a text file, that is read in, and contains a list of different book types with their respected info. I have successfully passed an array of these text values to my dictionary class. Inside the dictionary class, I load it with the correct data, or in other words, all the books identified as dictionaries by the integer 2. Then I pass it back to my GUI class where I have made and utilize an ActionListener and actionPerformed method. I created a list of radio buttons (in this example focusing on just the dictionary one) and when I select dictionary and hit the "Click to View Library Content" it should give me the all the dictionary results in a nice JTable(JTable works correctly already).

My problem: The radio buttons are not linked to the "Click to View Library Content" button, so I can click any of the radio buttons and it will give the same dictionary results. I can even not select anything and only hit the "Click to View Library Content" button and it will give me the dictionaries.

Question: How do I make the dictionary radio button, and only the dictionary button, print out the dictionary results?

GUI Class (Look at first method of class in constructor):

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

Dictionary 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;  
    } 
}

GUI Design:

How my current GUI looks like


Solution

  • Your code needs to handle the JRadioButton information inside the ActionListener, and one way to do this, to get the selected radio button is to use the ButtonGroup's .getSelection() method. This returns the ButtonModel of the radio button that has been selected for that group, or null if nothing has been selected.

    The ActionListener would have code like this within it:

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

    where you query both ButtonGroups for the current selection (here I just do one to show an example) and extract the information needed from the model obtained (if not null).

    My minimal reproducible example to illustrate the case:

    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);
            });
        }
    
    }
    

    Other bits of advice:

    • Give your variables names that make sense, that make the code self-commenting, for instance, which is a better name for a ButtonGroup variable, btnGroup1 or authorBtnGroup?
    • Try to group like information into arrays or collections for simplicity. As an example, note my String array of authors that I use to create radio buttons with.
    public static final String[] AUTHORS = { "all Authors", "Douglas Adams", 
                "Brian K Vaughan", "Alan Moore", "Brandon Sanderson", 
                "Michael Shaara", "Neil Gaiman", "Neal Stephenson" };
    

    Radio button creation:

    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);
    }
    

    With regards to how to filter or change what is displayed in the JTable, I can offer no assistance on this, other than to show you how to get the JRadioButton selection status, since this problem, code, and most importantly, data, remains unclear. A valid MRE code post in a new question would probably help us to better understand this if you still need assistance with this.