我有一个Java Swing应用程序,它将在同一网络上的多台计算机上同时运行。我试图做到这一点,以便当一个用户对其正在运行的应用程序执行操作时,它会影响在其他系统上运行的所有其他应用程序。与之类似,当某人单击list_1中的某个项目,然后单击一个动作按钮(例如,actionOne(它启动另一个程序的快捷方式))时,我希望list_1上的该项目对于所有其他应用程序都变灰(不启用)。运行。
我尝试弄乱sockets / 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();
}
.
.
.
}
上面的代码是我到目前为止所做的通用版本。我不确定在多个应用实例之间添加连接的最佳方法是什么。
答案 0 :(得分:0)
我认为sockets是执行此操作的最佳方法。您需要在应用程序的所有实例之间进行通信,因此需要一个实例与其他所有实例进行通信(这并不容易)。
因此,执行此操作的最佳方法可能是client-server-modell,其中应用程序的所有实例都是客户端,并且有一台服务器(不应是实例之一,而应是另一种类型的程序)。
在此模型中,应用程序的所有实例都需要连接到服务器,并在启动进程时告诉服务器,或者完成其他实例需要知道的其他事情。然后服务器(谁知道所有实例,因为它们都已连接到主服务器)可以告诉所有实例不再使用特定资源(因此可以禁用该按钮)。