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

时间:2019-06-19 16:44:06

标签: java

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

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

1 个答案:

答案 0 :(得分:0)

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

因此,执行此操作的最佳方法可能是client-server-modell,其中应用程序的所有实例都是客户端,并且有一台服务器(不应是实例之一,而应是另一种类型的程序)。

在此模型中,应用程序的所有实例都需要连接到服务器,并在启动进程时告诉服务器,或者完成其他实例需要知道的其他事情。然后服务器(谁知道所有实例,因为它们都已连接到主服务器)可以告诉所有实例不再使用特定资源(因此可以禁用该按钮)。