Erweiterung eines Formulars nach drücken auf Button

Hey ich komm bei der Aufgabe leider nicht mehr weiter:

Die Aufgabe:
Erstellen sie ein OO-Projekt ,Projekt_Kopierer", mit dem das Kopieren mit einer Kopier-
karte „simuliert“ werden soll.
Nach Eingabe der korrekten (nicht sichtbaren) Pin-Nummer(123) erweitert sich das Formular. Wenn der Falsche Pin eingegeben wurde soll eine Fehlermeldung in einem Fenster ausgegeben werden.
Der Benutzer erhält eine Information über den aktuellen Kontostand und kann nun die Anzahl der gewünschten Kopien eintragenn.
Nach dem Klick auf Kopieren wird der Kontostand aktualisiert.
Es muss verhindert werden, dass die gewünschte Kopienanzahl den aktuellen Kontostand übersteigt.

Ich komm nur noch nicht mit dem erweitern klar,
hab schon n Panel auf dem ich die Sachen draufgepackt hab, die dann erscheinen sollen,
aber ich krieg es nicht hin es unsichtbar und nach dem bestätigen sichtbar zu machen.

Meine Codes:


package paket_Kopierer;
import javax.swing.JOptionPane;
public class Kopierkarte 
{
    private String pin;
    private double stand;
    
    public Kopierkarte()
    {
        pin="123";
        stand=100;
    }
    
    public void setPin(String pPin)
    {
        pin=pPin;
    }
    public String getPin()
    {
        return pin;
    }
    public void setStand(double pStand)
    {
        stand=pStand;
    }
    public double getStand()
    {
        return stand;
    }
    public void bestätigen(String pfPinNummer)
    {
        pfPinNummer=pin;
    }
    public void mindern(int pMinderung)
    {
        if (stand-pMinderung >= 0)
        {
            stand=stand-pMinderung;
        }
        else
        {
            JOptionPane.showMessageDialog(null,"Nicht genügend Kopien vorhanden!!!");
        }    
    }
}


package paket_Kopierer;

public class Startklasse 
{
    public static void main(String[] args)
    {
        Fenster fenster1;
        fenster1=new Fenster();        
        fenster1.setVisible(true);
        
    }
    
}


package paket_Kopierer;

import java.awt.BorderLayout;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JTextPane;
import javax.swing.JTextField;
import javax.swing.JTable;
import javax.swing.JList;
import java.awt.Rectangle;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.JTextArea;
import java.text.*;
import javax.swing.JCheckBox;
import javax.swing.JPasswordField;
import java.awt.Dimension;
import javax.swing.JInternalFrame;
import javax.swing.JSplitPane;
import javax.swing.JWindow;
import java.awt.GridBagLayout;
import java.awt.GridLayout;

public class Fenster extends JFrame
{
    private static final long serialVersionUID = 1L;
    private JPanel jContentPane = null;
    private JLabel lbPinNummer = null;
    private JLabel lbBestätigen = null;
    private JTextField tfKontostand = null;
    private JButton btEnde = null;
    private JButton btKopieren = null;
    private JLabel lbKontostand = null;
    private JTextField tfKopien = null;
    private Kopierkarte karte1;
    private JButton btBestätigen = null;
    private JPasswordField pfPinNummer1 = null;
    private JLabel lbAnzahlKopien = null;
    private JPanel plErweiterung = null;
    
    public Fenster()
    {
        super();
        initialize();
        karte1=new Kopierkarte();        
    }
    
    private void initialize()
    {
        this.setSize(450, 400);
        this.setContentPane(getJContentPane());
        this.setTitle("Kopierer ohne DB");
    }
    
    
    
    private JPanel getJContentPane()
    {
        if (jContentPane == null)
        {
            lbAnzahlKopien = new JLabel();
            lbAnzahlKopien.setText("Anzahl Kopien:");
            lbAnzahlKopien.setBounds(new Rectangle(20, 50, 150, 25));
            lbKontostand = new JLabel();
            lbKontostand.setText("aktueller Kontostand:");
            lbKontostand.setBounds(new Rectangle(20, 10, 150, 25));
            lbBestätigen = new JLabel();
            lbBestätigen.setBounds(new Rectangle(20, 60, 150, 25));
            lbBestätigen.setText("Pin-Nummer bestätigen:");
            lbPinNummer = new JLabel();
            lbPinNummer.setBounds(new Rectangle(20, 20, 100, 25));
            lbPinNummer.setText("Pin-Nummer:");
            jContentPane = new JPanel();
            jContentPane.setLayout(null);
            jContentPane.add(lbPinNummer, null);
            jContentPane.add(lbBestätigen, null);
            jContentPane.add(getBtEnde(), null);
            jContentPane.add(getBtBestätigen(), null);
            jContentPane.add(getPfPinNummer1(), null);
            jContentPane.add(getPlErweiterung(), null);
        }
        return jContentPane;
    }
    
    private JTextField getTfKontostand()
    {
        if (tfKontostand == null)
        {
            tfKontostand = new JTextField();
            tfKontostand.setEditable(false);
            tfKontostand.setBounds(new Rectangle(190, 10, 100, 25));
            tfKontostand.addActionListener(new java.awt.event.ActionListener()
            {
                public void actionPerformed(java.awt.event.ActionEvent e)
                {
                    tfKontostand.equals(karte1.getStand());
                }
            });
        }
        return tfKontostand;
    }
    
    private JButton getBtEnde()
    {
        if (btEnde == null)
        {
            btEnde = new JButton();
            btEnde.setBounds(new Rectangle(190, 180, 100, 25));
            btEnde.setText("Ende");
            btEnde.addActionListener(new java.awt.event.ActionListener()
            {
                public void actionPerformed(java.awt.event.ActionEvent e)
                {
                    System.exit(0);
                }
            });
        }
        return btEnde;
    }
    
    private JButton getBtKopieren()
    {
        if (btKopieren == null)
        {
            btKopieren = new JButton();
            btKopieren.setText("Kopieren");
            btKopieren.setBounds(new Rectangle(20, 95, 100, 25));
            btKopieren.addActionListener(new java.awt.event.ActionListener()
            {
                public void actionPerformed(java.awt.event.ActionEvent e)
                {
                    karte1.mindern(Integer.parseInt(tfKopien.getText()));
                    zeigen();
                }
            });
        }
        return btKopieren;
    }
    
    private JTextField getTfKopien()
    {
        if (tfKopien == null)
        {
            tfKopien = new JTextField();
            tfKopien.setBounds(new Rectangle(190, 50, 100, 25));
        }
        return tfKopien;
    }
    
    private JButton getBtBestätigen() {
        if (btBestätigen == null ) {
            btBestätigen = new JButton();
            btBestätigen.setBounds(new Rectangle(190, 60, 100, 25));
            btBestätigen.setText("Bestätigen");
            btBestätigen.addActionListener(new java.awt.event.ActionListener()
            {
                public void actionPerformed(java.awt.event.ActionEvent e)
                {    
                     JPasswordField a = getPfPinNummer1();
                     String b = karte1.getPin();  
                     String password=new String(a.getPassword());
                    if (b.equals(password))
                    {
                        zeigen();
                    }
                    else
                    {
                        JOptionPane.showMessageDialog(null,"Falsche Pin-Nummer");
                    }
                }
            });
            
        }
        return btBestätigen;
    }
    
    private JPasswordField getPfPinNummer1()
    {
        if (pfPinNummer1 == null)
        {
            pfPinNummer1 = new JPasswordField();
            pfPinNummer1.setBounds(new Rectangle(188, 16, 101, 32));
        }
        return pfPinNummer1;
    }
    
    public void zeigen()
    {
        tfKontostand.setText(Double.toString(karte1.getStand()));
    }
    private JPanel getPlErweiterung()
    {
        if (plErweiterung == null)
        {
            plErweiterung = new JPanel();
            plErweiterung.setLayout(null);
            plErweiterung.setBounds(new Rectangle(0, 85, 430, 120));
            plErweiterung.add(getBtKopieren(), null);
            plErweiterung.add(lbAnzahlKopien, null);
            plErweiterung.add(lbKontostand, null);
            plErweiterung.add(getTfKopien(), null);
            plErweiterung.add(getTfKontostand(), null);
            
            
        }
        return plErweiterung;
    }

}

ich hoffe da kann mir einer helfen :smiley:

Eine Anfrage in mehreren Teilforen bringt dich nicht weiter. Das Andere hab ich gelöscht.

Hat wirklich keiner ne Antwort hierauf? :confused:

Am einfachsten durch

    public void zeigen()
    {
        tfKontostand.setText(Double.toString(karte1.getStand()));
        plErweiterung.setVisible(true); //----------------------------- das hier
    }
    private JPanel getPlErweiterung()
    {
        if (plErweiterung == null)
        {
            plErweiterung = new JPanel();
            plErweiterung.setLayout(null);
            plErweiterung.setBounds(new Rectangle(0, 85, 430, 120));
            plErweiterung.add(getBtKopieren(), null);
            plErweiterung.add(lbAnzahlKopien, null);
            plErweiterung.add(lbKontostand, null);
            plErweiterung.add(getTfKopien(), null);
            plErweiterung.add(getTfKontostand(), null);
            plErweiterung.setVisible(false);  //----------------------------- und das hier

        }
        return plErweiterung;
    }

Wenn man das ganze von Hand schreiben würde, würde man ein paar Details wohl anders machen, aber für den im GUI-Builder vorgenerierten Code ist das wohl die einfachste Art, das gewünschte Verhalten zu erreichen.

ah :smiley:

ich hätt da aber noch ne Frage, ich hab gehört das dies auch mit validate()
und reprint möglich ist.
Wär dies dann umständlich oder besser?

Das hat damit nur indirekt zu tun. Eigentlich muss man validate()/repaint() verwenden, wenn man neue Components zu einem Container hinzufügt (oder welche entfernt) - das dient aber in erster Linie dem Zweck, dem LayoutManager bescheid zu sagen: “Hey, da hat sich was geändert, aktualisier’ das ganze mal”.

In diesem Fall wird ja überall das null-Layout verwendet (was eigentlich nicht so schön ist, aber… ist halt so), und das eigentliche Problem war ja, dass die Erweiterung von vornherein vorhanden und sichtbar war. Jetzt ist es von vernherein vorhanden, aber eben anfangs nicht sichtbar.

Wenn man das ganze per Hand schreiben würde, würde man die Erweiterung wohl als eigenes Panel machen, per Hand nach dem Buttonklick hinzufügen, und DANN würde man ggf. validate()/repaint() aufrufen.

Ah ok danke :smiley:

Damit wär dies beendet.