背景資訊:在我的程式中,我有一個文本檔案,它被讀入,并包含不同書籍型別的串列及其受尊重的資訊。我已成功地將這些文本值的陣列傳遞給我的字典類。在字典類中,我用正確的資料加載它,或者換句話說,所有由整數 2 標識為字典的書籍。然后我將它傳遞回我創建并使用 ActionListener 和 actionPerformed 方法的 GUI 類。我創建了一個單選按鈕串列(在此示例中僅關注字典一個),當我選擇字典并點擊“單擊以查看庫內容”時,它應該為我提供一個不錯的 JTable 中的所有字典結果(JTable 作業正常已經)。
我的問題:單選按鈕未鏈接到“單擊以查看庫內容”按鈕,因此我可以單擊任何單選按鈕,它會給出相同的字典結果。我什至不能選擇任何東西,只能點擊“點擊查看圖書館內容”按鈕,它會給我字典。
問題:如何制作字典單選按鈕,并且只有字典按鈕,列印字典結果?
GUI 類(查看建構式中類的第一個方法):
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
字典類:
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;
}
}
圖形用戶界面設計:

uj5u.com熱心網友回復:
您的代碼需要處理 ActionListener 中的 JRadioButton 資訊,而獲得選定單選按鈕的一種方法是使用 ButtonGroup 的.getSelection()方法。這將回傳已為該組選擇的單選按鈕的 ButtonModel,如果未選擇任何內容,則回傳 null。
ActionListener 里面會有這樣的代碼:
private void getAuthor() {
ButtonModel model = authorBtnGroup.getSelection();
if (model != null) {
String actionCommand = model.getActionCommand();
System.out.println("Selection: " actionCommand);
}
}
您在其中查詢兩個ButtonGroups 以獲取當前選擇(這里我只是做一個來展示一個示例)并從獲得的模型中提取所需的資訊(如果不是 null)。
我的最小可重復示例來說明此案例:
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);
});
}
}
其他建議:
- 給你的變數命名有意義,使代碼自我注釋,例如,哪個是 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代碼可能會幫助我們更好地理解這一點。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/428116.html
