Этот вопрос похож на этот: Как вы ссылаетесь на кнопку внутри слушателя действий?
Я хочу создать простую форму, содержащую 8 переключателей. если я выберу кнопку переключения и нажму кнопку «Сохранить», он будет записан в текстовый файл, например «Кнопка x, Вкл.». В следующий раз, когда я открою форму, она проверит в блокноте, включена ли кнопка x. Если включено, переключатель уже будет выбран, и наоборот.
Я знаю, как писать и читать из блокнота, но я не уверен, как проверить, если, например, пользователь выбирает кнопку 2, тогда код будет записан во вторую строку «Button2, on»
Вот мой код, который нужно написать:
Path path = Paths.get(csvFile);
// check if button x is selected, if yes : <- how to refer to button x ?
BufferedWriter bw = new BufferedWriter(New FileWriter(csvFile, true);
writer.write ("button x,on" + "\r\n");
writer.close
и это мой код при открытии формы:
BufferedReader br = null;
String line = "";
String resFilesplitby = ",";
br = new BufferedReader(new FileReader(csvFile));
while((line = br.readLine()) != null){
String[] condition = line.split(csvFilesplitby);
String power = condition[1];
// check if button x is already selected
if (button x power.equals("on")){
button x.isSelected();
}
}
Я изо всех сил пытался объяснить свой вопрос, хотя, похоже, вместо этого я сбиваю людей с толку, ха-ха. Я уже нашел свой способ кодирования, что мне делать с вопросом?
Опубликуйте свое решение как ответ и отметьте его как принятое.




Для простоты я рекомендую вам записывать все статусы кнопок одновременно и записывать их напрямую как логическое значение:
//Write the state of all the buttons in a single line:
writer.write (
x1.isSelected() + "," +
x2.isSelected() + "," +
x3.isSelected() + "," +
x4.isSelected() + "," +
x5.isSelected() + "," +
x6.isSelected() + "," +
x7.isSelected() + "," +
x8.isSelected());
Затем прочтите его как одну строку и просто сравните каждый из 8 элементов, разделенных знаком ",":
String[] condition = line.split(csvFilesplitby);
if (condition[0].equalsIgnoreCase("true")){
x1.setSelected(true);
}else if (condition[1].equalsIgnoreCase("true")){
x2.setSelected(true);
}else if (condition[2].equalsIgnoreCase("true")){
x3.setSelected(true);
}else if (condition[3].equalsIgnoreCase("true")){
x4.setSelected(true);
}else if (condition[4].equalsIgnoreCase("true")){
x5.setSelected(true);
}else if (condition[5].equalsIgnoreCase("true")){
x6.setSelected(true);
}else if (condition[6].equalsIgnoreCase("true")){
x7.setSelected(true);
}else if (condition[7].equalsIgnoreCase("true")){
x8.setSelected(true);
}
Очевидно, вы должны добавить некоторую проверку ошибок и убедиться, что все кнопки не выбраны, прежде чем устанавливать, выбраны они или нет. Но я уверен, что вы справитесь с этой частью.
это возможно, но разве это не будет считаться жестким кодом?
@KevinGuswanto Я не понимаю, что вы имеете в виду, конечно, это жестко запрограммировано. Если вы хотите читать и записывать в любое место в файле, вам просто нужно добавить простое распознавание строк. Например: if (line.startsWith("button x")), тогда вы можете проверить, включен или выключен, как обычно.
я имею в виду, что что-то подобное можно решить с помощью for и if, поэтому, хотя приведенный выше код возможен, он слишком неэффективен
@KevinGuswanto Этот метод может помочь ответить на ваш вопрос "но я не уверен, как проверить, если, например, пользователь выбирает кнопку 2, тогда код будет записан во вторую строку" stackoverflow.com/questions/25714779/…
извините, похоже, я не спросил должным образом из-за моего ограниченного языка. Я сейчас отредактирую
В качестве альтернативы вы можете попробовать что-то вроде ниже:
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.StringReader;
import javax.swing.*;
public class Ques1 extends JFrame implements ActionListener {
private JPanel panel;
private JToggleButton[] buttons;
public Ques1() {
initComponents();
buttonswork();
}
private void initComponents() {
buttons = new JToggleButton[6];
panel = new JPanel();
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.LINE_AXIS));
panel.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));
for (int i = 0; i < buttons.length; i++) {
JToggleButton tb = buttons[i];
tb = new JToggleButton("tb" + (i + 1));
tb.addActionListener(this);
panel.add(tb);
}
getContentPane().add(panel);
pack();
}
private void buttonswork() {
try {
String line = "";
String buttonString = "tb1-0\n"
+ "tb2-0\n"
+ "tb3-0\n"
+ "tb4-1\n"
+ "tb5-1\n"
+ "tb6-0\n";
BufferedReader br = new BufferedReader(new StringReader(buttonString));
while ((line = br.readLine()) != null) {
Component[] components = panel.getComponents();
for (Component c : components) {
if (c instanceof JToggleButton) {
String ac = ((JToggleButton) c).getActionCommand();
((JToggleButton) c).addActionListener(this);
if (ac.equalsIgnoreCase(line.split("-")[0])) {
((JToggleButton) c).setSelected(Integer.parseInt(line.split("-")[1]) == 1);
}
}
}
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
public static void main(String[] args) {
EventQueue.invokeLater(() -> {
new Ques1().setVisible(true);
});
}
@Override
public void actionPerformed(ActionEvent e) {
switch (e.getActionCommand()) {
case "tb1":
//do your work here ...
break;
case "tb2":
//do your work here ...
break;
}
}
}
Я понял, что это будет что-то вроде добавления кнопки в массив, а затем поместить ее в цикл. Я вставлю это в свой вопрос, пожалуйста, проверьте это
Мне удалось найти простой способ решить проблему Добавив кнопку в массив.
JToggleButton[] buttons = new JToggleButton[8];
buttons[0] = seat1; //this is variable name of my button.
buttons[1] = seat2;
buttons[2] = seat3;
buttons[3] = seat4;
buttons[4] = seat5;
buttons[5] = seat6;
buttons[6] = seat7;
buttons[7] = seat8;
// do the work here
for (JToggleButton btn : buttons){
if (btn.isSelected){
}
}
Возможно, стоит задать вопрос еще раз и объяснить некоторые подробности. Вы можете больше не получить ответов на этот вопрос, потому что мы уже ответили.