Dwa_Okna

0
 
public class Main extends JFrame {
    JFrame fr = new JFrame("Frame");
    public Main() {
       fr.setVisible(true);
       fr.setSize(500, 500);
       fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

     
    }
   public static void main(String[] args) throws FileNotFoundException, IOException{

    java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Main().setVisible(true);
            }
        });
    
    }
    }

dlaczego przy tym kodzie uruchamiają mi się dwa okna?
Fakt użyłem tu dwa razy setVisible ale przecież odpalam klasę Main w której jest jedno JFrame

0

Jak to czemu? Main dziedziczy po JFrame, czyli w kodzie dwa razy tworzysz obiekt klasy JFrame.

0

Ale przecież wątek tworzy właśnie obiekt Main.
Czyli w tym przypadku wątek uruchamia mi puste okno dlatego że klasa dziedziczy po Jframe a później wyrzuca następne stworzone w konstruktorze tak?

0

No dokładnie. Jak tworzysz obiekt klasy A, która dziedziczy po B, ......, która dziedziczy po X, a ta dziedziczy po Object (każda klasa dziedziczy po Object) to najpierw wywołuje się konstruktor z klasy Object, potem X, ..., B, a na końcu A.

Wywołaj sobie taki kod:

class Bazowa {

    Bazowa() {
        System.out.println("Tu konstruktor z klasy Bazowa");
    }
}

class Dziedzicząca extends Bazowa {

    Dziedzicząca() {
        System.out.println("Tu konstruktor z klasy Dziedzicząca");
    }

}

public class Main {

    public static void main(String[] args) {
        new Dziedzicząca();
    }
}

Na początku każdego konstruktora musi być wywołanie super(...). Jeśli go nie wpiszesz to kompilator wpisze domyślne super(). Super(...) to konstruktor z klasy wyżej w hierarchii. Podobnie jeżeli nie dopiszesz extends, to kompilator doda extends Object.

Kod:

class Bazowa extends Object {

    Bazowa() {
        super();
        System.out.println("Tu konstruktor z klasy Bazowa");
    }
}

class Dziedzicząca extends Bazowa {

    Dziedzicząca() {
        super();
        System.out.println("Tu konstruktor z klasy Dziedzicząca");
    }

}

public class Main {

    public static void main(String[] args) {
        new Dziedzicząca();
    }
}

będzie skompilowany do identycznej postaci co ten powyżej.

0

Czyli gdy wywalę z wyjątku setVisible nie będzie mi pokazywało efektu dziedziczenia klasy Main po JFrame w moim przypadku (i zostanie to co mi jest potrzebne):)
Super wyjaśnione :)

Dziękować :)

0
remigio napisał(a)
 
public class Main extends JFrame {
    JFrame fr = new JFrame("Frame"); <- 2) drugie okono klasy JFrame 2. obiekt utworzony
    public Main() {
       fr.setVisible(true); <- 3) ustaw widoczność drugiego okna (fr <- pole klasy Main)
       fr.setSize(500, 500);
       fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

     
    }
   public static void main(String[] args) throws FileNotFoundException, IOException{

    java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Main().setVisible(true); <- 1) okno klasy Main 1. obiekt utworzony + ustaw widoczność okna
            }
        });
    
    }
    }

dlaczego przy tym kodzie uruchamiają mi się dwa okna?
Fakt użyłem tu dwa razy setVisible ale przecież odpalam klasę Main w której jest jedno JFrame

0

Wywal też extends JFrame, bo to jest błąd w twoim kodzie.

Edit:
Aj to chyba nie o to ci chodziło. Chciałeś zrobić okno w EDT, a więc albo możesz zostawić extends JFrame, ale wywalić pole fr:

Przykładowo:

import javax.swing.JFrame;

public class Main extends JFrame {

    public Main() {
        super("Frame");
        setVisible(true);
        setSize(500, 500);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {

        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new Main();
            }
        });

    }
}

Albo wywalić extends JFrame, ale zostawić fr:

import javax.swing.JFrame;

public class Main {

    private JFrame fr;

    public Main() {
        fr = new JFrame("Frame");
        fr.setVisible(true);
        fr.setSize(500, 500);
        fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {

        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new Main();
            }
        });

    }
}
0

ale gdy wywalę extends JFrame
pan.setCursor(Cursor.getPredefinedCursor(WAIT_CURSOR));

ta linijka także nie chodzi :/

więc chyba musi zostać...

0

Moja propozycja to usunąć JFrame fr = new JFrame()
i tam gdzie znajduje się fr. zamienić na this
a w main usunąć setVisible()

0

A co to jest pan? W pierwszej wersji wywołaj setCursor(blabla), w drugiej wersji wywołaj fr.setCursor(blabla).

0

pan to nazwa panelu w którym kursor ma się zmieniać....
czyli jak wpiszę :
fr.setCursor(Cursor.getPredefinedCursor(WAIT_CURSOR));
kursor będzie zmieniony w całej ramce...a ja chcę tylko w tym panelu

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