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:
CodePudding user response:
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
orauthorBtnGroup
? - 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.