![]() |
|
|
Themen-Optionen |
|
|
Nach oben #1 |
|
Benutzer
Registriert seit: 05.12.2005
Beiträge: 62
|
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;
}
}
}
Thx in advance sayang |
|
|
|
|
|
Nach oben #2 |
|
Projektleiter
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.091
|
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). |
|
|
|
|
|
Nach oben #3 |
|
Benutzer
Registriert seit: 05.12.2005
Beiträge: 62
|
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 Lg sayang |
|
|
|
|
|
Nach oben #4 |
|
Projektleiter
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.091
|
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();
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). |
|
|
|
|
|
Nach oben #5 |
|
Benutzer
Registriert seit: 05.12.2005
Beiträge: 62
|
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 |
|
|
|
|
|
Nach oben #6 | |
|
Projektleiter
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.091
|
Zitat:
|
|
|
|
|
|
|
Nach oben #7 |
|
Benutzer
Registriert seit: 05.12.2005
Beiträge: 62
|
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 |
|
|
|
|
|
Nach oben #8 |
|
Projektleiter
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.091
|
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. |
|
|
|
|
|
Nach oben #9 |
|
Benutzer
Registriert seit: 05.12.2005
Beiträge: 62
|
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 |
|
|
|
![]() |
| Lesezeichen |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
| Themen-Optionen | |
|
|
Ä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 |