Наследование ActionEvent для Combobox'ов

 
 
 
Сообщения:27
С ООП только знакомлюсь, принципы понятны, но на практике все сложнее оказалось.
Имеется вот такой код:
public void comboChange1(ActionEvent actionEvent) {

        switch (mainCombobox1.getSelectionModel().getSelectedIndex()){
            case 0:
                secondCombobox1.getItems().removeAll(secondCombobox1.getItems());
                secondCombobox1.getItems().addAll("1");
                break;
            case 1:
                secondCombobox1.getItems().removeAll(secondCombobox1.getItems());
                secondCombobox1.getItems().addAll("2");
                break;
            case 2:
                secondCombobox1.getItems().removeAll(secondCombobox1.getItems());
                secondCombobox1.getItems().addAll("3");
                break;
            case 3:
                secondCombobox1.getItems().removeAll(secondCombobox1.getItems());
                secondCombobox1.getItems().addAll("4");
                break;
            case 4:
                secondCombobox1.getItems().removeAll(secondCombobox1.getItems());
                secondCombobox1.getItems().addAll("5");
                break;
        }
    }


Как его можно прописать для 5 шт. (mainComboBox1, mainComboBox2, mainComboBox3 и т.д.)?? Так сказать, универсальный код и после его наследовать сколько угодно раз, а не дублировать и прописывать вручную все.
И как прописать OnAction в FXML для каждого ComboBox, т.к. при прописывании одного и того же comboChange они становятся зависимыми друг от друга.
Изменен:06 сен 2020 11:32
 
 
Сообщения:1046
погугли Strategy Pattern.
 
 
Сообщения:27
windruf:
погугли Strategy Pattern.

Мне не совсем понятно как прописать "обезличенный" ComboBox (т.е. без конкретного ID) и потом это использовать, т.к. в описаниях и примерах в основном идут какие-нибудь (int a, int b) и т.д.
 
 
Сообщения:1046
        JComboBox<ActionInterface> comboBox;
        
        comboBox.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                (ActionInterface)(comboBox.getSelectedItem()).action();
            }
        });

 
 
Сообщения:1046
может не совсем ясно.
делаешь интерфейс, прикидываешь какие действия будут выполняться с этими объектами, на каждый пункт списка делаешь класс со своими действиями. не забудь toString.
если действие должно выполняться при смене - смотри предыдущий пост.
если в зависимости от выбранного пункта - строка 8.
 
 
Сообщения:27
windruf:
может не совсем ясно.
делаешь интерфейс, прикидываешь какие действия будут выполняться с этими объектами, на каждый пункт списка делаешь класс со своими действиями. не забудь toString.
если действие должно выполняться при смене - смотри предыдущий пост.
если в зависимости от выбранного пункта - строка 8.


Я так понимаю, прописать все пункты (5шт.) конкретно и действия к ним, а потом просто public void comboChange1 implements comboBox?
 
 
Сообщения:1046
да, только классы и интерфейсы пишут с заглавной и придумывай говорящие названия для классов и интерфейсов, чтоб потом не путаться.
 
 
Сообщения:27
windruf:
да, только классы и интерфейсы пишут с заглавной и придумывай говорящие названия для классов и интерфейсов, чтоб потом не путаться.

Это PetProject что бы лучше разобраться во всем, а по сути переписываю свою прогу с Delphi на Java ))
Спасибо за помощь.
 
 
Сообщения:27
windruf:
да


Что-то пошло не так, не могу сообразить как конкретно прописать этот самый интерфейс под этот код.
И по сути как потом реализовать все это дело?
Да, знаний не хватает...

public void comboChange1(ActionEvent actionEvent) throws IOException {
 
        switch (manufCombobox1.getSelectionModel().getSelectedIndex()){
            case 0:
                Combobox1.getItems().removeAll(Combobox1.getItems());
                BufferedReader br1 = new BufferedReader(new FileReader("000.txt"));
                try {
                    StringBuilder sb1 = new StringBuilder();
                    String line = br1.readLine();
                    while (line != null) {
                        Combobox1.getItems().add(line);
                        sb1.append(line);
                        line = br1.readLine();
                    }
                } finally {
                    br1.close();
                }
                Combobox1.getSelectionModel().select(0);
                break;
            case 1:
                Combobox1.getItems().removeAll(Combobox1.getItems());
                BufferedReader br2 = new BufferedReader(new FileReader("001.txt"));
                try {
                    StringBuilder sb2 = new StringBuilder();
                    String line = br2.readLine();
 
                    while (line != null) {
                        Combobox1.getItems().add(line);
                        sb2.append(line);
                        line = br2.readLine();
                    }
                } finally {
                    br2.close();
                }
                Combobox1.getSelectionModel().select(0);
                break;
            case 2:
                Combobox1.getItems().removeAll(Combobox1.getItems());
                BufferedReader br3 = new BufferedReader(new FileReader("002.txt"));
                try {
                    StringBuilder sb3 = new StringBuilder();
                    String line = br3.readLine();
                    while (line != null) {
                        Combobox1.getItems().add(line);
                        sb3.append(line);
                        line = br3.readLine();
                    }
                } finally {
                    br3.close();
                }
                Combobox1.getSelectionModel().select(0);
                break;
            case 3:
                Combobox1.getItems().removeAll(Combobox1.getItems());
                BufferedReader br4 = new BufferedReader(new FileReader("003.txt"));
                try {
                    StringBuilder sb4 = new StringBuilder();
                    String line = br4.readLine();
                    while (line != null) {
                        Combobox1.getItems().add(line);
                        sb4.append(line);
                        line = br4.readLine();
                    }
                } finally {
                    br4.close();
                }
                Combobox1.getSelectionModel().select(0);
                break;
            case 4:
                Combobox1.getItems().removeAll(Combobox1.getItems());
                BufferedReader br5 = new BufferedReader(new FileReader("004.txt"));
                try {
                    StringBuilder sb5 = new StringBuilder();
                    String line = br5.readLine();
                    while (line != null) {
                        Combobox1.getItems().add(line);
                        sb5.append(line);
                        line = br5.readLine();
                    }
                } finally {
                    br5.close();
                }
                Combobox1.getSelectionModel().select(0);
                break;
        }
    }
 
 
Сообщения:1046
итак, первый комбобокс управляет списком пунктов во втором комбобоксе и список этот хранится в своём файле для каждого пункта первого комбобокса.
во первых не вижу смысла грузить список при каждом переключении - проще загрузить всё при старте и потом вставлять нужный список. так быстрее и меньше грузит плату, а десяток - другой килобайтов в наше время не тема.
дальше тебе нужен класс для хранения списка. и чтоб не создавать лишних сущностей прикрути к нему toString и храни объекты в первом комбобоксе.
и, пожалуй, имеет смысл сделать файл, в котором будет храниться соответствие между именами пунктов первого комбобокса и файлами, в которых хранятся списки пунктов для второго комбобокса.
 
 
Сообщения:27
windruf:
дальше тебе нужен класс для хранения списка. и чтоб не создавать лишних сущностей прикрути к нему toString и храни объекты в первом комбобоксе.
и, пожалуй, имеет смысл сделать файл, в котором будет храниться соответствие между именами пунктов первого комбобокса и файлами, в которых хранятся списки пунктов для второго комбобокса.


А если прописать класс с двумя параметрами: Наименованием комбобокса и именем файла?
Только вот как правильно передать Комбобокс как параметр не пойму до конца.

public class LoadFile {
    public void comboLoadFile(ComboBox, String filename) throws IOException {
        ComboBox Combobox = new ComboBox();
        Combobox.getItems().removeAll(Combobox.getItems());
        BufferedReader br1 = new BufferedReader(new FileReader(filename));
        try {
            StringBuilder sb1 = new StringBuilder();
            String line = br1.readLine();
            while (line != null) {
                Combobox.getItems().add(line);
                sb1.append(line);
                line = br1.readLine();
            }
        } finally {
            br1.close();
        }
        Combobox.getSelectionModel().select(0);
    }
}


А после в Контроллере:
(опять же ошибка из-за не правильной передачи параметра)
@Override
    public void comboChange1(ActionEvent actionEvent){
        switch (manufCombobox1.getSelectionModel().getSelectedIndex()){
            case 0:
                LoadFile(ComboBox1, "001.txt");
                break;
            case 1:
                LoadFile(ComboBox2, "002.txt");
                break;
            case 2:
                LoadFile(ComboBox3, "003.txt");
                break;
            case 3:
                LoadFile(ComboBox4, "004.txt");
                break;
            case 4:
                LoadFile(ComboBox5, "005.txt");
                break;
        }
    }
 
 
Сообщения:1046
во первых при объявлении параметра необходимо задать тип и название этого параметра.
во вторых не совсем ясно, что ты собираешься делать с комбобоксом. при загрузке нас интересует только список пунктов, вставлять этот список мы будем в другое время в другом месте.
в третьих гонять тяжёлый код в слушателе приводит, в лучшем случае, к тормозам, в худшем может заморозить весь ГУИ.
в четвёртых нафига тебе switch? в первом комбобоксе выбираешь объект, из него достаёшь список пунктов для второго комбобокса, вставляешь и всё.
 
 
Сообщения:27
windruf:
во вторых не совсем ясно, что ты собираешься делать с комбобоксом

хотел через параметр прописывать Combobox1, Combobox 2 и т.д. Я опять же не пойму как один метод можно использовать в разных Combobox с разными именами этих самых Combobox.


windruf:
в четвёртых нафига тебе switch? в первом комбобоксе выбираешь объект, из него достаёшь список пунктов для второго комбобокса, вставляешь и всё.

Как без Switch это сделать тогда?
 
 
Сообщения:1046
у тебя, вроде, два комбобокса было. первый управляет содержимым второго. откуда появились ещё несколько?

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

В первом сообщении написано 5шт., т.е. 5 пар таких комбобоксов. Код был приведен только для первой пары, в остальных все так же, только меняются ID элементов. Если бы для одной пары, я бы прописал жестко все и не парился.

В принципе как я до этого сделал - работает, подправил параметры. Если можно, киньте кусок кода про предварительную загрузку, как и писали. Мне на ум приходит только какой-нибудь список ArrayList или что-то на подобие этого.
Изменен:26 сен 2020 07:28
 
Модераторы:frymock
Сейчас эту тему просматривают:Нет