Tak jakby aplikacja z dwoma oknami w JFrame

0

Cześć, ostatnio zacząłem się uczyć javy i tworze programik gui z użyciem JFrame. Chciałem zrobić coś takiego że jak nacisne przycisk to żeby zniknęło wszystko co jest aktualnie w oknie (JButton i JLabel) i żeby pokazało inne przyciski, tak żeby wszystko ciągle było w jednym oknie. Mój kod wygląda tak:

package gui;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

import app.Exit;
import app.Logger;

public class MainMenu extends JFrame implements ActionListener{
	
	// Create objects
	public static Logger log = new Logger();
	
	// Buttons declaration
	JButton bExit, bStartBot, bOptions, bAboutLikeplusBot, bChangelog;
	
	// Label declaration
	JLabel lLogo;
	
	public MainMenu() throws IOException {
		
		// Set window size
		log.AddToLog("Set window size", "JFrame", "INFO");
		setSize(800, 500);
		
		// Disable window resizable
		log.AddToLog("Disable window resizable", "JFrame", "INFO");
		setResizable(false);
		
		// Set window title
		log.AddToLog("Set window title", "JFrame", "INFO");
		setTitle("LikeplusBot");
		
		// Set layout
		log.AddToLog("Set layout", "JFrame", "INFO");
		setLayout(null);
		
		// Add Exit button
		log.AddToLog("Add Exit button", "JFrame/JButton", "INFO");
		bExit = new JButton("Exit");
		bExit.setBounds(610, 365, 160, 70);
		add(bExit);
		bExit.addActionListener(this);
		
		// Add Start bot button
		log.AddToLog("Add Start bot button", "JFrame/JButton", "INFO");
		bStartBot = new JButton("Start bot");
		bStartBot.setBounds(610, 25, 160, 70);
		add(bStartBot);
		bStartBot.addActionListener(this);
		
		// Add Options button
		log.AddToLog("Add Options button", "JFrame/JButton", "INFO");
		bOptions = new JButton("Options");
		bOptions.setBounds(610, 110, 160, 70);
		add(bOptions);
		bOptions.addActionListener(this);
		
		// Add About LikeplusBot button
		log.AddToLog("Add About LikeplusBot button", "JFrame/JButton", "INFO");
		bAboutLikeplusBot = new JButton("About LikeplusBot");
		bAboutLikeplusBot.setBounds(610, 195, 160, 70);
		add(bAboutLikeplusBot);
		bAboutLikeplusBot.addActionListener(this);
		
		// TO JEST PRZYCISK PO KTÓREGO NACIŚNIĘCIU MAJĄ SIĘ WYŚWIETLIĆ INNE PRZYCISKI ----------------------------------------------------------------------------------------------------
		// Add Changelog button
		log.AddToLog("Add Changelog button", "JFrame/JButton", "INFO");
		bChangelog = new JButton("Changelog");
		bChangelog.setBounds(610, 280, 160, 70);
		add(bChangelog);
		bChangelog.addActionListener(this);
		
		// Add logo photo
		log.AddToLog("Add logo photo", "JFrame/JLabel", "INFO");
		ImageIcon icon = new ImageIcon(MainMenu.class.getResource("/resources/LPB_300x300.png"));
		lLogo = new JLabel();
		lLogo.setBounds(120, 20, 400, 400);
		lLogo.setIcon(icon);
		add(lLogo);
		
	}
	
	/*
	 * Show window
	 */
	public static void main(String[] args) throws IOException {
		
		// Create object
		MainMenu window = new MainMenu();
		
		// Chose default close operation
		log.AddToLog("Set default close operation", "JFrame", "INFO");
		window.setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		// Set window visible
		log.AddToLog("Set window visible", "JFrame", "INFO");
		window.setVisible(true);
		
		// Set window icon
		log.AddToLog("Set window icon", "JFrame", "INFO");
		ImageIcon img = new ImageIcon(MainMenu.class.getResource("/resources/WindowIcon_32x32.png"));
		window.setIconImage(img.getImage());
		
	}
	
	/*
	 * What is to be done after pressing the button
	 */
	@Override
	public void actionPerformed(ActionEvent e) {
		
		Object source = e.getSource();
		
		// Exit button
		if (source==bExit) {
			
			try {
				log.AddToLog("Exit button clicked", "ActionListener", "INFO");
			} catch (IOException e2) {
				e2.printStackTrace();
			}
			Exit exit = new Exit();
			try {
				exit.Exit();
			} catch (IOException e1) {
				e1.printStackTrace();
			}
			
		}
		
		// Start bot button
		if (source==bStartBot) {
			
			try {
				log.AddToLog("Start bot button clicked", "ActionListener", "INFO");
			} catch (IOException e1) {
				e1.printStackTrace();
			}
			
		}
		
		// Options button
		if (source==bOptions) {
			
			try {
				log.AddToLog("Options button clicked", "ActionListener", "INFO");
			} catch (IOException e1) {
				e1.printStackTrace();
			}
					
		}
		
		// About LikeplusBot button
		if (source==bAboutLikeplusBot) {
			
			try {
				log.AddToLog("About LikeplusBot button clicked", "ActionListener", "INFO");
			} catch (IOException e1) {
				e1.printStackTrace();
			}
			
		}
		
		// TO SIE WYKONUJE PO NACIŚNIĘCIU TEGO PRZYCISKU ------------------------------------------------------------------------------------------------------------------------------------------------------
		// Changelog button
		if (source==bChangelog) {
			
			try {
				log.AddToLog("Changelog button clicked", "ActionListener", "INFO");
			} catch (IOException e1) {
				e1.printStackTrace();
			}
			
			Changelog changelog = new Changelog();
			
			// I CHCE ŻEBY W TEJ METODZIE KTÓRA TUTAJ JEST WYWOŁYWANA POKAZYWAŁ NOWE PRZYCISKI W OKNIE ---------------------------------------------------------------------
			try {
				changelog.Changelog();
			} catch (IOException e1) {
				e1.printStackTrace();
			}
		}
		
	}

}

Mam nadzieje że da sie coś z tego zrozumieć :)

1

public class MainMenu extends JFrame implements ActionListener{

bChangelog.addActionListener(this);

Bóg zabija małego kotka za każdym razem jak tak robisz. Masz jakiś limit na liczbę klas które wolno ci zdefiniować w projekcie? o_O Jak już bardzo musisz to zrób tam addActionListener(new ActionListener... i zrób anonimowego, jeśli jest bardzo mały. Ale w 99% przypadków lepiej zrobić nową klasę implementujacą ActionListener i zrobić addActionListener(new MojaNowaKlasa... i tyle.

if (source==bExit) {

aaaa dramat. Znowu, masz limit na te klasy? Czemu nie zrobisz jak normalny człowiek OSOBNEGO listenera do każdego buttona tylko robisz jakis mother of all listeners a w nim drabinka ifów.

Wracając do meritum: zrób dwa okienka i pokazuj jedno albo drugie? Serio, jakieś zabawy w usuwanie i dodawanie komponentów nie mają sensu. Ale mimo wszystko nikt ci nie broni, przecież masz dostęp do tego JFrame, możesz wywalić wszystko z niego i dodać nowe rzeczy, w ten sam sposób w jaki dodajesz je na początku. Gdzie jest problem?

0

@Shalom jak zwykle ma racje. Takie drabinki ifów w listenerach są złe. Problem polaga na tym że tak uczyli w starych materialach do Springa. Tylko że ponad 10 lat temu już bylo to uważane za przestarzałe i błędne. I na praktykach dostałem opierdziel za cos takiego. Oczywiscie mój wykladowca z Javy nie widział w tych drabinkach nic złego

0
Shalom napisał(a):

public class MainMenu extends JFrame implements ActionListener{

bChangelog.addActionListener(this);

Bóg zabija małego kotka za każdym razem jak tak robisz. Masz jakiś limit na liczbę klas które wolno ci zdefiniować w projekcie? o_O Jak już bardzo musisz to zrób tam addActionListener(new ActionListener... i zrób anonimowego, jeśli jest bardzo mały. Ale w 99% przypadków lepiej zrobić nową klasę implementujacą ActionListener i zrobić addActionListener(new MojaNowaKlasa... i tyle.

if (source==bExit) {

aaaa dramat. Znowu, masz limit na te klasy? Czemu nie zrobisz jak normalny człowiek OSOBNEGO listenera do każdego buttona tylko robisz jakis mother of all listeners a w nim drabinka ifów.

Wracając do meritum: zrób dwa okienka i pokazuj jedno albo drugie? Serio, jakieś zabawy w usuwanie i dodawanie komponentów nie mają sensu. Ale mimo wszystko nikt ci nie broni, przecież masz dostęp do tego JFrame, możesz wywalić wszystko z niego i dodać nowe rzeczy, w ten sam sposób w jaki dodajesz je na początku. Gdzie jest problem?

Jak robie dwa okienka i pierwsze usuwam i tworzę drugie to widać to przejście między oknami i jest to brzydkie, dlatego tak tego nie robie. Problem jest taki że nie chcę mieć wszystkiego w jednej klasie bo niedałoby sie tam nic znaleźć potem, dlatego chcę zrobić tak że jak przycisk zostanie naciśnięty to usuwa wszystko co sie znajduje w oknie i wywołuje metode z innej klasy która wyświetla nowe rzeczy (np. JButton, JLabel).

1

Zapoznaj się proszę z CardLayout. Służy dokładnie do tego, co potrzebujesz
https://docs.oracle.com/javase/tutorial/uiswing/layout/card.html

W tutorialu masz listę rozwijalną, która ci zmienia widoki, ale równie dobrze może być cokolwiek - na przykład przycisk

1

Ja bym nic nie usuwał tylko np. pokazywał/chował jakis JPanel, albo uzywał jakiegoś tabbedpane

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