Как связать приложение Java Swing с другими экземплярами приложения в той же сети? - PullRequest
0 голосов
/ 19 июня 2019

У меня есть приложение 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();
    }
    .
    .
    .
}

Код выше является общей версией того, что я сделал до сих пор. Я не уверен, что лучший способ добавить связь между несколькими экземплярами приложения.

1 Ответ

0 голосов
/ 19 июня 2019

Я думаю, сокеты - лучший способ сделать это. Вам нужна связь между всеми экземплярами приложения, поэтому вам нужен один экземпляр для связи с каждым другим экземпляром (что не так просто).

Следовательно, наилучшим способом сделать это, вероятно, будет client-server-modell , где все экземпляры приложения являются клиентами и существует один сервер (который не должен быть одним из экземпляров). но другой тип программы).

В этой модели все экземпляры приложения должны подключиться к серверу и сообщить ему, когда они запустили процесс , или сделали что-нибудь еще, что нужно знать другим экземплярам. Затем сервер (который знает все экземпляры, потому что все они подключены к мастеру) может сообщить всем экземплярам, ​​что определенный ресурс больше не доступен (поэтому они могут отключить кнопку).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...