Portal > Foren > Java > Desktop-Applikationen und Grafik > Dialog-Eingabe überprüfen: Fehlerhandhabung
Antwort
 
Themen-Optionen Thema durchsuchen
Alt 09.03.2006, 10:23 Nach oben    #1
Benutzer
 
Registriert seit: 05.12.2005
Beiträge: 62
Standard Dialog-Eingabe überprüfen: Fehlerhandhabung

Hi,

ich möchte folgendes realisieren:
Durch ein Event (z. B. Button-Klick) wird ein Dialog aufgerufen, der bestimmte Eingaben vom User erwartet. Dieser Dialog muss für meine Bedürfnisse aber selbst erstellt sein, also keiner der Standard Dialoge, die JOptionPane mit seinen statischen showXXXDialog-Methoden liefert.
Gibt der User einen korrekten Wert ein und klickt auf OK, schließt sich der Dialog und alles ist okay. Klickt er auf Cancel, ist auch alles in Ordnung. Der Fall, dass eine falsche Eingabe getätigt wurde, ist hier im besonderen zu betrachten. Es poppt ein (diesmal gerne Standard-)Dialog mit dem Hinweis auf den Fehler auf. Mir gehts hierbei aber nicht um den Fehler, sondern um das Verhalten meines eigenen Dialogs, während der Fehlerhinweis angezeigt wird. Ich hätte gerne, dass mein Dialog immernoch (hinter dem Fehlerhinweis) sichtbar bleibt. Bisher hab ichs aber nur geschafft, dass der Dialog verschwindet, während der Fehlerhinweis sichtbar ist, und nach klick auf OK des Fehlerhinweises, mein Dialog wieder sichtbar wird (durch die boolesche Variable closeDialog und der while-Schleife in den Zeilen 51 und 52. Hätte es aber gerne, dass mein Dialog bleibt...
Um euch das "Problem" mal zu verdeutlichen, führt einfach mal diesen Code aus:
Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class AFrame extends JFrame implements ActionListener {

    public AFrame() {
        super("Example");
        initComponents();
    }
    
    protected void initComponents() {
        JPanel p = new JPanel();
        p.setLayout(new BorderLayout());
        JButton b = new JButton("click me to show dialog");
        b.addActionListener(this);
        b.setPreferredSize(new Dimension(500,300));
        p.add(b, BorderLayout.CENTER);
        this.setContentPane(p);
    }
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
    
    public static void createAndShowGUI() {
        JFrame.setDefaultLookAndFeelDecorated(true);
        JDialog.setDefaultLookAndFeelDecorated(true);
        
        AFrame f = new AFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.pack();
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        f.setLocation(
                ((int)(screenSize.width/2-f.getSize().width/2)),
                ((int)(screenSize.height/2-f.getSize().height/2)));
        f.setVisible(true);
    }

    public void actionPerformed(ActionEvent e) {
        final ADialogPanel pnl = new ADialogPanel();
        final JOptionPane op = new JOptionPane(
                pnl, 
                JOptionPane.PLAIN_MESSAGE, 
                JOptionPane.OK_CANCEL_OPTION);

        boolean closeDialog = false;
        while(!closeDialog) {
            final JDialog dia = op.createDialog(AFrame.this, "Insert integer number");
            dia.show();
            int value = ((Integer)op.getValue()).intValue();
            if(value == JOptionPane.OK_OPTION) {
                System.out.println("OK clicked");
                try {
                    pnl.check();
                    System.out.println(pnl.getNumber().toString());
                    closeDialog=true;
                }
                catch(IllegalArgumentException iae) {
                    JOptionPane.showMessageDialog(
                            AFrame.this, 
                            "'"+pnl.getTextField().getText()+"' is not an integer number", 
                            "Error", 
                            JOptionPane.ERROR_MESSAGE);
                    
                }
            }
            else if(value == JOptionPane.CANCEL_OPTION) {
                System.out.println("CANCEL clicked");
                closeDialog=true;
            }
        }
    }
    
    class ADialogPanel extends JPanel {
        private Integer number;
        private JLabel lbl;
        private JTextField tf;
        public ADialogPanel() {
            super();
            this.setLayout(new GridLayout(2,1));
            initComponents();
        }
        protected void initComponents() {
            this.setPreferredSize(new Dimension(300,200));
            tf = new JTextField(5);
            lbl = new JLabel("insert integer number");
            this.add(lbl);
            this.add(tf);
        }
        
        public void check() throws IllegalArgumentException {
            this.number = new Integer(Integer.parseInt(this.tf.getText()));
        }
        
        public Integer getNumber() {
            return this.number;
        }
        
        public JTextField getTextField() {
            return this.tf;
        }
    }
}
Habt ihr da eine Idee, wie ich das realisiert bekomme? BTW: mag ja sein, dass das für dieses Thema wichtig ist: ich benutze noch die 1.4.2_10

Thx in advance
sayang
Sayang 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 09.03.2006, 10:31 Nach oben    #2
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.135
Standard

Magst du dir vielleicht mal meine PgsBindings-Bibliothek anschauen?

Das ist zwar nicht direkt für dein _aktuelles_ Problem geeignet, aber damit ist es verdammt einfach, dem Benutzer direkt anzuzeigen, dass er etwas falsches eingegeben hat (inkl. Text).

Edit: Hier mal ein Beispiel, wie das Ergebnis aussehen könnte:

Geändert von pago (09.03.2006 um 10:35 Uhr)
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 09.03.2006, 10:59 Nach oben    #3
Benutzer
 
Registriert seit: 05.12.2005
Beiträge: 62
Standard

Hi pago,

danke für den Tipp. Aber für diese Anwendung finde ich diese "Art" von Fehlermeldung ehrlich gesagt nicht sehr geeignet. Da ich auch schon sehr weit fortgeschritten bin mit der Anwendung hätte ich die Befürchtung, dass es im Endeffekt mehr Arbeit macht als Nutzen bringt Aber ich werd mir das - bzw. die ganzen Tools auf deiner Seite ^^ - wirklich mal zu herzen nehmen. Die EGBConstraints interessieren mich auch sehr (waren doch auch von dir oder?)

Lg
sayang
Sayang 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 09.03.2006, 11:24 Nach oben    #4
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.135
Standard

Hmm... eventuell klappt es, wenn du deinen Dialog nicht "modal" machst, aber ob das das ist, was du willst, weiß ich auch nicht...

Ansonsten könntest du ganz auf JOptionPane verzichten und den Dialog komplett selbst schreiben. Dann kannst du die Validierung im ActionListener des "OK"-Buttons durchführen und dort verhindern, dass der Dialog versteckt wird.


Oh... und bzgl. "viel Arbeit":
Code:
SwingBinder binder = new SwingBinder(new Properties());
binder.bind("", tf, "\\d+");
VisualValidationUtils.setErrorMessage(tf, "Only integer values are allowed");
binder.update();
Käme direkt nach "tf = new JTextField(5);"

Genau genommen musst du da aber auch den Dialog selbst basteln.

Hier gibts ne Klasse, die dir dabei einige Arbeit abnehmen könnte (StandardDialog, oder so).
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 10.03.2006, 07:42 Nach oben    #5
Benutzer
 
Registriert seit: 05.12.2005
Beiträge: 62
Standard

Ne. der Dialog müsste schon modal sein. Ich habs jetzt erstmal in diese Schleife gepackt, die den Dialog wenigstens wieder aufpoppen lässt, nachdem die Fehlermeldung geschlossen wurde... Dadurch dass der Content Pane des Dialogs ja außerhalb der Schleife erzeugt wird, bleiben die gemachten Eingaben ja auch erhalten.

Ich treff mich gleich mit meinem Prof, der auch ziemlich fit in java ist und frage den mal, ob er dazu ne idee hat.

Vielen Dank
Sayang
Sayang 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 10.03.2006, 13:14 Nach oben    #6
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.135
Standard

Zitat:
Ansonsten könntest du ganz auf JOptionPane verzichten und den Dialog komplett selbst schreiben. Dann kannst du die Validierung im ActionListener des "OK"-Buttons durchführen und dort verhindern, dass der Dialog versteckt wird.
Den Teil hast du gelesen gehabt?
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 10.03.2006, 13:41 Nach oben    #7
Benutzer
 
Registriert seit: 05.12.2005
Beiträge: 62
Standard

Ja hehe... aber ich hatte noch nicht wirklich zeit, mich der sache zu widmen. Daher habichs erstmal schnell mit dieser Schleife gelöst... Meinst du mit "den Dialog selbst schreiben" auch das Nutzen eines JDialogs oder eher das anzeigen eines neuen Frames, der quasi als Dialog dienen soll?

Kenne nämlich bisher nur die Variante wo der JOptionPane mit einspielt (mit createDialog - glaubich, kann grad nicht nachgucken)

Lg
sayang
Sayang 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 10.03.2006, 15:02 Nach oben    #8
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.135
Standard

Du musst eigentlich nur ne Klasse von JDialog erben lassen und da deine Buttons drauf pappen und wenn der Dialog verschwinden soll, rufst du "dispose" auf.
Mit dem JDialog an sich gehst du um, wie mit nem JFrame. Kein Unterschied, außer, dass du den JDialog modal machen kannst.
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 10.03.2006, 17:53 Nach oben    #9
Benutzer
 
Registriert seit: 05.12.2005
Beiträge: 62
Standard

Vielen Dank. Das klingt doch eigentlich schon so einfach, dass ich mich doch irgendwie schäme, dass ich da nicht schon drauf gekommen bin :/
Wird gleich morgen ausprobiert. Werde dann natürlich auch berichten ^^

Lg und ein schönes Wochenende
sayang
Sayang 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
Einen Dialog mit Escape disposen Sayang Desktop-Applikationen und Grafik 3 18.04.2006 11:28
Passwort während der Eingabe verbergen - wie? eugenet Allgemeine Java-Programmierung 6 21.12.2005 20:21
Eingabe Prüfung jjulie Allgemeine Java-Programmierung 2 17.01.2005 09:40
JTextField auf Eingabe überprüfen klappt nicht Javaner No.1 Desktop-Applikationen und Grafik 3 09.01.2005 12:30


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:59 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