Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / javafx, в tableview дублируются последние строки / 3 сообщений из 3, страница 1 из 1
11.09.2014, 12:51
    #38744083
Юрий321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
javafx, в tableview дублируются последние строки
Код: 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.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package transm.teamcast;

import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.ResourceBundle;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.geometry.Pos;
import javafx.scene.control.Label;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.image.ImageView;
import javafx.util.Callback;
import org.snmp4j.smi.OID;
import transm.Settings;
import transm.snmp.SNMPPoller;

/**
 * FXML Controller class
 *
 * @author yura
 */
public class TeamCastStateController implements Initializable {

    /**
     * Initializes the controller class.
     */
    private List<OID> oids = Arrays.asList(
            new OID(".1.3.6.1.4.1.50001.200.1"),
            new OID(".1.3.6.1.4.1.50001.200.2"),
            new OID(".1.3.6.1.4.1.50001.200.3"),
            new OID(".1.3.6.1.4.1.50001.200.4"),
            new OID(".1.3.6.1.4.1.50001.200.5"),
            new OID(".1.3.6.1.4.1.50001.200.6"),
            new OID(".1.3.6.1.4.1.50001.200.7"),
            new OID(".1.3.6.1.4.1.50001.200.8"),
            new OID(".1.3.6.1.4.1.50001.200.9"),
            new OID(".1.3.6.1.4.1.50001.200.11"),
            new OID(".1.3.6.1.4.1.50001.200.12"),
            new OID(".1.3.6.1.4.1.50001.200.36")
    );

    private SNMPPoller poller = new SNMPPoller(
            Settings.server, Settings.port, Settings.community, Settings.timeout, oids);

    private HashMap<String, String> ledStates = new HashMap<String, String>() {
        {
            put("0", "/pics/norm_16.png");
            put("1", "/pics/alarm_16.png");
        }
    };

    @FXML
    TableView<DataHolder> tableStatus;
    @FXML
    TableColumn<DataHolder, String> tableColumnPic;
    @FXML
    TableColumn<DataHolder, String> tableColumnTitle;

    ObservableList<DataHolder> data = FXCollections.observableArrayList(); // The table's data

    @Override
    public void initialize(URL url, ResourceBundle rb) {

        tableStatus.setItems(data);

        tableColumnTitle.prefWidthProperty().bind(tableStatus.widthProperty().multiply(0.75)); // 75%
        tableColumnPic.prefWidthProperty().bind(tableStatus.widthProperty().multiply(0.25)); // 25%

        tableColumnTitle.setCellValueFactory(new PropertyValueFactory<DataHolder, String>("title"));
        tableColumnTitle.setCellFactory(new Callback<TableColumn<DataHolder, String>, TableCell<DataHolder, String>>() {
            @Override
            public TableCell<DataHolder, String> call(TableColumn<DataHolder, String> param) {
                TableCell<DataHolder, String> cell = new TableCell<DataHolder, String>() {
                    @Override
                    public void updateItem(String item, boolean empty) {
                        if (item != null) {
                            Label titleLabel = new Label(item);
                            setGraphic(titleLabel);
                            setAlignment(Pos.CENTER_RIGHT);
                        }
                    }
                };
                return cell;
            }
        });

        tableColumnPic.setCellValueFactory(new PropertyValueFactory<DataHolder, String>("pic"));
        tableColumnPic.setCellFactory(new Callback<TableColumn<DataHolder, String>, TableCell<DataHolder, String>>() {
            @Override
            public TableCell<DataHolder, String> call(TableColumn<DataHolder, String> param) {
                TableCell<DataHolder, String> cell = new TableCell<DataHolder, String>() {
                    @Override
                    public void updateItem(String item, boolean empty) {
                        if (item != null && ledStates.get(item) != null) {
                            ImageView imgStatus = new ImageView(ledStates.get(item));
                            setGraphic(imgStatus);
                            setAlignment(Pos.CENTER);
                        }
                    }
                };
                return cell;
            }
        });

        poller.setRunning(true);
        poller.start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    try {
                        showData();
                        Thread.sleep(1000);
                    } catch (Exception ex) {
                        ex.printStackTrace(System.err);
                    }
                }
            }
        }).start();
        

    }

    private void showData() {
        List<DataHolder> tmpData = new ArrayList();
  
        if ("0".equals(poller.getData("1.3.6.1.4.1.50001.200.1"))) {
            tmpData.add(new DataHolder("Состояние аппаратной части", "0"));
            tmpData.add(new DataHolder("Состояние ПО", "0"));
        } else if ("1".equals(poller.getData("1.3.6.1.4.1.50001.200.1"))) {
            tmpData.add(new DataHolder("Состояние аппаратной части", "1"));
            tmpData.add(new DataHolder("Состояние ПО", "0"));
        } else if ("2".equals(poller.getData("1.3.6.1.4.1.50001.200.1"))) {
            tmpData.add(new DataHolder("Состояние аппаратной части", "0"));
            tmpData.add(new DataHolder("Состояние ПО", "1"));
        } else if ("3".equals(poller.getData("1.3.6.1.4.1.50001.200.1"))) {
            tmpData.add(new DataHolder("Состояние аппаратной части", "1"));
            tmpData.add(new DataHolder("Состояние ПО", "1"));
        }

        tmpData.add(new DataHolder("Процесс включения", poller.getData("1.3.6.1.4.1.50001.200.2")));
        tmpData.add(new DataHolder("Перегрев модулятора", poller.getData("1.3.6.1.4.1.50001.200.3")));
        tmpData.add(new DataHolder("Совместимость ПО и аппаратной части", poller.getData("1.3.6.1.4.1.50001.200.4")));
        tmpData.add(new DataHolder("Сбой про загрузке", poller.getData("1.3.6.1.4.1.50001.200.5")));
        tmpData.add(new DataHolder("Состояние внутренних коммуникаций", poller.getData("1.3.6.1.4.1.50001.200.6")));
        tmpData.add(new DataHolder("ПО загружено", poller.getData("1.3.6.1.4.1.50001.200.8")));
        tmpData.add(new DataHolder("Проверка лицензий пройдена", poller.getData("1.3.6.1.4.1.50001.200.9")));
        
        data.setAll(tmpData);
        
    }

    public class DataHolder {

        private SimpleStringProperty title = new SimpleStringProperty();
        private SimpleStringProperty pic = new SimpleStringProperty();

        public DataHolder(String title, String pic) {
            this.title.setValue(title);
            this.pic.setValue(pic);
        }

        public String getTitle() {
            return title.get();
        }

        public String getPic() {
            return pic.get();
        }

        public void setTitle(String title) {
            this.title.setValue(title);
        }

        public void setPic(String pic) {
            this.pic.setValue(pic);
        }
    }

}



последняя строка в таблице задваивается.

что не так в коде?

рядом похожий контроллер с таблицей, там последняя строка повторяется вообще 4 раза.
...
Рейтинг: 0 / 0
11.09.2014, 13:29
    #38744140
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
javafx, в tableview дублируются последние строки
Нельзя из каких попало потоков обновлять UI и забинженые свойства без Platform.runLater()
В JavaFX есть же своя антимация и таймеры должны быть. Зачем этот колхоз с new Thread() было городить?
...
Рейтинг: 0 / 0
11.09.2014, 13:31
    #38744143
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
javafx, в tableview дублируются последние строки
Городить CellFactory для того чтобы отобразить текст на колонке таблицы, это по-моему за гранью.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / javafx, в tableview дублируются последние строки / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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