gpt4 book ai didi

java - 如何将 Java Swing 应用程序与同一网络上的其他应用程序实例连接?

转载 作者:行者123 更新时间:2023-12-02 04:14:01 26 4
gpt4 key购买 nike

我有一个 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();
}
.
.
.
}

上面的代码是我迄今为止所做的通用版本。我不确定在应用程序的多个实例之间添加连接的最佳方法是什么。

最佳答案

我认为sockets是做到这一点的最好方法。您需要在应用程序的所有实例之间进行通信,因此您需要一个实例来与所有其他实例进行通信(这并不容易)。

因此,最好的方法可能是 client-server-modell ,其中应用程序的所有实例都是客户端,并且有一个服务器(不应是实例之一,而是不同类型的程序)。

在此模型中,应用程序的所有实例都需要连接到服务器并告诉服务器它们何时启动进程,或执行其他实例需要知道的任何其他操作。然后服务器(知道所有实例,因为它们都连接到主服务器)可以告诉所有实例特定资源不再可用(这样它们就可以禁用该按钮)。

关于java - 如何将 Java Swing 应用程序与同一网络上的其他应用程序实例连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56672419/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com