dynamiczne generowanie obiektów

0

Chcę wygenerować dynamicznie obiekty klasy JPanel.
Liczba ta będzie ograniczona do 5, w związku z czym napisałem funkcję która generuje instancje klasy JPanel jednak na sztywno. Netabeans zgłasza błąd odnośnie zwracającej wartości w poniższym kodzie, czy zna ktoś jakieś bardziej elastyczne rozwiązanie, które pozwoliło by generować obiekty gdzie nie robi się tego na sztywno ?


public JPanel getjpanel(int number){

    int wsk = number;


    if(wsk == 1){
        JPanel Panel1 = new JPanel();
                    return Panel1; }
    else if(wsk == 2)
    {
        JPanel Panel2 = new JPanel();
                    return Panel2; }
    else if(wsk == 3)
    {
        JPanel Panel3 = new JPanel();
                    return Panel3; }
    else if(wsk == 4)
    {
        JPanel Panel4 = new JPanel();
                    return Panel4; }
    else if(wsk == 5)
   
         {JPanel Panel5 = new JPanel();
                    return Panel5; }


}

Zrobiłem to na switchu, ale też Netbeans wskazywał na niepoprawność ...

0

w tym przypadku nie masz return'a napisanego na końcu (te w ifie się nie liczą) więc się nie dziwię że ci wywala błąd.

Nie wiem czy cię dobrze rozumiem ale chcesz na szybko zrobić kilka paneli
Jeżeli o to chodzi to po prostu upakuj te panele do tablicy JPanel[] panels = new JPanel[size];
a później możesz wywoływać panel[i] = cośtam :)

0

To jest fuj-kod. Jeżeli chcesz tworzyć panel, ogólnie inicjować jedno pole, w zależności od tego jaki parametr został przekazany to można zrobić tak:

public JPanel getJPanel(int wsk) {
		if (wsk >= 5 || wsk < 1)
			throw new IllegalArgumentException("Nieprawidłowy zakres");
		JPanel panel = null;
		try {
			Field field = getClass().getField("panel" + wsk); // pola nazywają się panel1, panel2, panel3, ...
			field.setAccessible(true);
			field.set(this, new JPanel());
			panel = (JPanel) field.get(this);
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (NoSuchFieldException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
		return panel;
	}

nie jest to może najpiękniejszy kod, ale działa.

0

Zamiast field.set i field.get, mozesz utworzyc JPanel i zapamietac go w tymczasowej zmiennej, nastepnie wywolac field.set z tym panelem, i zwrocic go. Pomijasz niepotrzebna refleksje z Field.get.

0

W praktyce to można taki kod wyrzucić poza tą klasę do jakiegoś utilsa i generalnie jest dużo lepiej.

0

W ogóle to najlepsze rozwiązanie podał remigio - po co od razu refleksja, zamiast 5 pól można przecież stworzyć 5-elementową tablicę (nazwy pól i tak są znane).

0

@iooi, to zależy od tego czy te pola nie są gdzieś dalej wykorzystywane. Jeżeli są to trzeba by gettery i settery zrobić w nieintuicyjny sposób, a to wymaga testowania kodu.

0

Moim zdaniem rozwiązanie z refleksja jest złe podobnie jak wybieranie na podstawie inta.
W przypadku skończonych typów najlepsze jest użycie enuma.

public JPanel createPanel(PanelType panel) {
        switch (panel) {
            case PANEL1:
                return new Panel1();
            case PANEL2:
                return new Panel2();
            case PANEL3:
                return new Panel3();
            case PANEL4:
                return new Panel4();
            default:
                throw new IllegalArgumentException("Nie obsługiwany typ");
        }
    }

    public static enum PanelType {
        PANEL1,
        PANEL2,
        PANEL3,
        PANEL4
    }

Druga sprawa Panel1, Panel2... te nazwy nic nie mówią i nie powinno się ich stosować.

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