możliwość otworzenia tylko 1 kopii apletu

0

Witam

czy da się sprawdzić z poziomu php lub podczas startu apletu czy jego kopia nie została już uruchomiona?

0

Co to znaczy "jest uruchomiona"?

  • na tej karcie przeglądarki tej przeglądarki
  • na jakiejkolwiek karcie tej przeglądarki
  • w innej przeglądarce.
0
  • na jakiejkolwiek karcie tej przeglądarki
0

dodaj do apletu pole

   private static int ile=0;

w metodzie init() daj ile++; a w metodzie destroy() daj ile--;
Sprawdzałem tylko na Operze, ten sposób nie rozróżnia apletów otwartych na różnych kartach. różnych oknach i na tej samej karcie.

0
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JFrame;

public class Test63_IleAppletow extends JApplet{
    public JFrame okno;
    public JButton button;
    private static int ileAppletow=0;

    @Override public void start(){
      if (ileAppletow >= 2) {
        this.destroy();
      } else {
        System.out.println("start");
        okno = new JFrame();
        button = new JButton();
        okno.setLayout(null); okno.setBounds(5, 5, 320, 240); okno.setVisible(true);
        this.setLayout(null);
        okno.add(button); button.setBounds(20, 20, 200, 20); button.setVisible(true);
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                button.setText(" ile = "+ileAppletow);
            }
        });
      }
    }
    public void init(){
        ileAppletow++;
        System.out.println("okno ile="+ileAppletow);
    }
    public void destroy(){
        ileAppletow--;
        System.out.println("okno ile="+ileAppletow);
        okno.dispose();
    }
}

dzieki
jeszcze dwa drobne pytania:

  1. Czy konstrukcyjnie tak powinno to wyglądać?
  2. Jak powinienem pozbyć się apletu by zahamować uruchamianie this.destroy(); wywołuje błąd w zasadzie to wystarcza i dobrze sie sprawdza ale troszke nie profesionalnie wygląda
0

Może jakoś tak:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JFrame;

public class Test extends JApplet
{
    public JFrame okno;
    public JButton button;
    private static int ileAppletow=0;
    private boolean first=true;
    public void start()
    {
        if(first)
        {
            button = new JButton();
            okno = new JFrame();
            okno.setLayout(null);
            okno.setBounds(5, 5, 320, 240);
            okno.setVisible(true);
            this.setLayout(null);
            okno.add(button); button.setBounds(20, 20, 200, 20);
            button.setVisible(true);
            button.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    button.setText(" ile = "+ileAppletow);
                }
            });
            }
    }
    public void init()
    {
        ileAppletow++;
        if(ileAppletow>1)
        {
            first=false;
            add(new JLabel("<html>Ten aplet jest juz uruchomiony <br> w innej karcie (w innym oknie)</html>"));
        }
        System.out.println("okno ile="+ileAppletow);
    }
    public void destroy()
    {
        ileAppletow--;
        System.out.println("okno ile="+ileAppletow);
        okno.dispose();
    }
}

Imo, bardzo nienaturalne jest tworzenie w aplecie ramek (JFrame), komponenty powinieneś umieścić na obszarze apletu, np. tak:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.FlowLayout;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JFrame;

public class Test extends JApplet
{
    public JButton button;
    private static int ileAppletow=0;

    public void init()
    {
        ileAppletow++;
        if(ileAppletow>1)
        {
            setLayout(new FlowLayout(FlowLayout.CENTER));
            add(new JLabel("<html>Ten aplet jest juz uruchomiony <br> w innej karcie (w innym oknie)</html>"));
        }
        else
        {
            button = new JButton();
            button.setBounds(20, 20, 200, 20);
            setLayout(null);
            add(button);
            button.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    button.setText(" ile = "+ileAppletow);
                }
            });
        }
    }
    public void destroy()
    {
        ileAppletow--;
    }
}
0

Pamiętaj, że aplet jest elementem strony. Czasem jedynym elementem, ale nie jest to żadna reguła. Zmiany rozmiaru apletu i wszelkie podobne zmiany mogą więc wpłynąć negatywnie na efekt jaki może chcieć osiągnąć webmaster osadzając aplet na stronie. Jedynym uzasadnionym powodem wiedzy apletu o innych apletach (lub instancjach jego samego) jest uzyskanie interaktywności między nimi. Na przykład wyświetlanie określonej zawartości w zależności od wyboru użytkownika dokonanego w innym aplecie. Uzasadnieniem wiedzy o innych egzemplarzach apletu może być uniknięcie przeprowadzania czasochłonnych obliczeń jeżeli takie same zostały już wcześniej przeprowadzone w innym egzemplarzu (lub oczekiwanie na przeliczenie ich w egzemplarzu, który zaczął je najwcześniej i późniejsze pobranie wyników).

1 użytkowników online, w tym zalogowanych: 0, gości: 1