Ограничитель ¿Como puedo una aplicación en Java una тратта instancia cuando lo arranco?

Tengo una aplicación Java (index.java) que si la ejecuto navego por sus diferentes JFrame o JDialog грешите problemas и т.д.

Ми duda/pregunta/consulta es: ¿existe algún método параграф никакой permitir abrir durante el proceso de index.java otro index.java? Y en caso de intentar volver abrirlo (СИ está abierto) mostrar ООН mensaje: "Está en uso".

Espero haberme explicado.

Código:

public class Index extends javax.swing.JFrame {
    public Index() {
        initComponents();
        //Fondo del JFrame en color gris.
        getContentPane().setBackground(Color.gray);
        //Código para confirmar el cierre de la ventana principal.
        setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
        addWindowListener(new java.awt.event.WindowAdapter() {
            @Override
            public void windowClosing(java.awt.event.WindowEvent evt){
                if (JOptionPane.showConfirmDialog(rootPane, "¿Desea salir de la aplicación?", "Salir de la aplicación",
                    JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION)
                    System.exit(0);
            }
        });

        //Situamos el JDialog en el centro de la pantalla.
        setLocationRelativeTo(null);
        //No redimensionable.
        setResizable(false);
    }

    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(Index.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(Index.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(Index.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Index.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Index().setVisible(true);
            }
        });
    }
}
13
задан 27.02.2017, 16:55
0 ответов

Не прямо стороны java, если инстанции прокручивают изображение в окне в двух машинах виртуальные отличные. Однако ты можешь решать тему с файлом сбоя.

в методе main ты начинаешься с:

// deberías definir la ruta de tu lockfile en una forma que siempre se guarda en el mismo lugar en el misma sistema
File lock = new File("ruta/a/mi/lockfile");
if (lock.createNewFile()){
    lock.deleteOnExit();
    //lanza tu applicación
} else {
    System.out.println("Está en uso.")
    System.exit();
}
15
ответ дан 03.12.2019, 17:48
  • 1
    Мне хотелось бы оставлять ему эту информацию docs.oracle.com/javase/7/docs/api/java/io/… очень возможно, что, прочитав отметку и соединение FileLock, он, может быть, хочет смотреть какой-то пример java.nio.channels. FileLock alomejor может переделывать его ответ. (если он считает это уместным). Привет –  27.02.2017, 15:33
  • 2
    Эта solució n он мне кажется лучше, чем та ServerSocket, с одиноким socket ты можешь иметь инстанцию каждым ПК, с архивами, можешь решать, что q он из-за пользователя или из-за сессии. –  28.02.2017, 20:42
  • 3
    Это независимое, с ServerSocket tambié n могут, только нужно использовать порт из-за usuario/sesió n, например 5000+uid –  28.02.2017, 22:10
  • 4
    Если процесс закончен внешне посредством SO, или если случается ошибка во времени выполнения, архив не будет удален и это спровоцирует, что ты не можешь заводить aplicació n –  01.03.2017, 23:36
  • 5
    Это 100 % правильных. Даже, что deleteOnExit() достаточно заслуживающий доверия, очевидно убийство процесса оставляет архив zombie, который нужно стирать вручную. Они существуют пара mé все исправления этого, но mayorí под звук немного má s осложненный, потому что они не функционируют в том же способе в любом SO. –  02.03.2017, 04:38

Альтернатива, которая просто была бы должна предотвращать вторую инстанцию твоего приложения, состояла бы в том, чтобы использовать один ServerSocketчтобы гарантировать в сторону, что нет двух инстанций прокручивая изображение в окне и кроме того перемещать аргументы следующих запусков в то же приложение:

public class MiApp implements Runnable{

    public MiApp(){}

    @Override
    public void run() {
        // código de la aplicación

    }

    public void nuevosParametros(String[] args){
        // aquí viene tu código que injecta otro juego de argumentos en tu applicación 
    }


    public static void main(String[] args) {

        try {
            ServerSocket serSock = new ServerSocket(5000);

            // uff, el puerto estaba libre, podemos hacer algo util... :)
            MiApp miApp = new MiApp();
            Thread t = new Thread(miApp);
            t.start();
            miApp.nuevosParametros(args);

            while(true){
                // aquí vamos a escuchar a lanzamientos de la aplicación
                // con distintos argumentos
                Socket sock = serSock.accept();
                ObjectInputStream ois = new ObjectInputStream(sock.getInputStream());
                Object o;
                try {
                    o = ois.readObject();
                    if (o instanceof String[])
                        miApp.nuevosParametros((String[]) o);
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                } finally {
                    try{
                        sock.close();
                    } catch (IOException e){}
                }
            }
        } catch (IOException e) {
            // En el caso que puerto 5000 esta ocupado, resulta la IOException, entonces:
            try {
                // crea un Socket y envia los argumentos a la instancia corriendo
                Socket sock = new Socket("127.0.0.1",5000);
                ObjectOutputStream oos = new ObjectOutputStream(sock.getOutputStream());
                oos.writeObject(args);
            } catch (IOException e1) {
                e1.printStackTrace();
            }

            e.printStackTrace();
        }
    }
}
3
ответ дан 03.12.2019, 17:48