如何 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 变量的名字更好,
btnGroup1
或 authorBtnGroup
?
- 为简单起见,尝试将相似的信息分组到数组或集合中。例如,请注意我用来创建单选按钮的作者字符串数组。
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 可能会帮助我们更好地理解这一点。
背景信息: 在我的程序中,我有一个文本文件,它被读入,其中包含不同书籍类型的列表及其相关信息。我已成功将这些文本值的数组传递到我的字典 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 变量的名字更好,
btnGroup1
或authorBtnGroup
? - 为简单起见,尝试将相似的信息分组到数组或集合中。例如,请注意我用来创建单选按钮的作者字符串数组。
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 可能会帮助我们更好地理解这一点。