Neues Panel und Button unsichtbar

f10

Aktives Mitglied
Hallo zusammen,

ich versuche gerade eine GUI zu programmieren, die ein neues Panel aufruft, wenn ich auf einen Button klicke. In diesem Panel moechte ich dann einen Text ausgeben lassen und einen Zurueckbutton setzen.

So soll sieht die GUI aus vom Prinzip her:

8ze2d1.jpg



Wie kann ich also 1. dem Button sagen, dass wenn man ihn klickt er ein neues Panel aufrufen soll?
Ich haette irgendwie in diese Richtung gedacht, aber war anscheinend zu einfach gedacht:

Java:
public void btn_panel_ActionPerformed(ActionEvent evt) {
    Panel cp = new Panel(null);
    add(cp);
  }

edit: [EDIT]Das 2. Problem konnte ich bereits selbst loesen.

Vielen Dank fuer eure Hilfe.[/EDIT]

Gruss
f10
 

Anhänge

  • 8ze2d1.jpg
    8ze2d1.jpg
    3,7 KB · Aufrufe: 26
Zuletzt bearbeitet:
alleine die methode verrät schon das du von Frame erbst ... sollte man nicht tun ... und auch das du awt nutzt ... sollte man auch nur tun wenn unbedingt nötig ... ansonsten lieber swing ...

noch dazu : alles was GUI verändert im EDT ... nicht selbst dran rum basteln ...

und dann müsstest du das Frame auch mal updaten damit das neue Panel überhaupt angezeigt wird ...


sind alles grundlagen von GUI ... und die solltest du dir mal angucken ... denn es steht alles im netz
 
versuch mal nach den adden ein validate() und/oder repaint() aufzurufen...

Auch damit funktioniert es noch nicht.

Praktisches Beispiel:

Ich moechte einen Adventskalender programmieren, jedes mal wenn man ein Tuerchen oeffnet, soll sich ein neues Panel oeffnen, aber man soll auch zurueckgehen koennen.
 
Der ist noch nicht wirklich umfangreich,

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

/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 28.11.2012
  * @f10
  */

public class TestAdvent extends Frame {
  // Anfang Attribute
  private JPanel pnl_hintergrund = new JPanel(null, true);
    private JLabel lbl_kat = new JLabel();
    private JButton btn_panel = new JButton();
    private JButton btn_verschwinde = new JButton();
    private JButton btn_tu = new JButton();
  // Ende Attribute

  public TestAdvent(String title) {
    // Frame-Initialisierung
    super(title);
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent evt) { dispose(); }
    });
    int frameWidth = 300; 
    int frameHeight = 300;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    setResizable(false);
    Panel cp = new Panel(null);
    add(cp);
    // Anfang Komponenten

    pnl_hintergrund.setBounds(0, 0, 305, 281);
    cp.add(pnl_hintergrund);
    lbl_kat.setBounds(64, 40, 131, 33);
    lbl_kat.setText("Text");
    pnl_hintergrund.add(lbl_kat);
    btn_panel.setBounds(64, 96, 105, 41);
    btn_panel.setText("neues Panel");
    btn_panel.setMargin(new Insets(2, 2, 2, 2));
    btn_panel.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
        btn_panel_ActionPerformed(evt);
      }
    });
    pnl_hintergrund.add(btn_panel);
    btn_verschwinde.setBounds(64, 160, 105, 41);
    btn_verschwinde.setText("unsichtbar");
    btn_verschwinde.setMargin(new Insets(2, 2, 2, 2));
    btn_verschwinde.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
        btn_verschwinde_ActionPerformed(evt);
      }
    });
    btn_verschwinde.setEnabled(false);
    pnl_hintergrund.add(btn_verschwinde);
    btn_tu.setBounds(192, 112, 73, 65);
    btn_tu.setText("tu");
    btn_tu.setMargin(new Insets(2, 2, 2, 2));
    btn_tu.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
        btn_tu_ActionPerformed(evt);
      }
    });
    pnl_hintergrund.add(btn_tu);
    // Ende Komponenten

    setVisible(true);
  }

  // Anfang Methoden
  public void btn_panel_ActionPerformed(ActionEvent evt) {
    Panel cp = new Panel(null);
    add(cp);
    validate();
  }

  public void btn_verschwinde_ActionPerformed(ActionEvent evt) {
    // TODO hier Quelltext einfügen
  }

  public void btn_tu_ActionPerformed(ActionEvent evt) {
    btn_verschwinde.setEnabled(true);

  }

  // Ende Methoden

  public static void main(String[] args) {
    new TestAdvent("TestAdvent");
  }
}

btn_panel soll eben ein neues panel aufrufen, welches ich dann mit Text und weiteren Button versehen moechte.
 
Wenn du jetzt noch bei den Action Events eine Methode aufrufst und die richtig benennst, wird klarer was du machen möchtest. Ich bitte dich, dass du auch nochmal über die Namen deiner Attribute Gedanken machst. Tu Kat und co kann ich nicht so ganz nach vollziehen.

Ansonsten bleibt dir noch übrig, dass du beschreibst was dein eigentliches Ziel ist.
z.B.

Ich möchte das mit einem Klick auf den Button X, Y nicht mehr sichtbar ist. Z soll stattdessen angezeigt werden. Hierfür soll das und das möglich sein.
usw.

Dann können wir dir sagen, dafür lohnt sich ein CardLayout, damit kannst du dies und das tun.

Java:
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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

/**
 * Beschreibung
 * 
 * @version 1.0 vom 28.11.2012
 * @f10
 */

public class TestAdvent
{
	private JPanel panelHintergrund;
	private JLabel labelKat;
	private JButton buttonPanel;
	private JButton buttonVerschwinde;
	private JButton buttonTu;

	private JFrame frame;

	public TestAdvent(String title)
	{
		frame = new JFrame();
		frame.setTitle(title);
		frame.setSize(300, 300);
		frame.setLocationRelativeTo(null);
		frame.setResizable(false);
		frame.getContentPane().setLayout(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		initUIComponents();
		configureUIComponents();
		initUIListeners();
		addUI();

		frame.setVisible(true);
	}

	private void initUIComponents()
	{
		panelHintergrund = new JPanel(null);
		labelKat = new JLabel();
		buttonPanel = new JButton();
		buttonVerschwinde = new JButton();
		buttonTu = new JButton();
	}

	private void configureUIComponents()
	{
		labelKat.setBounds(64, 40, 131, 33);
		labelKat.setText("Text");

		buttonPanel.setBounds(64, 96, 105, 41);
		buttonPanel.setText("neues Panel");
		buttonPanel.setMargin(new Insets(2, 2, 2, 2));

		buttonVerschwinde.setBounds(64, 160, 105, 41);
		buttonVerschwinde.setText("unsichtbar");
		buttonVerschwinde.setMargin(new Insets(2, 2, 2, 2));
		buttonVerschwinde.setEnabled(false);

		buttonTu.setBounds(192, 112, 73, 65);
		buttonTu.setText("tu");
		buttonTu.setMargin(new Insets(2, 2, 2, 2));

		panelHintergrund.setBounds(0, 0, 305, 281);
	}

	private void addUI()
	{
		panelHintergrund.add(labelKat);
		panelHintergrund.add(buttonPanel);
		panelHintergrund.add(buttonVerschwinde);
		panelHintergrund.add(buttonTu);
		frame.getContentPane().add(panelHintergrund);
	}

	private void initUIListeners()
	{
		buttonVerschwinde.addActionListener(new ActionListener()
		{
			@Override
			public void actionPerformed(ActionEvent evt)
			{

			}
		});

		buttonTu.addActionListener(new ActionListener()
		{
			@Override
			public void actionPerformed(ActionEvent evt)
			{

			}
		});

		buttonPanel.addActionListener(new ActionListener()
		{
			@Override
			public void actionPerformed(ActionEvent evt)
			{

			}
		});
	}

	public static void main(String[] args)
	{
		new TestAdvent("TestAdvent");
	}
}
 
Zuletzt bearbeitet:
Tu bedeutet Tu etwas und Kat steht fuer eine Kategorie. Die beiden sind ja ohne Funktion erstmal, waren nur fuer mich gedacht.

Nun passiert aber auch nichts weiter, wenn ich auf den btn_panel klicke. Hingegen soll sich ja ein neues Panel oeffnen, wobei sich mir sowieso gerade die Frage stellt, wie ich dieses dann mit der GUI designe?


edit: ich moechte, dass sich ein neues Panel oeffnet, wenn ich auf einen Button klicke. Mehr ersteinmal nicht. Auf diesem Panel will ich spaeter einen Button und Text platzieren. Wird dieser Button geklickt soll man wieder zurueckkommen ins Ursprungspanel.
 
Ich würde kein neues Panel hinzufügen, sondern den Bereich in den das Panel angezeigt werden soll von Anfang an vorbereiten.
Unter Swing (AWT habe ich schon lange nicht mehr verwendet, weiß nicht ob es da auch so einfach ist) wäre es beispielsweiße möglich, ein JScrollPane neben die "Kästchen" (Buttons) des Kalenders zu legen und dort einfach den Content anzuzeigen.
Mit einen neuen Panel wärst du dir nie sicher ob das Frame genug Platz bietet etc.
 
wenn du allen Warnungen und Tipps zu trotze es so machen willst, wie beschrieben bietet sich die removeAll-Methode an (but be careful!!!)

[JAVA=80] public void btn_panel_ActionPerformed(ActionEvent evt) {
removeAll();
Panel anotherPanel = new Panel(null);
anotherPanel.setBackground(Color.RED);
add(anotherPanel);
validate();
}[/code]
 

Zurück
Oben