Ich habe eine Swing-Anwendung, die Optionsfelder in einem Formular enthält. Ich habe ButtonGroup
jedoch die verfügbaren Methoden betrachtet, ich kann nicht scheinen, den Namen der ausgewählten zu bekommen JRadioButton
. Folgendes kann ich bisher sagen:
Von ButtonGroup aus kann ich ein ausführen
getSelection()
, um das zurückzugebenButtonModel
. Von dort aus kann ich eine durchführengetActionCommand
, aber das scheint nicht immer zu funktionieren. Ich habe verschiedene Tests ausprobiert und unvorhersehbare Ergebnisse erzielt.Auch von
ButtonGroup
kann ich eine Aufzählung bekommengetElements()
. Dann müsste ich jedoch jede Schaltfläche durchlaufen, um zu überprüfen, ob es sich um die ausgewählte handelt.
Gibt es eine einfachere Möglichkeit herauszufinden, welche Schaltfläche ausgewählt wurde? Ich programmiere dies in Java 1.3.1 und Swing.
Antworten:
Ich würde einfach Ihre durchlaufen
JRadioButtons
und anrufenisSelected()
. Wenn Sie wirklich von der gehen wollen,ButtonGroup
können Sie nur zu den Modellen gelangen. Sie könnten die Modelle den Tasten zuordnen, aber wenn Sie Zugriff auf die Tasten haben, warum nicht direkt verwenden?quelle
Ich habe ein ähnliches Problem und damit gelöst:
import java.util.Enumeration; import javax.swing.AbstractButton; import javax.swing.ButtonGroup; public class GroupButtonUtils { public String getSelectedButtonText(ButtonGroup buttonGroup) { for (Enumeration<AbstractButton> buttons = buttonGroup.getElements(); buttons.hasMoreElements();) { AbstractButton button = buttons.nextElement(); if (button.isSelected()) { return button.getText(); } } return null; } }
Es gibt den Text der ausgewählten Schaltfläche zurück.
quelle
Sie müssen hinzufügen,
setActionCommand
umJRadioButton
dann einfach zu tun:Beispiel:
java = new JRadioButton("Java"); java.setActionCommand("Java"); c = new JRadioButton("C/C++"); c.setActionCommand("c"); System.out.println("Selected Radio Button: " + buttonGroup.getSelection().getActionCommand());
quelle
Ich schlage vor, in Swing direkt zum Modellansatz überzugehen. Nachdem Sie die Komponente in das Bedienfeld und den Layout-Manager eingefügt haben, müssen Sie nicht einmal einen bestimmten Verweis darauf behalten.
Wenn Sie das Widget wirklich wollen, können Sie es mit jedem testen
isSelected
oder pflegenMap<ButtonModel,JRadioButton>
.quelle
Sie können jedem Optionsfeld (Zeichenfolge) einen Aktionsbefehl hinzufügen.
this.jButton1.setActionCommand("dog"); this.jButton2.setActionCommand("cat"); this.jButton3.setActionCommand("bird");
Angenommen, sie befinden sich bereits in einer ButtonGroup (in diesem Fall state_group), können Sie das ausgewählte Optionsfeld folgendermaßen abrufen:
String selection = this.state_group.getSelection().getActionCommand();
Hoffe das hilft
quelle
Der folgende Code zeigt an, welcher JRadiobutton auf Knopfdruck aus Buttongroup ausgewählt wird .
Dies erfolgt durch Durchlaufen aller JRadioButtons in einer bestimmten buttonGroup.
JRadioButton firstRadioButton=new JRadioButton("Female",true); JRadioButton secondRadioButton=new JRadioButton("Male"); //Create a radio button group using ButtonGroup ButtonGroup btngroup=new ButtonGroup(); btngroup.add(firstRadioButton); btngroup.add(secondRadioButton); //Create a button with text ( What i select ) JButton button=new JButton("What i select"); //Add action listener to created button button.addActionListener(this); //Get selected JRadioButton from ButtonGroup public void actionPerformed(ActionEvent event) { if(event.getSource()==button) { Enumeration<AbstractButton> allRadioButton=btngroup.getElements(); while(allRadioButton.hasMoreElements()) { JRadioButton temp=(JRadioButton)allRadioButton.nextElement(); if(temp.isSelected()) { JOptionPane.showMessageDialog(null,"You select : "+temp.getText()); } } } }
quelle
Sie können getSelectedObjects () von ItemSelectable (Superinterface von ButtonModel) verwenden, das die Liste der ausgewählten Elemente zurückgibt. Bei einer Optionsfeldgruppe kann es sich nur um eine oder gar keine handeln.
quelle
Fügen Sie die Radiobuttons dann zu einer Schaltflächengruppe hinzu:
buttonGroup.getSelection (). getActionCommand
quelle
import javax.swing.Action; import javax.swing.ButtonGroup; import javax.swing.Icon; import javax.swing.JRadioButton; import javax.swing.JToggleButton; public class RadioButton extends JRadioButton { public class RadioButtonModel extends JToggleButton.ToggleButtonModel { public Object[] getSelectedObjects() { if ( isSelected() ) { return new Object[] { RadioButton.this }; } else { return new Object[0]; } } public RadioButton getButton() { return RadioButton.this; } } public RadioButton() { super(); setModel(new RadioButtonModel()); } public RadioButton(Action action) { super(action); setModel(new RadioButtonModel()); } public RadioButton(Icon icon) { super(icon); setModel(new RadioButtonModel()); } public RadioButton(String text) { super(text); setModel(new RadioButtonModel()); } public RadioButton(Icon icon, boolean selected) { super(icon, selected); setModel(new RadioButtonModel()); } public RadioButton(String text, boolean selected) { super(text, selected); setModel(new RadioButtonModel()); } public RadioButton(String text, Icon icon) { super(text, icon); setModel(new RadioButtonModel()); } public RadioButton(String text, Icon icon, boolean selected) { super(text, icon, selected); setModel(new RadioButtonModel()); } public static void main(String[] args) { RadioButton b1 = new RadioButton("A"); RadioButton b2 = new RadioButton("B"); ButtonGroup group = new ButtonGroup(); group.add(b1); group.add(b2); b2.setSelected(true); RadioButtonModel model = (RadioButtonModel)group.getSelection(); System.out.println(model.getButton().getText()); } }
quelle
Verwenden Sie die
isSelected()
Methode. Hier erfahren Sie den Status Ihres RadioButton. Wenn Sie es in Kombination mit einer Schleife (z. B. für Schleife) verwenden, können Sie herausfinden, welche ausgewählt wurde.quelle
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class MyJRadioButton extends JFrame implements ActionListener { JRadioButton rb1,rb2; //components ButtonGroup bg; MyJRadioButton() { setLayout(new FlowLayout()); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); rb1=new JRadioButton("male"); rb2=new JRadioButton("female"); //add radio button to button group bg=new ButtonGroup(); bg.add(rb1); bg.add(rb2); //add radio buttons to frame,not button group add(rb1); add(rb2); //add action listener to JRadioButton, not ButtonGroup rb1.addActionListener(this); rb2.addActionListener(this); pack(); setVisible(true); } public static void main(String[] args) { new MyJRadioButton(); //calling constructor } @Override public void actionPerformed(ActionEvent e) { System.out.println(((JRadioButton) e.getSource()).getActionCommand()); }
}}
quelle
In der Regel ist ein Objekt erforderlich, das dem ausgewählten Optionsfeld zugeordnet ist. Es ist nicht unbedingt eine
String
Darstellung der Beschriftung der Schaltfläche. Dies kann einInteger
Index der Schaltfläche oder ein Objekt eines komplizierteren Typs seinT
. Sie könnten ein füllen und verwenden,Map<ButtonModel, T>
wie von Tom Hawtin vorgeschlagen, aber ich schlage vor, das Modell zu erweitern und die Objekte dort zu platzieren. Hier ist eine VerbesserungButtonGroup
, die diesen Ansatz verwendet.import javax.swing.*; @SuppressWarnings("serial") public class SmartButtonGroup<T> extends ButtonGroup { @Override public void add(AbstractButton b) { throw new UnsupportedOperationException("No object supplied"); } public void add(JRadioButton button, T attachedObject) { ExtendedModel<T> model = new ExtendedModel<>(attachedObject); model.setSelected(button.isSelected()); button.setModel(model); super.add(button); } @SuppressWarnings("unchecked") public T getSelectedObject() { ButtonModel selModel = getSelection(); return selModel != null ? ((ExtendedModel<T>)selModel).obj : null; } public static class ExtendedModel<T> extends javax.swing.JToggleButton.ToggleButtonModel { public T obj; private ExtendedModel(T object) { obj = object; } } }
Sie können diese Dienstprogrammklasse anstelle von verwenden
ButtonGroup
. Erstellen Sie ein Objekt dieser Klasse und fügen Sie Schaltflächen sowie zugehörige Objekte hinzu. Zum Beispiel,SmartButtonGroup<Integer> group = new SmartButtonGroup<>(); JPanel panel = new JPanel(); for (int i = 1; i <= 5; i++) { JRadioButton button = new JRadioButton("Button #" + i, i == 3); // select the 3rd button group.add(button, i); panel.add(button); }
Danach können Sie das Objekt, das der aktuell ausgewählten Schaltfläche zugeordnet ist, jederzeit abrufen, indem Sie einfach Folgendes aufrufen
getSelectedObject()
:int selectedButtonIndex = group.getSelectedObject();
Wenn Sie nur die Schaltflächen selbst benötigen, können Sie stattdessen die nächste nicht generische Klasse verwenden.
import javax.swing.JRadioButton; @SuppressWarnings("serial") public class RadioButtonGroup extends SmartButtonGroup<JRadioButton> { public void add(JRadioButton button) { super.add(button, button); } @Override public void add(JRadioButton button, JRadioButton attachedObject) { throw new UnsupportedOperationException("Use the short form of addition instead"); } public JRadioButton getSelectedButton() { return getSelectedObject(); } }
quelle
jRadioOne = new javax.swing.JRadioButton(); jRadioTwo = new javax.swing.JRadioButton(); jRadioThree = new javax.swing.JRadioButton();
... dann für jeden Knopf:
buttonGroup1.add(jRadioOne); jRadioOne.setText("One"); jRadioOne.setActionCommand(ONE); jRadioOne.addActionListener(radioButtonActionListener);
...Hörer
ActionListener radioButtonActionListener = new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { radioButtonActionPerformed(evt); } };
... tun, was Sie als Reaktion auf ein Ereignis benötigen
protected void radioButtonActionPerformed(ActionEvent evt) { System.out.println(evt.getActionCommand()); }
quelle