У меня есть приложение Java Swing, которое будет работать одновременно на нескольких компьютерах в одной сети. Я пытаюсь сделать так, чтобы когда один пользователь выполнял действие над своим запущенным приложением, это влияло на все остальные приложения, работающие в других системах. Например, когда кто-то щелкает элемент из списка list_1, а затем нажимает кнопку действия, например actionOne (который запускает ярлык для другой программы), я хочу, чтобы элемент в списке list_1 был серым (не включен) для всех других приложений, которые работает.
Я пробовал возиться с сокетами / tcp / udp, но, похоже, не смог правильно интегрировать его в приложение. Какой самый простой способ сделать это?
public class Home extends JFrame{
private JPanel contentPane;
public static void main(String[] args){
EventQueue.invokeLater(new Runnable() {
public void run() {
try{
Home frame = new Home();
frame.setVisible(true);
} catch (Exception e){
e.printStackTrace();
}
}
});
}
public Home(){
//I added some settings for the frame here
//I added some settings for the JPanel that serves as my contentPane here
setContentPane(contentPane)
JList list_1 = new JList();
//I added some settings for the list here
contentPane.add(list_1);
list_1.setModel(new AbstractListModel() {
String[] values = new String[]{"Item 1", "Item 2", "Item 3", "Item 4"};
public int getSize(){ return values.length; }
public Object getElement(int index){ return values[index]; }
});
list_1.setVisibleRowCount(4);
class MyCellRenderer extends DefaultListCellRenderer{
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
//I added some settings for the cutom JList here
if(isSelected){
label.setBackground(new Color(153, 204, 255));
}
return label;
}
}
JButton btnLaunchAll = new JButton("Launch All");
btnLaunchAll.addActionListener(new Action Listener(){
public void actionPerformed(ActionEvent e){
try {
launchAll(list_1.getSelectedValue());
} catch (Exception e1){
e1.printStackTrace();
}
}
});
btnLaunchAll.setVisible(false);
contentPane.add(btnLaunchAll);
JButton btnActionOne = new JButton("Action 1");
btnActionOne.addActionListener(new Action Listener(){
public void actionPerformed(ActionEvent e){
try {
actionOne(list_1.getSelectedValue());
} catch (IOException e1){
e1.printStackTrace();
}
}
});
btnActionOne.setVisible(false);
contentPane.add(btnActionOne);
ListSelectionListener listSelection = new ListSelectionListener(){
@Override
public void valueChanged(ListSelectionEvent e){
String selectedItem = (String) list_1.getSelectedValue();
btnLaunchAll.setVisible(true);
btnActionOne.setVisible(true);
.
.
.
}
public String selectedValue(){
return (String) list_1.getSelectedValue();
}
};
list_1.setCellRenderer(new MyCellRenderer());
list_1.addListSelectionListener(listSelection);
}
public void luanchAll(Object item) throws Exception {
actionOne(item);
Thread.sleep(4000);
actionTwo(item);
Thread.sleep(4000);
.
.
.
}
public void actionOne(Object item) throws IOException {
String itemName = (String) item;
ProcessBuilder processOne = new ProcessBuilder("cmd", "/c", "Path to Shortcut" + itemName + ".lnk");
Process starting = processOne.start();
}
.
.
.
}
Код выше является общей версией того, что я сделал до сих пор. Я не уверен, что лучший способ добавить связь между несколькими экземплярами приложения.