Pytanie dotyczące wątków.

0

Witam, mam znow pytanie - kod z ksiazki:

import javax.swing.*;
public class SwingConsole {
	public static void run(final JFrame f, final int width, final int height) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				f.setTitle(f.getClass().getSimpleName());
				f.setSize(width, height);
				f.setVisible(true);
			}
		});
	}
}

Nie bardzo rozumiem jak to ma dzialac - Runnable to interfejs ktory nalezy implenemtowac w wlasnej klasie, wymuszajacy napisanie metody run() ktora bedzie dzialac w osobnym watku (przerabiam akurat wątki i GUI). Co wiec oznacza napisanie** new Runnable() { bla; }** ? Przeciez, z tego co wiem, nie mozna tworzyc obiektow z interfejsow. Czy to jest jakis skrót i cos sie dzieje pod maska?

0

Dokładnie tak, jak napisałeś - "coś się dzieje pod maską". Tworzysz klasę anonimową implementującą interfejs Runnable i od razu podajesz jej kod :) A potem do metody invokeLater jest przekazywany obiekt tej klasy anonimowej. I tyle z "magii" ;)

0

Ok, czytam dokumentacje i tak jakby chwytam, ale nie wiem czy na pewno. Z tego co tu widze wynika, ze rownie dobrze moglbym napisac cos takiego:

class costamCos imlpements Runnable {
	public void run() {
		...
		}
	}
Runnable zadanie = new costamCos();
SwingUtilities.invokelater(zadanie);

Czy to by sie mniej wiecej zgadzalo? Rozumiem, ze klasa wewnatrz metody (w pierwszym kawalku kodu w pierwszym poscie) ma ta zalete, ze posiada dostep do parametrow metody, podczas gdy tutaj trzeba by je inaczej pobrac (przy okazji, jak?).

0

Zasadniczo to to samo, z tą różnicą że teraz masz klase nazwaną i możesz jej użyc wiele razy.. Żeby obiekt twojej klasy miał dostęp do jakichś parametrów musisz je przekazać w konstruktorze (albo seterem), tak jak do każdego innego obiektu.

0

Ok, rozumiem, dzieki wszystkim. Juz mniej zwiazane z tematem, ale po przeczytaniu odpowiedzi musze o to zapytac: czy mozna, a jesli tak - w jaki sposob - miec kilka konstruktorow w klasie anonimowej?

0

A jaki miałoby to sens skoro wywołujesz tylko jeden konstruktor w jednym konkretnym miejscu?

0

To pewnie oznacza "nie". Dzieki. Ostatnia rzecz (poki co) - mam ta klase z pierwszego posta, i tam metode run zdefiniowana w jednym pliku javy (metoda jest publiczna). Chcialbym jej uzyc w drugim pliku javy. Oba pliki sa w tym samym miejscu i w tej samej paczce. Przekazuje do run argument ktory dziedziczy po JFrame i dwie liczby calkowite. Mimo to dostaje komunikat "method run undefined for the type~". Czemu tak sie dzieje?

0

Pokaż kod.

0

Kod - pierwsza klasa to ta z pierwszego posta:

import javax.swing.*;
public class SwingConsole {
        public static void run(final JFrame f, final int width, final int height) {
                SwingUtilities.invokeLater(new Runnable() {
                        public void run() {
                                f.setTitle(f.getClass().getSimpleName());
                                f.setSize(width, height);
                                f.setVisible(true);
                        }
                });
        }
}

druga klasa - ta sama lokacja systemowa, ta sama paczka:

import javax.swing.*;
import java.awt.*;
public class Button1 extends JFrame {
	private JButton b1 = new JButton("Button1"), b2 = new JButton("Button2");
	public Button1() {
		setLayout(new FlowLayout());
		add(b1); add(b2);
	}
	public static void main(String[] args) {
		run(new Button1(), 200, 100);
	}
}

Eclipse zglasza: "The method run(Button1, int, int) is undefined for the type Button1" w linii run(new Button1(), 200, 100);.

0

SwingConsole.run

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