#java #swing #oop #jradiobutton
#java #качать #ооп #jradiobutton
Вопрос:
У меня есть JRadioButton
, и я должен установить для выбранного элемента значение 12, затем после этого он отключит / выделит серым цветом другие параметры, если он уже достигает 12.
Все, что я знаю, это то, что если вы добавите JRadioButton
в ButtonGroup
, это установит выбранный элемент в 1, но не в несколько, к чему я стремлюсь.
Возможно ли это? Есть ли какие-либо методы / способы, как это сделать? Спасибо за любые ваши предложения 🙂
Комментарии:
1. добавить в несколько групп кнопок
2. лучше используйте флажки.
3. Не могли бы вы объяснить немного больше, что вы имеете в виду выбранный элемент в 12?
4. @Blip привет 🙂 можете ли вы связать меня с любым сайтом, который научит меня, как это сделать в jcheckbox? большое вам спасибо 🙂
5. @KyalBond ну, например, у меня есть 15 кнопок jradiobutton. я только хочу, чтобы пользователь выбрал только 12 из этих 15, тогда оставшиеся 3 будут выделены серым цветом / отключены
Ответ №1:
Создайте arraylist из JRadioButtons. Каждый раз, когда пользователь нажимает на JRadioButton (включен), просматривайте список и подсчитывайте, сколько JRadioButtons было включено. Если количество больше или равно 12, отключите все остальные радиокнопки, пока пользователь не отменит выбор одной.
Это всего лишь один из многих способов сделать это,
Надеюсь, это поможет.
//initiate jradiobutton arraylist (this will be a field at top of class)
buttons = new ArrayList<JRadioButtons>();
//Create buttons with a listener attached
JRadioButton b1 = new JRadioButton("RadioButton One");
b1.setActionListener(myActionListener);
b1.setActionCommand("select");
buttons.add(b1);
//Add rest of buttons in the same way
JRadioButton b2...
//Add the radio buttons to your panel and such
Теперь, когда пользователь нажимает на одну из ваших кнопок, срабатывает ваш actionlistener, здесь вы можете выполнить проверку на включенную сумму
public void actionPerformed(ActionEvent e){
//Check if action was a jradiobutton
if(e.getActionCommand().equals("select")){
int count = 0;
//Here check the amount of buttons selected
for(JRadioButton button: buttons){
if(button.isSelected()) count ;
}
//Now check if count is over 12
if(count > 12){
for(JRadioButton button: buttons){
//if the button trying to activate when 12 already have been, disable it
if(button.equals(e.getSource()) button.setSelcted(false);
}
}
}
}
Это должно отключить кнопки, когда они уже выбраны, а также разрешить пользователю выбирать только 12 кнопок в arraylist.
Комментарии:
1. в качестве ответа на ваш вопрос в комментариях, вы могли бы сделать то же самое, что вы написали в ответе с
JCheckBox
2. о, мне действительно жаль, если я прошу слишком многого, но не могли бы вы дать мне немного кода? я новичок в использовании swing, и все, что я знаю, — это самые простые. большое вам спасибо 🙂
3. Нет проблем, есть много других вещей, которые также следует учитывать, но это было настолько просто, насколько я мог это понять.
4. @KyalBond: недостатком вашего решения является то, что пользователь не видит, что кнопки отключены, если она не нажимает на них.
Ответ №2:
JRadioButton
это неправильный тип, поскольку пользователь ожидает выбрать только один. Вам лучше использовать JCheckBox
с пользовательским ActionListener
, подобным этому SSCCE:
public class CheckBoxActivationTest {
public static void main(String[] args) {
final int MAX_ACTIVE_CHECK_BOXES = 12;
List<JCheckBox> allCheckBoxes = new ArrayList<>();
ActionListener actionListener = new ActionListener() {
private int activeCheckBoxesCounter = 0;
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("action!");
JCheckBox currentCheckBox = (JCheckBox) e.getSource();
activeCheckBoxesCounter = currentCheckBox.isSelected() ? 1 : -1;
for (JCheckBox jCheckBox : allCheckBoxes) {
jCheckBox.setEnabled(jCheckBox.isSelected()
|| MAX_ACTIVE_CHECK_BOXES > activeCheckBoxesCounter);
}
}
};
JPanel jPanel = new JPanel(new GridLayout(6, 0));
for (int i = 0; i < 30; i ) {
JCheckBox checkBox = new JCheckBox("Option " (1 i));
allCheckBoxes.add(checkBox);
checkBox.addActionListener(actionListener);
jPanel.add(checkBox);
}
JOptionPane.showMessageDialog(null, jPanel);
}
}