Как эффективно ссылаться на указанную кнопку на основе определенной характеристики

Этот вопрос похож на этот: Как вы ссылаетесь на кнопку внутри слушателя действий?

Я хочу создать простую форму, содержащую 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();
            }
        }

Возможно, стоит задать вопрос еще раз и объяснить некоторые подробности. Вы можете больше не получить ответов на этот вопрос, потому что мы уже ответили.

sorifiend 24.06.2018 07:17

Я изо всех сил пытался объяснить свой вопрос, хотя, похоже, вместо этого я сбиваю людей с толку, ха-ха. Я уже нашел свой способ кодирования, что мне делать с вопросом?

Kevin Guswanto 24.06.2018 09:35

Опубликуйте свое решение как ответ и отметьте его как принятое.

sorifiend 24.06.2018 09:40
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
53
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Для простоты я рекомендую вам записывать все статусы кнопок одновременно и записывать их напрямую как логическое значение:

//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);
}

Очевидно, вы должны добавить некоторую проверку ошибок и убедиться, что все кнопки не выбраны, прежде чем устанавливать, выбраны они или нет. Но я уверен, что вы справитесь с этой частью.

это возможно, но разве это не будет считаться жестким кодом?

Kevin Guswanto 23.06.2018 13:23

@KevinGuswanto Я не понимаю, что вы имеете в виду, конечно, это жестко запрограммировано. Если вы хотите читать и записывать в любое место в файле, вам просто нужно добавить простое распознавание строк. Например: if (line.startsWith("button x")), тогда вы можете проверить, включен или выключен, как обычно.

sorifiend 23.06.2018 13:31

я имею в виду, что что-то подобное можно решить с помощью for и if, поэтому, хотя приведенный выше код возможен, он слишком неэффективен

Kevin Guswanto 23.06.2018 13:44

@KevinGuswanto Этот метод может помочь ответить на ваш вопрос "но я не уверен, как проверить, если, например, пользователь выбирает кнопку 2, тогда код будет записан во вторую строку" stackoverflow.com/questions/25714779/…

sorifiend 23.06.2018 13:48

извините, похоже, я не спросил должным образом из-за моего ограниченного языка. Я сейчас отредактирую

Kevin Guswanto 23.06.2018 13:54

В качестве альтернативы вы можете попробовать что-то вроде ниже:

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;

      }
    }
}

Я понял, что это будет что-то вроде добавления кнопки в массив, а затем поместить ее в цикл. Я вставлю это в свой вопрос, пожалуйста, проверьте это

Kevin Guswanto 23.06.2018 14:22
Ответ принят как подходящий

Мне удалось найти простой способ решить проблему Добавив кнопку в массив.

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){

   }
}

Другие вопросы по теме