Portal > Foren > Java > Desktop-Applikationen und Grafik > jPanel nach bestätigen eines dialoges wechseln
Antwort
 
Themen-Optionen Thema durchsuchen
Alt 17.04.2006, 10:39 Nach oben    #1
Benutzer
 
Registriert seit: 30.11.2005
Beiträge: 42
Standard jPanel nach bestätigen eines dialoges wechseln

hallo,

ich habe wieder ein Problem mit dem Wechseln eines jPanel.

ausgangszustand:
ein jPanel wird angezeigt, der User tätigt Eingabe in ein jTextField und bestätigt seine Eingabe mittels jButton.

Nach bestätigen wird die Eingabe des Users auf Richtigkeit geprüft und abhängig davon ob die Antwort richtig oder falsch ist wird ein Dialog angezeigt.

Angenommen der User hat die richtige Antwort gegeben:
ein Dialog "Ihre Antwort ist richtig!" erscheint. Der User bestätigt den Dialog mit einem jButton "weiter" --> hier soll jetzt ein neues jPanel angezeigt werden --> dies funktioniert aber aus irgendwelchen Gründen nicht. Es wird keine Fehlermeldung angezeigt, es wird nur das jPanel nicht gewechselt.

Kann mir bitte jemand weiter helfen! Ich habe jetzt schon Tage lang rum probiert, aber es funktioniert nicht. Vielleicht sehe ich den Fehler nicht, oder es kann nicht funktionieren so wie ich das mache.

Ich habe folgende Klassen:
Klasse Haupt: quasi meine Hauptklasse
Klasse Kapitel: hier prüfe ich die Eingabe des Users auf Richtigkeit und rufe dann die Klasse RightDialog auf.
Klasse RightDialog: verantwortlich für zeigen des Dialoges


Auszug aus der Klasse Kapitel:
(jButton5 ist der Button für die Bestätigung der gegebenen Antwort)

Code:
jButton5.addMouseListener(new java.awt.event.MouseListener() {
               public void mousePressed(java.awt.event.MouseEvent e) {
                   eingabe = jEditorPane1.getText();
                   if (eingabe.equals("5")) {                                   
                       RightDialog rdi = new RightDialog(wert);    
                       rdi.setVisible(true);
                          }
                   else {
                       FalseDialog fdial = new FalseDialog();
                       fdial.setVisible(true);
                   }  
                }
Klasse RightDialog:
Code:
public class RightDialog extends JDialog  {
    
    private static final long serialVersionUID = -4159846805776933650L;
    
    JButton jButton10 = new JButton();
    
    private boolean weiter = false;
    private int dwert;
    
    public RightDialog(int wert) { 
        super(); 
        this.setModal(true);
        this.setBounds(250,240,300,120);
        dwert = wert;
        
        JPanel jPanel2 = new JPanel();
        jPanel2.setLayout(null);
        jPanel2.setBackground(new java.awt.Color(208, 207, 207));
        
        JLabel label = new JLabel();
        label.setText("Ihre Antwort ist richtig!");
        label.setBounds(67,15,165,22);
        label.setFont(new java.awt.Font("Verdana", java.awt.Font.BOLD, 12));
        label.setForeground(new java.awt.Color(0,115,86));
        
        jButton10.setText("weiter");
        jButton10.setBounds(110,45,80,26);
        jButton10.setFont(new java.awt.Font("Verdana", java.awt.Font.BOLD, 12));
        jButton10.addActionListener(rightDialog);
        jPanel2.add(jButton10);
        jPanel2.add(label);
        
        add(jPanel2);     
    }
    
    ActionListener rightDialog = new ActionListener() {
        public void actionPerformed(ActionEvent event) {
            if(event.getSource() == jButton10) {
                Haupt haupt = new Haupt(dwert);
                weiter = true;
                dispose();
            }
        }
    };
}

Auszug aus der Klasse Haupt.
Code:
int flag = 2;   
    
    public Haupt() {
        super();
        initialize();
        this.content = this.getContentPane();
        updateStart(jPanelStart());    
    }
    
    public Haupt(int dwert) {
        this.content = this.getContentPane();
        flag = dwert + 1;
        setFlag(flag);
        updateDialog(dwert);
    }
    
    private void initialize() {
        this.setBounds(0, 0, 800, 600);
        this.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
        this.setResizable(true);
        this.setTitle("Test");
        this.setBackground(Color.yellow);
    }
    
    private void updateStart(JPanel panel) {
        content.setLayout(null);
        content.add(panel);
        warten();
    }
    
    public void updateGui(JPanel panel, JPanel navigationsleiste) {
        content.removeAll();
        content.setLayout(null);
        content.add(getLogo());
        content.add(panel);
        content.add(navigationsleiste);
        content.repaint();
    }
    
    private void warten() {
        timer = new Timer( 1000, new ActionListener() {
              public void actionPerformed( ActionEvent e ) {
                  kap = new Kapitel1();
                  updateGui(kap.jp(flag), getNavigationsleiste());
                  timer.stop();
              }
            });
        timer.start();
    }
    
    public void updateDialog(int wert) {
        System.out.println("in updateDialog");
        if(wert >=1 && wert <=81) {  
            kap = new Kapitel1();
            if(wert!=3) {
                System.out.println("in if flag != 3");
                updateGui(kap.jp(wert), getNavigationsleiste2());
            }
        }
    }
Durch Haupt haupt = new Haupt(dwert); wird ja der dementsprechende Konstruktor aufgerufen. Hier rufe ich dann updateDialog auf. In dieser Funktion rufe ich dann updateGui(kap.jp(wert), getNavigationsleiste2()); auf. Und jetzt sollte eigentlich das neue jPanel angezeigt werden. Tut es aber nicht.
risa ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.04.2006, 13:01 Nach oben    #2
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.129
Standard

Ruf mal invalidate auf. Aber ich schätze es wird im Endeffekt daran liegen, dass du das Null-Layout einsetzt. Das macht nur ärger.
pago ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.04.2006, 14:08 Nach oben    #3
Benutzer
 
Registriert seit: 30.11.2005
Beiträge: 42
Standard

hallo,

das wechseln des panels funktioniert ja grundsätzlich. es funktioniert nur dann nicht, wenn ich aus dem dialog komme!
risa ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.04.2006, 18:15 Nach oben    #4
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.129
Standard

Oh. Das könnte vielleicht daran liegen, dass du es nicht änderst. bzw. du erzeugst ein neues "Haupt"-Objekt und arbeitest dann damit weiter. Das kann so nichts werden.
Du musst dem Dialog das ursprüngliche Haupt-Objekt übergeben, damit er das ändern kann.
pago ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.04.2006, 18:54 Nach oben    #5
Benutzer
 
Registriert seit: 30.11.2005
Beiträge: 42
Standard

hallo,

das habe ich jetzt hingekriegt, dafür hat sich ein neues problem geöffnet:

die unterschiedlichen jPanel stehen in der Klasse Kapitel.
in der Klasse Haupt hole ich mir ein jPanel und zeige es an.

die jPanel enthalten aber auch ein bzw. mehrere jTextField, in die der User eine Eingabe tätigt. Wie komme ich jetzt zur Eingabe des Users, wenn er den Button geklickt hat? Der ok button wird erst in der klasse haupt hinzugefügt und da ist auch der listener.
risa ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.04.2006, 19:46 Nach oben    #6
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.129
Standard

Dafür gibts mehrere Möglichkeiten.

Ich würde folgende bevorzugen: Du erzeugst Unterklassen von JPanel, die getter-Methoden für die Textfelder haben.
Dann kannst du von der Button-Methode auf diese Textfelder zugreifen und deren Inhalt verarbeiten.
pago ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.04.2006, 19:53 Nach oben    #7
Benutzer
 
Registriert seit: 30.11.2005
Beiträge: 42
Standard

hallo,

wie geht das?
risa ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.04.2006, 20:02 Nach oben    #8
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.129
Standard

Code:
public class MyPanel extends JPanel {
    private JTextField user;
    public MyPanel() {
        super();
        user = new JTextField();

        // add to this panel
    }

    public JTextField getUserField() {
        return user;
    }
}
In der Anwendung:
Code:
if(panel instanceof MyPanel) {
    JTextField userField = ((MyPanel)panel).getUserField();
}
pago ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.04.2006, 20:22 Nach oben    #9
Benutzer
 
Registriert seit: 30.11.2005
Beiträge: 42
Standard

hilf mir bitte mal auf die sprünge.

ersetzt dies jetzt mein bisheriges jTextField?

statt:
Code:
JTextField jEditorPane1 = new JTextField();
            jEditorPane1.setBounds(new java.awt.Rectangle(493, 250, 50, 23));
            jEditorPane1.setFont(new java.awt.Font("Verdana", java.awt.Font.BOLD, 14));
            jEditorPane1.setBorder(javax.swing.BorderFactory.createLineBorder(java.awt.Color.black, 1));
dies:
Code:
MyPanel mp = new MyPanel();
jpanel.add(mp);
was meinst du mit // add to this panel ??
risa ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.04.2006, 20:33 Nach oben    #10
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.129
Standard

Du hast doch verschiedene JPanel, die Textfelder enthalten sollen, richtig?
Jedes dieser JPanel behandelst du wie eine ganz normale Klasse. Du kannst der die Textfelder usw. zuweisen.

Mit dem "// add to this panel" meinte ich sowas:
Code:
setLayout(new GridBagLayout());
EGBConstraints c = new EGBConstraints(); // forensuche benutzen
c.installHorizontalGap(this, "pref, 5, pref");
add(new JLabel("Username:"), c.xy(1,1));
add(user, c.xy(1,3));
Dein bisheriges Textfeld müsste das nicht ersetzen, sondern nur die, die du später hinzufügst.

Außerdem solltest du dich wirklich mit LayoutManagern befassen. Das Null-Layout ist absolut miserabel und fehleranfällig.
pago ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.04.2006, 20:51 Nach oben    #11
Benutzer
 
Registriert seit: 30.11.2005
Beiträge: 42
Standard

hallo,

ja, ich verwende verschiedene jPanel die kein, - ein bzw. mehrere jTextField enthalten.

diese jPanel hole ich mir über eine Methode aus der Klasse Kapitel.
zB:

Code:
 
public class Kapitel1 {
    
    public JPanel jp(int var) {
        final int flag = var;
        jpan = new JPanel();
    
    if(var == 8){
            JLabel jLabel = new JLabel();
            jLabel.setBounds(new java.awt.Rectangle(0, 15, 767, 38));
            jLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
            jLabel.setFont(new java.awt.Font("Verdana", java.awt.Font.BOLD, 24));
            jLabel.setText("Wiederholung - YYYY");
            
            JPanel jPanel1 = new JPanel();
            jPanel1.setLayout(null);
            jPanel1.setBounds(new java.awt.Rectangle(15, -1, 767, 62));
            jPanel1.setBorder(javax.swing.BorderFactory.createMatteBorder(0, 0, 2, 0, java.awt.Color.black));
            jPanel1.setBackground(new java.awt.Color(208, 207, 207));
            jPanel1.add(jLabel, null);

            JTextPane jTextPane = new JTextPane();
            jTextPane.setBounds(new java.awt.Rectangle(30, 250, 453, 23));
            jTextPane.setBackground(new java.awt.Color(208, 207, 207));
            jTextPane.setFont(new java.awt.Font("Verdana", java.awt.Font.BOLD, 14));
            jTextPane.setDisabledTextColor(new java.awt.Color(51, 51, 51));
            jTextPane.setEnabled(false);
            jTextPane.setText("Über wieviele XXXX verfügt die YYYY? (Ergänzen Sie)");

            JTextField jEditorPane1 = new JTextField();
            jEditorPane1.setBounds(new java.awt.Rectangle(493, 250, 50, 23));
            jEditorPane1.setFont(new java.awt.Font("Verdana", java.awt.Font.BOLD, 14));
            jEditorPane1.setBorder(javax.swing.BorderFactory.createLineBorder(java.awt.Color.black, 1));

            jpan.setBackground(new java.awt.Color(208, 207, 207));
            jpan.setLayout(null);
            jpan.setEnabled(false);
            jpan.add(jLabel);
            jpan.add(jPanel1);
            jpan.add(jTextPane);
            jpan.add(jEditorPane1);
            jpan.setLocation(new java.awt.Point(0,0));
            jpan.setSize(new java.awt.Dimension(794,496)); 
        }
return jpan;
}
Hier habe ich zB ein jTextField.

Diesem jpan wird in der Klasse Haupt ein JButton hinzugefügt:

Code:
private JButton getJButtonOk() {
        jButtonOk = new JButton();
        jButtonOk.setLocation(new java.awt.Point(717, 86));
        jButtonOk.setIcon(new ImageIcon(getClass().getResource("/logo_button/okverwendet.png")));
        jButtonOk.setPreferredSize(new java.awt.Dimension(50, 45));
        jButtonOk.setSize(new java.awt.Dimension(50, 45));
        jButtonOk.addActionListener(dialogListener);
        return jButtonOk;
    }
mit diesem ActionListener (dialogListener

Code:
ActionListener dialogListener = new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            UIManager.getLookAndFeelDefaults().put("Button.font", new Font("Verdana", Font.BOLD, 12));
            UIManager.getLookAndFeelDefaults().put("Label.font", new Font("Verdana", Font.BOLD, 12));
            UIManager.getLookAndFeelDefaults().put("OptionPane.background", new java.awt.Color(208, 207, 207));
            UIManager.getLookAndFeelDefaults().put("Panel.background", new java.awt.Color(208, 207, 207));
            
            if ( ?????? ) {
            int a = JOptionPane.showOptionDialog(null,"Ihre Antwort ist richtig!",null,JOptionPane.DEFAULT_OPTION,JOptionPane.INFORMATION_MESSAGE,null,weiter,null);

            if (a == 0) {
                System.out.println("weiter gewählt");
                flag = flag + 1;
                updateGui(kap.jp(flag), getNavigationsleiste2()); }
            else if (a == JOptionPane.CLOSED_OPTION)
                System.out.println("User hat Fenster geschlossen!");
            else
                System.out.println("Unbekannter Fehler");
            }
            else {
                int a = JOptionPane.showOptionDialog(null,"Ihre Antwort ist falsch!",null,JOptionPane.DEFAULT_OPTION,JOptionPane.QUESTION_MESSAGE,null,option,null);
                  switch (a)
                  {
                  case 0: System.out.println("neuer Versuch gewählt");
                  break;
                  case 1: System.out.println("Antwort zeigen gewählt");
                  break;
                  case 2: System.out.println("Weiter gewählt");
                  break;
                  case JOptionPane.CLOSED_OPTION: System.out.println("User hat Fenster geschlossen!");
                  break;
                  default: System.out.println("Unbekannter Fehler");
                  }
            }
        }
    };
hier gebe ich derzeit nur auf der Konsole aus, da ich die Eingabe des Users noch nicht rauskriege!

ich füge später keine textfields mehr hinzu.

ich will die eingabe haben, die in jEditorPane1 eingegeben wurde!

ich habe ca. 100 Panels, hier kann ich keinen "gescheiten" layout-manager verwenden, da alles sehr, sehr unterschiedlich ist.

Geändert von risa (17.04.2006 um 20:59 Uhr)
risa ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.04.2006, 21:39 Nach oben    #12
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.129
Standard

Oh je... dein Problem ist ganz eindeutig, dass du viel zu unsauber arbeitest - auf die API bezogen. Tu dir selbst den Gefallen und beschäftige dich mit demnächst mal mit "Design Patterns" (ich empfehle "Head First: Design Patterns") und API-Design im Allgemeinen. Sieh dir andere (gut geschriebene) Programme an und schau, wie die das machen. Sonst wirst du immer wieder solche Probleme haben, wirklich. Das bringts so nicht.

Bzgl. Null-Layout: Du kannst auch jedem JPanel einen eigenen LayoutManager zuweisen. Und wenn dir der Layout-Kram zu kompliziert ist, dann verwende einfach NetBeans. Das hat nen sehr guten GUI-Builder, mit dem du gute Ergebnisse erzielen kannst und ist sehr leicht zu benutzen, wirklich.

Das war jetzt gut gemeinte Kritik und ich hoffe, dass dir das ein bisschen weiter hilft. Es ist also wirklich nicht böse gemeint - falls das trotzdem so rüberkam.

Hast du so'n bisschen Ahnung von UML? Dann könnte ich dir dazu mal ein Beispiel-Diagramm malen.

In diesem Fall sieht es aber so aus, als ob es möglich wäre, dem Kapitel1 das JTextField als Attribut zuzuweisen und dann darüber darauf zuzugreifen. Das wäre jedenfalls die in diesem Falle einfachste Lösung...
pago ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 17.04.2006, 21:50 Nach oben    #13
Benutzer
 
Registriert seit: 30.11.2005
Beiträge: 42
Standard

danke für deine guten ratschläge.

ich habe leider derzeit keine zeit dazu. das semester geht dem ende zu und wir haben es NIE gelernt!!!!
risa ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 18.04.2006, 20:55 Nach oben    #14
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.129
Standard

Kannst du mit dem letzten Tipp zur Lösung was anfangen oder soll ich das weiter ausführen?
pago ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 18.04.2006, 21:02 Nach oben    #15
Benutzer
 
Registriert seit: 30.11.2005
Beiträge: 42
Standard

hallo,

danke, das problem hat sich gelöst.
risa ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
PingBacks sind an
RefBacks sind aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Grösse des JFrames and JPanel anpassen alekz Desktop-Applikationen und Grafik 1 15.05.2006 14:52
jPanel nach verzögerung wechseln risa Desktop-Applikationen und Grafik 2 15.04.2006 13:17
JPanel am82 Desktop-Applikationen und Grafik 6 02.12.2005 17:02
JPanel in JFrame ersetzen muge Desktop-Applikationen und Grafik 2 24.11.2005 22:18
JTabbedPanel & JPanel - Probleme mit dem Layout Tactive Desktop-Applikationen und Grafik 8 24.02.2005 15:27


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:46 Uhr.


Powered by vBulletin® Version 3.7.4 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45