JPanele w oddzielnych klasach

0

Chcę zrobić aplikację składającą się z jednego okienka, w którym będzie dużo JPaneli więc chciałem rozbić JPanele na oddzielne klasy np. PanelLogowania, PanelRejestracji itp. jednak efekt nie jest taki jakiego oczekuję bo albo tworzy mi dwa okna albo przy wyświetleniu drugiego JPanela jest on lekko obniżony przez co na górze mam wąski biały pasek bo widzi mi od to tak jakbym zakładał panel na panel. Ktoś pomoże jak to rozwiązać?

0

Długo szukać nie trzeba... Tak jak napisał to Koziołek:

CardLayout

0

Jakiego managera rozkładu używasz, czy ustawiasz rozmiary dla danych paneli i dlaczego nie? Chcesz żeby te panele były widoczne wszystkie na raz, czy chcesz się przełączać pomiędzy nimi, żeby na raz był jeden widoczny (w takim wypadku CardLayout).

0

chcę się przełączać między panelami. Panele te będą bardzo rozbudowane dlatego chciałem wszystkie elementy związane z danym JPanele umieścić w jednej klasie. Niestety nie mogę znaleźć rozwiązania jak jak użyć cardLayout żeby było tak jak chce

0

A to co zaproponował Koziołek w swoim tutorialu nie odpowiada?

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Dimension;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.*;

public class CardLayoutApp {

    public static void main(String[] args) {

        JFrame frame = new JFrame("CardLayout");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setSize(300, 300);

        JComboBox box = new JComboBox(new String[] { "1", "2" });

        CardLayout cardLayout = new CardLayout();
        JPanel cards = new JPanel(cardLayout);
        cards.add(new MyPanel(cardLayout), "1");
        cards.add(new MyPanel(cardLayout), "2");

        box.addItemListener(new Pager(cardLayout, cards));

        frame.getContentPane().setLayout(new BorderLayout());

        frame.getContentPane().add(box, BorderLayout.NORTH);
        frame.getContentPane().add(cards, BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);
    }

    static class Pager implements ItemListener {

        private CardLayout cardLayout;
        
        private JPanel cards;

        public Pager(CardLayout cardLayout, JPanel cards) {
            this.cardLayout = cardLayout;
            this.cards = cards;
        }

        @Override
        public void itemStateChanged(ItemEvent e) {
            cardLayout.show(cards, (String) e.getItem());
        }
    }
}

/**
 * Klasa reprezentuje abstrakcyjny komponent stworzony przez użytkownika.
 *
 * @author koziolek
 *
 */
class MyPanel extends JPanel {

    private static final long serialVersionUID = 1L;

    public MyPanel(CardLayout cardLayout) {
        super(new BorderLayout());
        init();
    }

    private void init() {
        JTextArea area = new JTextArea();
        add(area, BorderLayout.CENTER);
        setPreferredSize(new Dimension(300, 300));
    }
}
0

no wlasnie coś mi nie wychodzi przerobienie tego kodu. Chce mieć coś takiego: klasa "PanelLogowania" w klasie tej mam dodawanie przycisków, JTextFieldów itp. oraz Listenery do tych elementów. Po kliknięciu określonego przycisku panelLogowania robi się niewidoczny a otwiera się JPanel z innej klasy, w której są tworzone inne przyciski itp. i w tej klasie też są Listenery do tych elementów. Wszystkie JPanele mają pokrywać cały JFrame i musi być możliwość przeskakiwania z dowolnego JPanela do innego dowolnego JPanela

0

zapomniałem dodać, że nie chcę korzystać z żadnych menagerów rozkładu, chce wszystko sam rozmieszczać za pomocą setBounds()

0
anon napisał(a):

zapomniałem dodać, że nie chcę korzystać z żadnych menagerów rozkładu, chce wszystko sam rozmieszczać za pomocą setBounds()

W takim razie musiałbyś zaprojektować zdarzenia tego przycisku do przełączania paneli w taki sposób, żeby czyścił cały panel główny i zapełniał go od nowa, choć naprawdę wydajniejsze byłoby zaimplementowanie CardLayout, który dokładnie do tego służy.

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