Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Problem mit JFrame Steuerung bzw. mit JPanel Steuerung

Empfohlene Antworten

Veröffentlicht

Hi,

ich versuche bzw. ich muss ein kleines Javaproggie schreiben, leider hört es bei dem Umgang mit GUI bei meinen leider eher wenigen Kenntnissen auf.

Folgendes Problem.

Ich erstelle mir einen JFrame in dem ich per Klick auf Buttons immer das aussehen wechseln möchte, bzw. immer ein anderes Panel anzeigen.

Leider fällt mir keine andere Möglichkeit ein, vielleicht bin ich da auch völlig auf dem Holzweg.

Ich finde einfach keine Möglichkeit, wie ich das Aussehen zum jewaligen Punkt anpassen kann. Es wäre schön, wenn Ihr mir da vielleicht einen Tipp bzw. einen Ansatz geben könntet.

Hier mal mein Programm Code. Mehr habe ich leider noch nicht.


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class FVS
extends JFrame
implements ActionListener

{
public FVS()
{
super("FVS Arneburg");
addWindowListener(new WindowClosingAdapter(true));

initContent();
}

private void initContent()
{
/* Panel 1 */
Container guiMenu = getContentPane();
guiMenu.setLayout(new GridLayout());
/* Menu Panel */
JPanel menu = new JPanel();
//Ueberschrift
headerMenu = new JLabel("FFW Arneburg");
menu.add(headerMenu);
//Button Einsaetze
button_einsaetze = new javax.swing.JButton("Einsaetze");
button_einsaetze.addActionListener(this);
menu.add(button_einsaetze);
//Button Mitglieder
button_mitglieder = new javax.swing.JButton("Mitglieder");
button_mitglieder.addActionListener(this);
menu.add(button_mitglieder);
//Button Exit
button_exit = new javax.swing.JButton("Exit");
button_exit.addActionListener(this);
menu.add(button_exit);
//Bild
wappen = new JLabel("",new ImageIcon("arneburg.gif"),JLabel.CENTER);
menu.add(wappen);
guiMenu.add(menu);

/* Panel 2 */
Container guiMitglieder = getContentPane();
guiMitglieder.setLayout(new GridLayout());
/* Mitglieder Panel */
JPanel mitglieder = new JPanel();
//Ueberschrift
headerMitglieder = new JLabel("FFW Arneburg Mitglieder");
mitglieder.add(headerMitglieder);
guiMitglieder.add(mitglieder);
}


public void actionPerformed(ActionEvent event)
{
Object src = event.getSource();
if (src == button_exit)
{
System.exit(0);
}

}

public static void main(String[] args)
{
FVS index = new FVS();
index.setLocation(200, 200);
index.setSize(480, 320);
index.setVisible(true);
}

//Variablendeklaration
private javax.swing.JButton button_einsaetze;
private javax.swing.JButton button_mitglieder;
private javax.swing.JButton button_exit;
private JLabel headerMenu;
private JLabel wappen;
private JLabel headerMitglieder;
}
[/PHP]

Beim Klick auf den Button Mitglieder soll zB das Panel mitglieder zu sehen sein und der Rest ausgeblendet werden.

***greetz Empu

Was spricht dagegen?


public void actionPerformed(ActionEvent event)
{
Object src = event.getSource();
if (src == button_exit)
{
System.exit(0);
}
else if (src == button_mitglieder)
{
mitglieder.setVisible(true);
allesAndere.setVisible(false);
}
}
[/PHP]

Oder hab' ich was falsch verstanden?


if (src == button_exit) {
System.exit(0);
}
else if (src == button_mitglieder)
{
[/php]

Wenn ich sowas sehe, bekomme ich nen ganz dicken Hals und mir rollen sich die Fussnägel hoch... :eek

Seit wann werden denn Objekte mit "[b]==[/b]" abgefragt?? Nimmt man dafür nicht ".equals(Object o)"??

Also... abändern.... :rolleyes:

Wenn ich sowas sehe, bekomme ich nen ganz dicken Hals und mir rollen sich die Fussnägel hoch... :eek

Seit wann werden denn Objekte mit "[b]==[/b]" abgefragt?? Nimmt man dafür nicht ".equals(Object o)"??

Er holt sich das Source Object des Events und vergleicht das mit dem Button der die ActionEvents empfängt, was spricht dagegen? Es ist nun mal ein und dasselbe Object und somit kann er auch == verwenden.

Also erst lesen und dann brüllen. ;)

Zum Problem, du setzt 2 mal etwas aufs contentpane, damit erstezt du das eine Panel. Du musst die Panels auf contentpane erst setzen wenn jeweils das event kommt. Alle anderen Panels hälst erst einmal so in einer Variable.

Gruß Jaraz

Wenn ich sowas sehe, bekomme ich nen ganz dicken Hals und mir rollen sich die Fussnägel hoch... [...] Seit wann werden denn Objekte mit "==" abgefragt?? [...] Also... abändern.
Warum? Es ist komplett falsch zu sagen, ich darf Objekte nie mit == vergleichen. Richtig ist, dass es häufig so ist, dass equals die richtige Art zu Vergleichen ist (und Newbies gerne den == Vergleich nehmen und sich wundern, wieso nicht das gewünschte Ergebnis rauskommt), aber auch ein direkter Referenz-Vergleich kann hier und da angebracht sein.

Es macht durchaus Sinn zu fragen

"Ist x1 dasselbe Objekt wie x2?"

(Vergleich durch ==)

anstatt

"Ist x1 inhaltlich gleich mit x2"

(Vergleich über equals)

In dem Beispiel hier ist das sicherlich eine mögliche herangehensweise, auch wenn ich es für sinnvoller halte jede Art von Aktion, die über einen JButton getriggert wird in eine eigene Action Klasse laufen zu lassen.

Nichtsdestotrotz ist die pauschale Aussage == == böse Quatsch.

Hallo,

vielen Dank...Es funzt jetzt so, wie ich es mir vorgestellt habe. Außer dass ich noch nen bissel mit dem LayoutManager basteln muss.

@ Jarez

Vielen Dank für die Idee, dank intensiver Googlesuche konnte ich es umsetzen, hoffe ich *gg*

Dank eines Tutoren von mir bin ich dann auch auf die "Endlösung" gekommen. Ich möchte diese hier einfach mal posten, vlt hilft es ja einem anderen suchenden.


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class FVS
extends JFrame
implements ActionListener

{
public FVS()
{
super("FVS - FFW Arneburg");
addWindowListener(new WindowClosingAdapter(true));

initContent(1);
}

private void initContent(int panel)
{
setLayout(new GridLayout());
/* Menu */
JPanel menu = new JPanel();
menu.setLayout(new FlowLayout());
//Ueberschrift
headerMenu = new JLabel("FFW Arneburg");
headerMenu.setFont(new Font("Utopia",3,16));
//Button Einsaetze
button_einsaetze = new javax.swing.JButton("Einsaetze");
button_einsaetze.addActionListener(this);
menu.add(button_einsaetze);
//Button Mitglieder
button_mitglieder = new javax.swing.JButton("Mitglieder");
button_mitglieder.addActionListener(this);
menu.add(button_mitglieder);
//Button Exit
button_exit = new javax.swing.JButton("Exit");
button_exit.addActionListener(this);
menu.add(button_exit);

/* Panel 1 */
/* Startbild Panel */
JPanel start = new JPanel();
start.setLayout(new FlowLayout());
wappen = new JLabel("",new ImageIcon("arneburg.gif"),JLabel.CENTER);
start.add(wappen);

/* Panel 2 */
/* Einsaetze Panel */
JPanel einsaetze = new JPanel();
einsaetze.setLayout(new FlowLayout());
//Ueberschrift
headerEinsaetze = new JLabel("FFW Arneburg Einsaetze");
headerEinsaetze.setFont(new Font("Utopia",3,16));
einsaetze.add(headerEinsaetze);

/* Panel 3 */
/* Mitglieder Panel */
JPanel mitglieder = new JPanel();
mitglieder.setLayout(new FlowLayout());
//Ueberschrift
headerMitglieder = new JLabel("FFW Arneburg Mitglieder");
headerMitglieder.setFont(new Font("Utopia",3,16));
mitglieder.add(headerMitglieder);

/* Panel 4 */
/* Neue Mitglieder Panel */
JPanel neueMitglieder = new JPanel();
neueMitglieder.setLayout(new GridLayout(13, 2));
//headerNeueMitglieder = new JLabel("Neues Mitglied");
//neueMitglieder.add(headerNeueMitglieder);
//headerNeueMitglieder.setFont(new Font("Utopia",3,16));
lvorname = new JLabel("Vorname");
neueMitglieder.add(lvorname);
tvorname = new JTextField(10);
neueMitglieder.add(tvorname);
lname = new JLabel("Name");
neueMitglieder.add(lname);
tname = new JTextField(10);
neueMitglieder.add(tname);
lstrasse = new JLabel("Strasse Nr.");
neueMitglieder.add(lstrasse);
tstrasse = new JTextField(10);
neueMitglieder.add(tstrasse);
lplz = new JLabel("PLZ");
neueMitglieder.add(lplz);
tplz = new JTextField(10);
neueMitglieder.add(tplz);
lort = new JLabel("Ort");
neueMitglieder.add(lort);
tort = new JTextField(10);
neueMitglieder.add(tort);
lposition = new JLabel("Position"); //Dienstgrad
neueMitglieder.add(lposition);
tposition = new JTextField(10);
neueMitglieder.add(tposition);
lurlaub = new JLabel("Urlaubstage");
neueMitglieder.add(lurlaub);
turlaub = new JTextField(10);
neueMitglieder.add(turlaub);

/* Abfrage Panelausgabe */
if(panel == 1)
{
getContentPane().removeAll();
add(menu);
add(start);
}
if(panel == 2)
{
getContentPane().removeAll();
add(menu);
add(einsaetze);

}
if(panel == 3)
{
getContentPane().removeAll();
add(menu);
add(mitglieder);
add(neueMitglieder);
}
setVisible(true);
}

public void actionPerformed(ActionEvent event)
{
Object src = event.getSource();
if (src == button_einsaetze)
{
System.out.println("Klick Einsaetze");
initContent(2);
}
if (src == button_mitglieder)
{
System.out.println("Klick Mitglieder");
initContent(3);
}
if (src == button_exit)
{
System.out.println("Klick Exit");
System.exit(0);
}
}

public static void main(String[] args)
{
FVS index = new FVS();
index.setLocation(200, 200);
index.setSize(640, 480);
index.setVisible(true);
}

//Variablendeklaration
private javax.swing.JButton button_einsaetze, button_mitglieder, button_exit;
private JLabel headerMenu, headerEinsaetze, headerMitglieder, headerNeueMitglieder, wappen;
private JLabel lname, lvorname, lstrasse, lplz, lort, lposition, lurlaub;
private JTextField tname, tvorname, tstrasse, tplz, tort, tposition, turlaub;

}
[/PHP]

Mit Hilfe des ActionListener und der kleinen Abfrage kann ich die JPanels nun steuern.

[b] getContentPane().removeAll();[/b] hat mir am meisten kopfzerbrechen bereitet, da der Inhalt beim mehrmaligen Aufruf immer noch erhalten bleibt, damit wird der Container erstmal gelöscht und dann werden die Inhalte neu eingefügt.

***greetz Empu

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.