Я столкнулся с одной вещью. У меня есть данные с телефона на компьютер, и они отображаются в окне JFrame. Я решил попробовать сделать с SwingWorker, чтобы он загружал новые данные, не открывая новые окна. Теперь это выглядит так: ответ пришел - открывается новое окно с загруженными данными, а старое окно остается открытым до конца программы. Я написал реализацию метода doInBackground (), но я уверен, что все сделал неправильно. Не могли бы вы помочь понять, как это лучше всего реализовано, а также исправить мой метод doInBackground (). Полученные данные записываются в HashMap и затем передаются в класс SimpleTableDemo. Заранее спасибо.
public class SimpleTableDemo extends JFrame {
private static final String[] columnNames = { "Судья", "Ответ" };
private final JTable table;
private static SwingWorker swingWorker;
public SimpleTableDemo() {
super("Test");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new GridLayout(1, 0));
table = new JTable(new Object[0][0], columnNames) {
@Override
public Class getColumnClass(int column) {
switch (column) {
case 1:
return String.class;
default:
return Object.class;
}
}
@Override
public boolean isCellEditable(int row, int col) {
return false;
}
};
table.setPreferredScrollableViewportSize(new Dimension(500, 80));
table.setFillsViewportHeight(true);
JScrollPane scrollPane = new JScrollPane(table);
add(scrollPane);
pack();
setVisible(true);
swingWorker = new SwingWorker() {
// I need help in this method
@Override
protected Object doInBackground() throws Exception {
Thread.sleep(1000);
return true;
}
};
}
//Receive data from another class
public void setData(Map<Object,String> map) {
Object[][] data = map.entrySet()
.stream()
.map(e -> new Object[] { e.getKey(), e.getValue() })
.toArray(Object[][]::new);
table.setModel(new DefaultTableModel(data, columnNames));
}
// setData in JFrame
private static void start() {
SimpleTableDemo demo = new SimpleTableDemo();
Map<Object,String> map = new HashMap<>();
demo.setData(map);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(SimpleTableDemo::start);
}
}