Я отредактировал свой ответ, поскольку вы предоставили больше контекста для своего вопроса. Вставлено ниже : это мой подход к решению вашей проблемы, рабочий код с пояснениями и ошибки, которые мне пришлось устранить с помощью вашего связанного кода:
Подход : ассоциируйте логическое значение для каждого флажка, соответствующее тому, была ли эта опция 'выбрана конечным пользователем' .Когда кнопка синхронизации нажата, найдите, какие флажки были выбраны.Эти флажки будут возвращать истинное значение из их метода isSelected()
.Для каждого установленного флажка выбран добавить соответствующую команду в Список , содержащий все команды, которые будут выполняться на компьютере конечного пользователя.Повторяйте этот список до тех пор, пока не останется команд для запуска.
Код :
import javax.swing.*;
import java.util.ArrayList;
import java.awt.*;
import java.awt.event.*;
import java.util.List;
class RcSync extends JFrame implements ActionListener{
Container contentPane = getContentPane();
JPanel top = new JPanel();
JPanel center = new JPanel();
JPanel bottom = new JPanel();
JScrollPane mainScrollFrame = new JScrollPane(center);
JLabel displayMessage = new JLabel("Please select a item, and click sync:");
Font customFontHeader = new Font("", Font.BOLD,15);
JButton syncButton = new JButton("Sync");
JButton cancelButton = new JButton("Cancel");
// Encapsulate your checkboxes to commands, since there is one
// to one relationship and makes future changes easier since there is a single point of change
String[] database = {"Apple","Pineapple","Orange","Pear","Fig"};
CheckboxCommand chk1 = new CheckboxCommand("Checkbox 1 cmd", new JCheckBox(database[0]));
CheckboxCommand chk2 = new CheckboxCommand("Checkbox 2 cmd", new JCheckBox(database[1]));
CheckboxCommand chk3 = new CheckboxCommand("Checkbox 3 cmd", new JCheckBox(database[2]));
CheckboxCommand chk4 = new CheckboxCommand("Checkbox 4 cmd", new JCheckBox(database[3]));
CheckboxCommand chk5 = new CheckboxCommand("Checkbox 5 cmd", new JCheckBox(database[4]));
public RcSync() {
super ("Sync Application");
setSize (400,450);
setDefaultCloseOperation(EXIT_ON_CLOSE);
add(top);
setVisible(true);
top.add(displayMessage);
displayMessage.setFont(customFontHeader);
center.add(chk1.checkbox);
center.add(chk2.checkbox);
center.add(chk3.checkbox);
center.add(chk4.checkbox);
center.add(chk5.checkbox);
bottom.add(syncButton);
syncButton.addActionListener(this);
cancelButton.addActionListener(new CloseListener());
bottom.add(cancelButton);
// TODO email button doesn't exist, assuming copy/paste error?
// bottom.add(emailButton);
// emailButton.addActionListener(this);
contentPane.add("North", top);
contentPane.add("South", bottom);
this.getContentPane().add(mainScrollFrame, BorderLayout.CENTER);
center.setLayout(new BoxLayout(center, BoxLayout.Y_AXIS));
}
public void actionPerformed(ActionEvent event){
// Implements the approach I described initially
if (event.getSource() == syncButton){
List<String> cmdsToRun = new ArrayList<>();
if (chk1.isSelected()){
cmdsToRun.add(chk1.getCmdToRun());
}
if (chk2.isSelected()){
cmdsToRun.add(chk2.getCmdToRun());
}
if (chk3.isSelected()){
cmdsToRun.add(chk3.getCmdToRun());
}
if (chk4.isSelected()){
cmdsToRun.add(chk4.getCmdToRun());
}
if (chk5.isSelected()){
cmdsToRun.add(chk5.getCmdToRun());
}
// Note: for verification purposes I just print out your commands
// since they're hard coded to your particular environment
System.out.println(cmdsToRun);
// This is where you would loop through your command list i.e.
// for (int x=0; x<cmdsToRun; x++){ //run command at cmdToRun.get(x); }
}
}
private class CloseListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
}
// encapsulating your checkboxes to commands
private class CheckboxCommand {
private String cmdToRun;
private boolean isSelected;
private JCheckBox checkbox;
public CheckboxCommand(String cmdToRun, JCheckBox checkbox) {
this.cmdToRun = cmdToRun;
this.checkbox = checkbox;
}
public String getCmdToRun() {
return cmdToRun;
}
public void setCmdToRun(String cmdToRun) {
this.cmdToRun = cmdToRun;
}
public boolean isSelected() {
return this.checkbox.isSelected();
}
public void setSelected(boolean selected) {
isSelected = selected;
}
}
public static void main (String[]args){
// Fixed your typo error to run the swing interface
RcSync gui = new RcSync();
}
}
Проверка правильности кода:
Key Insight: I инкапсулировал ваши команды для флажков в закрытый класс, поскольку существует отношение один к одному , и это позволит вашему коду иметь единую точку изменения, что в целом является наилучшей практикой:)
Примечание: Iна самом деле не запускайте ваши команды на моем конце, поскольку они привязаны к вашей конкретной машине .То есть связаны с локальными сценариями, поэтому я распечатал команды dummy , чтобы доказать правильность работы кода.Я добавил блок комментария в коде, чтобы показать, куда вы можете добавить код, специфичный для вашей среды, например Runtime.getRuntime().exec("<CMD>");
Ошибки, которые нужно исправить:
Я удалил эту строку:JCheckBox chk6 = new JCheckBox(database[5]);
, поскольку это вызовет исключение indexOutOfBounds, поскольку в переменной базы данных в памяти только 5 элементов, а не 6.
emailButton не существует, поэтому я закомментировал это:
// bottom.add(emailButton);
// emailButton.addActionListener(this);
Это опечатка, которая не запускает графический интерфейс: RsSync gui = new RcSsync();
, поэтому я изменил ее соответствующим образом: RcSync gui = new RcSync();
Надеюсь, это поможет!:)