Wyświetlanie różnych paneli

0

Witam,
Podjąłem się napisania gry w statki.
Hierarchia u mnie wyglada tak: Mam MenuPanel(z 3 buttonami - kazdy ma przechodzic na inny panel[oprócz exit, on mi ladnie wychodzi z gry] button - play(jeszcze nie implementowany) oraz button "Informations" w ktorym chcialem zawrzec pare informacji)), InformationPanel, ktory zawiera Panel z labelem(zeby byl backgroundz z obrazka :) ). Frame - klasa ramki, oraz klase Run w ktorej wywoluje moja new Runnable i powoluje do zycia frame :)

Problem pojawia sie kiedy buttonowi "informations" dodaje actionlistenera. przeciazam metode actionperformed tak, zeby po wcisnieciu buttona "informations" przeskakiwało mi na InformationPanel, gdzie jest label z obrazkiem i informacjami ;) nie moge sobie z tym poradzic. Oto kody do poszczegolnych klas:

MenuPanel

package game;

import javax.swing.JPanel;

public class MenuPanel extends JPanel
{
	public MenuPanel()
	{
		setBackground(UIManager.getColor("Tree.selectionBackground"));
		final InformationPanel informationPanel = new InformationPanel();
		
		JButton btnExit = new JButton("Exit");
		btnExit.setFont(new Font("Viner Hand ITC", Font.BOLD, 16));
		btnExit.setBounds(115, 251, 118, 60);
		btnExit.setForeground(new Color(0, 0, 139));
		btnExit.addActionListener(new ActionListener() 
		{
			public void actionPerformed(ActionEvent e) 
			{
				System.exit(0);
			}
		});
		setLayout(null);
		add(btnExit);
		
		JButton btnPlay = new JButton("Play");
		btnPlay.setFont(new Font("Viner Hand ITC", Font.BOLD, 17));
		btnPlay.setBounds(115, 34, 118, 60);
		btnPlay.addActionListener(new ActionListener() 
		{
			public void actionPerformed(ActionEvent e) 
			{
				// tu bedzie implementacja menu z textfieldem do wpisania IP gracza z ktorym bedzie prowadzona rozgrywka
			}
		});
		btnPlay.setForeground(new Color(139, 0, 139));
		add(btnPlay);
		
		JButton btnInformations = new JButton("Informations");
		btnInformations.addActionListener(new ActionListener() // --------------------------------------------- information button
		{
			public void actionPerformed(ActionEvent arg0)
			{
				informationPanel.setVisible(true);
				repaint();
			}
		});
		btnInformations.setFont(new Font("Viner Hand ITC", Font.BOLD, 11));
		btnInformations.setBounds(115, 140, 118, 60);
		btnInformations.setForeground(new Color(72, 209, 204));
		add(btnInformations);
		
		JLabel lblNewLabel = new JLabel("TheShips");
		lblNewLabel.setIcon(new ImageIcon("C:\\Users\\Power\\Desktop\\ship.jpg"));
		lblNewLabel.setBounds(0, 0, 800, 600);
		add(lblNewLabel);

	}
}

InformationPanel

package game;

import javax.swing.JPanel;

public class InformationPanel extends JPanel
{

	/**
	 * Create the panel.
	 */
	public InformationPanel()
	{
		
		JLabel lblNewLabel = new JLabel("The Ships - Informations");
		lblNewLabel.setIcon(new ImageIcon("C:\\Users\\Power\\Desktop\\information.jpg"));
		add(lblNewLabel);
		
	}

}

Frame

package game;

import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Frame extends JFrame
{
	public Frame()
	{
		super("The Ships - Menu");
		JPanel menuPanel = new MenuPanel();
		JPanel informationPanel = new InformationPanel();
		setPreferredSize(new Dimension(800, 600));
		add(informationPanel);
		add(menuPanel);
		
		pack();
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setVisible(true);
		
	}
}

Klasa Run wyglada standardowo. EventQueue,newRunnable,new Frame();

0

Drobna uwaga.

lblNewLabel.setIcon(new ImageIcon("C:\\Users\\Power\\Desktop\\information.jpg"));

Ten kod jest zupełnie nieprzenośny, ścieżka do pliku graficznego powinna być względna.
Poniższy kod nie dodaje do okna dwóch paneli, drugi panel (menuPanel) zastępuje pierwszy.

add(informationPanel);
add(menuPanel);

Podmiana panelu powinna wyglądać jakoś tak:

remove(menuPanel);
add(informationPanel);
validate();
repaint();
0

Kolego, doskonale wiem, że ze wzgledu na sciezke jest nieprznesnosny(jest podczas wyboru ikony opcja ktora powiadamia, zeby nie uzywac tego w finalnej aplikacji, tylko testowej) tak więc spokojnie :). Czyli add(panel) dodaje dokladnie jeden panel, a kolejne wywolanai add po prostu podmieniaja. Okej, teraz jak sie dokladnie odwolac do klasy ramki(frame.add)(frame.remove) zeby po kolei podczas checi podmiany panelu wywolac metody remove,add,validate oraz repaint. nie wystarczy chyba stworzyc w klasie panelu instancji klasy frame i uzyc fram. add remove itd. Dodatkowo mam pytanie. czy aby uzyc repaint(); musze meic w klasie ramki zaimplementowana przeciazona metode paintComponent()? moze to byc trywialne pytanie, ale wybaczcie, nie zglebialem sie zbytnio w rysowanie prymitywow(moze powinienem) :). Pozdrawiam! :)

0
  1. Nie musisz nigdzie pisać metody paintComponent.
  2. Wyjaśnienie co do metody add (zmieniłem nazwe klasy, Frame to nazwa klasy opisującej okno ze standardowej biblioteki javy):
import java.awt.Dimension; 
import javax.swing.JFrame;
import javax.swing.JPanel;
 
public class Ramka extends JFrame
{
    JPanel menuPanel = new MenuPanel(this);
    JPanel informationPanel = new InformationPanel();
    public Ramka()
    {
        super("The Ships - Menu");        
        setPreferredSize(new Dimension(800, 600));
        add(informationPanel);
        add(menuPanel);
 
        pack();
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
 
    }
}

Przy takim kodzie w klasie Ramka działa domyślny dla niej menadżer rozkładu BorderLyout. Funkcja add wymaga w nim dwóch argumentów: add(komponent,gdzie), gdzie ma pięć mozliwych wartości: u góry, na dole, po lewej, po prawej, w środku. Jeśli drugi argument nie zostanie podany, to przyjmowana jest wartość domyślna (w środku). Przy dwóch kolejnych wywołaniach z tym samym drugim argumentem, komponent z pierwszego wywołania jest zastępowany tym z drugiego.
3. Zmiany konieczne w klasie Ramka są wyżej. W klasie menuPanel:

    public MenuPanel(Ramka parent)
    {
        ...
        final Ramka ramka = parent;
        btnInformations.addActionListener(new ActionListener() // --------------------------------------------- information button
        {
            public void actionPerformed(ActionEvent arg0)
            {
                ramka.remove(ramka.menuPanel); 
                ramka.add(ramka.informationPanel);
                ramka.validate();
                ramka.repaint();
            }
        });

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