powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / onChange
20 сообщений из 20, страница 1 из 1
onChange
    #39462916
DNShark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть такой код

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
package sample;

import javafx.application.Application;
import javafx.beans.Observable;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class Main extends Application {

    private ObservableList<SimpleStringProperty> list =
            FXCollections.observableArrayList(property -> new Observable[]{property});

    private SimpleStringProperty simpleStringProperty = new SimpleStringProperty(this, "simpleStringProperty", "hello");

    @Override
    public void start(Stage primaryStage) throws Exception{
        BorderPane root = new BorderPane();
        ComboBox<String> comboBox = new ComboBox<>();
        root.setCenter(comboBox);
        comboBox.getItems().addAll("1", "2", "3");
        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root, 300, 275));
        list.add(simpleStringProperty);
        list.addListener((ListChangeListener<SimpleStringProperty>) change -> {
            System.out.println("change");
        });
        comboBox.getSelectionModel().selectedItemProperty().addListener(((observable, oldValue, newValue) -> {
            simpleStringProperty.setValue(newValue);
        }));

/*      simpleStringProperty.addListener(((observable, oldValue, newValue) -> {

        }));*/

        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }

}



если закоментирован пустой листенер, то на смену Combobox item System.out.println("change"); не срабатывает. Если добавить пустой листенер(раскоментить строку), то срабатывает. В чем проблема понять не могу... может кто поможет? JDK 1.8.0_72
...
Рейтинг: 0 / 0
onChange
    #39462919
DNShark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
точнее если с закоментированным листенером то срабатывает только 1 раз.
...
Рейтинг: 0 / 0
onChange
    #39462932
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
покажи fxml.
И это делай не в коде, а в дизайнере мышкой
DNShark
Код: java
1.
2.
ComboBox<String> comboBox = new ComboBox<>();
root.setCenter(comboBox);
...
Рейтинг: 0 / 0
onChange
    #39462936
DNShark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я без fxml написал. Там окно только с одним Combobox.

Код: java
1.
primaryStage.setScene(new Scene(root, 300, 275));


а root это BorderPane

класс рабочий. это весь код чтобы проверить.
...
Рейтинг: 0 / 0
onChange
    #39462943
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DNSharkя без fxml написал. Там окно только с одним Combobox.
мне не интересно разбирать пример со свалки-веба без рекомендаций JavaFX вер. 8
Удачи!
...
Рейтинг: 0 / 0
onChange
    #39462953
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DNShark,

- Логику кода проследить не могу. Зачем нужен список пропертей?
- Поведение либо ошибочное, либо не детерменированное, так как при пошаговой отладке change срабатывает всегда, а как только убираешь breakpoint-ы, то уже не срабатывае.
...
Рейтинг: 0 / 0
onChange
    #39462956
DNShark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,

это не со свалки, а с моего проекта. (. Могу с fxml суть та же....

файл sample.fxml

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
<?import javafx.scene.control.ComboBox?>
<?import javafx.scene.layout.BorderPane?>
<BorderPane fx:controller="sample.Controller"
            xmlns:fx="http://javafx.com/fxml">
    <center>
        <ComboBox fx:id="combobox">
        </ComboBox>
    </center>
</BorderPane>



Main. java


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root, 300, 275));
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }
    
}



Controller.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
public class Controller {

    public ComboBox<String> combobox;

    private ObservableList<SimpleStringProperty> list =
            FXCollections.observableArrayList(property -> new Observable[]{property});

    private SimpleStringProperty simpleStringProperty = new SimpleStringProperty(this, "simpleStringProperty", "hello");

    public Controller() {
        Platform.runLater(() -> run());
    }

    private void run() {
        combobox.getItems().addAll("1", "2", "3");
        list.add(simpleStringProperty);
        list.addListener((ListChangeListener<SimpleStringProperty>) change -> {
            System.out.println("change");
        });
        combobox.getSelectionModel().selectedItemProperty().addListener(((observable, oldValue, newValue) -> {
            simpleStringProperty.setValue(newValue);
        }));

/*        simpleStringProperty.addListener(((observable, oldValue, newValue) -> {

        }));*/
    }
}
...
Рейтинг: 0 / 0
onChange
    #39462963
DNShark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

у нас настройки хранятся, как список пропертей, и когда они меняются, то срабатывает обработчик. Загорается кнопка Apply и прочее. А вот на combobox немного с навороченной логикой, не срабатывает.

Да вот как-то так, в дебаге работает. Какая-то магия. Могу конечно, добавить пустой листенер и написать

//magic fix don't touch please

но хочется все таки понять, что в логике работы неправильно.
...
Рейтинг: 0 / 0
onChange
    #39462967
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DNSharkэто не со свалки, а с моего проекта.
На свалку бы надо. Смысл кода не уловим. Похоже на побочные эффекты.
...
Рейтинг: 0 / 0
onChange
    #39462975
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DNShark у нас настройки хранятся, как список пропертей, и когда они меняются, то срабатывает обработчик.
Ага, теперь вижу. Дизайн, конечно, у ObservableList через задний проход. Есть экстрактор - слушаем элементы, нет экстрактора - не слушаем.
...
Рейтинг: 0 / 0
onChange
    #39462976
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczНа свалку бы надо. Смысл кода не уловим. Похоже на побочные эффекты.
Прошу прощения, не подозревал, что это JavaFX в такое говно скатился, что без пол-литра не разобраться.
Теперь больше похоже на баг в JavaFX.
...
Рейтинг: 0 / 0
onChange
    #39462986
DNShark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz, да без пол-литры никуда).
...
Рейтинг: 0 / 0
onChange
    #39462995
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DNSharkфайл sample.fxml
другое дело.
- @FXML где?
...
Рейтинг: 0 / 0
onChange
    #39463000
DNShark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,

можно добавить в Controler.java над

Код: java
1.
public ComboBox<String> combobox;
...
Рейтинг: 0 / 0
onChange
    #39463002
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DNShark,

Попробовал понатыкать breakpoint с логированием. При достижении критической массы начинает работать. После отключения парочки - снова перестаёт. Похоже, что где-то из GUI, скорее всего комбобоксом пропихивается событие, из-за которого инвалидация уже не срабатывает. Если добавлен слушатель или breakpoint, то событие из GUI отрабатывает позже (или раньше?) и тогда оно на основной процесс уже не оказывает влияния.
...
Рейтинг: 0 / 0
onChange
    #39463004
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Самые хреновые баги, это когда что-то должно происходить, а не происходит. И не понятно где искать код, из-за которого что-то не происходит, ведь оно не происходит!
...
Рейтинг: 0 / 0
onChange
    #39463016
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DNShark,

Всё. Кажется нашел. Смотри. Вся соль в StringPropertyBase поле valid. Эта скотина меняет состояние, где бы вы думали? В методе get()! В том случае, когда слушатель отрабатывает 1 раз, флаг устанавливается в false и больше никогде не становится true, потому что никто его не читает.

Если добавить слушателя, или в точках останова выполнится toString() - все отладчики так показывают объект, то get() метод ставит флаг valid и инвалидация срабатывает каждый раз.

Похоже на некую оптимизацию, если свойство никто не читает, то и нехрен его обновлять каждый раз.
...
Рейтинг: 0 / 0
onChange
    #39463018
DNShark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123, если как в проекте то у нас так идёт. через <fx:root> но всё равно это детали. К багу они имеют только косметическое отношение

sample.fxml
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
<?import javafx.scene.control.ComboBox?>
<fx:root type="sample.Controller"
            xmlns:fx="http://javafx.com/fxml">
    <center>
        <ComboBox fx:id="combobox">
        </ComboBox>
    </center>
</fx:root>



Controller.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
import javafx.beans.Observable;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.control.ComboBox;
import javafx.scene.layout.BorderPane;

import java.io.IOException;

public class Controller extends BorderPane{

    @FXML
    public ComboBox<String> combobox;

    private ObservableList<SimpleStringProperty> list =
            FXCollections.observableArrayList(property -> new Observable[]{property});

    private SimpleStringProperty simpleStringProperty = new SimpleStringProperty(this, "simpleStringProperty", "hello");

    public Controller() {
        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource(
                "sample.fxml"));
        fxmlLoader.setRoot(this);
        fxmlLoader.setController(this);
        try {
            fxmlLoader.load();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @FXML
    private void initialize() {
        combobox.getItems().addAll("1", "2", "3");
        list.add(simpleStringProperty);
        list.addListener((ListChangeListener<SimpleStringProperty>) change -> {
            System.out.println("change");
        });
        combobox.getSelectionModel().selectedItemProperty().addListener(((observable, oldValue, newValue) -> {
            simpleStringProperty.setValue(newValue);
        }));

/*        simpleStringProperty.addListener(((observable, oldValue, newValue) -> {

        }));*/
    }
}



Main.java

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(new Controller(), 300, 275));
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }

}

...
Рейтинг: 0 / 0
onChange
    #39463021
DNShark
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz, ну ты джедай! спасибо)
...
Рейтинг: 0 / 0
onChange
    #39463030
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DNSharkно всё равно это детали. К багу они имеют только косметическое отношение
возможно. Мне просто так легче посмотреть проект.
Но Blazkowicz как всегда уже решил).
Удачи!
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / onChange
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]