JOption Pane: Sonderzeichen verbieten?

Status
Nicht offen für weitere Antworten.

TobiTobsen

Aktives Mitglied
Hi,
ich hab eine JOptionPane, genauer einen InputDialog, über dem ein Dateiname eingegben werden kann. Der Name wird dann in einem externen Gerät gespeichert samt seiner Einstellungen.
Problem ist das das Gerät keine Sonderzeichen akzeptiert. Wie kann ich nun einfach abfangen das keine Sonderzeichen eingegeben werden können?
Da gibt es doch bestimmt schon was für, oder?

Vielen Dank!
 

raptorrs

Aktives Mitglied
Du musst deinem TextField mit

Java:
JTextField.setDocument(new DocumentKlasse());

eine Formatvorlage zuweisen.

Wie man nun in der Klasse DocumentKlasse() gerade alle Sonderzeichen abfängt, würde mich selbst mal interessieren.
Ich habe es bisher so gelöst, dass ich alle Sonderzeichen in einem Array gespeichert habe und brutal nach jedem KeyTyped den eingegebenen Wert mit dem Array vergleiche. Da gibt es bestimmt elegantere Lösungen!
 

raptorrs

Aktives Mitglied
Man kann doch mit

jTextFieldInhalt.matches("[\\d]*")
Java:
jTextFieldInhalt.matches("[\\d]*")

prüfen, ob der Inhalt nur aus Zahlen besteht.

Gibt es etwas ähnliches für die Gruppe der Buchstaben oder für die Sonderzeichen?
 

raptorrs

Aktives Mitglied
Danke, Verjigorm!

somit wäre eine Lösung:

Java:
deinTextFeld.setDocument(new JustLettersAndNumbers(5)

//Separate Klasse

public class JustLettersAndNumbers extends DefaultStyledDocument 
{
    public JustLettersAndNumbers(int maxChars) 
    {
        maxCharacters = maxChars;
    }
    @Override
    public void insertString(int offs, String str, AttributeSet a)
    throws BadLocationException {
        int len = getLength() + str.length();
        if(len <= maxCharacters && str.matches("[a-zA-Z0-9]*"))
        {
            super.insertString(offs, str, a);
        }        
        else
        {
            Toolkit.getDefaultToolkit().beep();
        }
    }
    private int maxCharacters;
}
 

raptorrs

Aktives Mitglied
Ts ts,

wusste bis dato wirklich nicht, woher diese Definitionen kommen.

Wieder was gelernt :)

OK, der Code muss also lauten:

Java:
str.matches("[^\\w]*")

Nochmals Danke!
 

Verjigorm

Top Contributor
Wenn schon lernen, dann richtig:

\W (grosses W) ist die "Negation" von \w (kleines w) und umgekehrt

du negierst hier \w mit
Code:
str.matches("[^\\w]*")

Besser wäre dann:
Code:
str.matches("[\\W]*")
 

TobiTobsen

Aktives Mitglied
Wow vielen Dank für euere Antworten.

Nur wir kann ich das mit einem JOptionPane verheiraten?
Ich weiß nicht wie ich da an das Textfeld komme um den Document Typ zu setzen...
 

raptorrs

Aktives Mitglied
Tja, das ist wirklich eine gute Frage! Die konnen nur die Cracks beantworten.

Ich helfe mir mit einem selbsthebauten InputDialog.

Java:
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JFrame;
import javax.swing.JDialog; 
import javax.swing.JTextField;

public class InputDialog extends JDialog
{
    public InputDialog(JFrame frame, boolean modal) 
    {
        super(frame, modal);
        initComponents ();
        setVisible(true);        
    }

    private void initComponents() 
    {
        setSize(300, 300);
        setTitle("Gimme some Data !");
        setLayout(new GridBagLayout());
        setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
        setLocationRelativeTo(null);
        GridBagConstraints c = new GridBagConstraints();
        btn1 = new javax.swing.JButton("Input");
        btn1.setPreferredSize(new Dimension(90, 30));
        btn2 = new javax.swing.JButton("Abbruch");
        btn2.setPreferredSize(new Dimension(90, 30));
        btn1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btn1ActionPerformed(evt);
            }
        });

        btn2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btn2ActionPerformed(evt);
            }
        });
        txtField = new JTextField();
        txtField.setDocument(new JustLettersAndNumbers(5));
        txtField.setPreferredSize(new Dimension(200, 50));
        
        txtField.setHorizontalAlignment(javax.swing.JTextField.CENTER);
        c.insets = new Insets(5,5,10,5);
        c.gridwidth = 2;
        c.gridx = 0;
        c.gridy = 0;
        add(txtField,c);
        c.gridwidth = 1;
        c.weightx = 2.0;
        c.gridx = 0;
        c.gridy = 1;        
        add(btn1,c);
        c.gridwidth = 1;
        c.weightx = 2.0;
        c.gridx = 1;
        c.gridy = 1;           
        add(btn2,c);
        pack();
    }

    private void btn1ActionPerformed(java.awt.event.ActionEvent evt)                                     
    {                                         
    btn1ActionPerformed();
    }                                    

    private void btn2ActionPerformed(java.awt.event.ActionEvent evt)                                     
    {                                         
    btn2ActionPerformed();
    }                                    
    
    public void btn1ActionPerformed() 
    {       
            setValue(txtField.getText());
            dispose();
    }  
    
    public void btn2ActionPerformed() 
        {
            dispose();
        }
    
    public String getValue()
    {
        return value;
    }

    public void setValue(String value)
    {   
        this.value = value;
    }

    private javax.swing.JButton btn1;
    private javax.swing.JButton btn2;
    private javax.swing.JTextField txtField;
    private String value;
}
 

TobiTobsen

Aktives Mitglied
Danke für dein Beispiel.

Wäre halt am schicksten wenn man den JDialog da entsprechend formatieren könnte...Ansonsten werd ich es wohl selbst machen...

Grüße
 

Ebenius

Top Contributor
Hmm oke, also kann man an den JOptionPane und so nix machen. Nehmen wie sie sind oder selber bauen.
Falsch. :)

Du kannst einem JOptionPane als Message ein Object geben. Object-Arrays funktionieren auch. Zum Beispiel kann man ein JComponent-Derivat und einen Text übergeben. Ich würde es also so machen:
Java:
public class FilteredInputDialog {

  /**
   * Test main method.
   * 
   * @param args ignored
   */
  public static void main(String[] args) {
    final PlainDocument doc = new PlainDocument();
    doc.setDocumentFilter(new DocumentFilter() {

      final Matcher matcher = Pattern.compile("\\w+").matcher("");

      @Override
      public void insertString(
            FilterBypass fb,
            int offset,
            String text,
            AttributeSet attrs) throws BadLocationException {
        if (matcher.reset(text).matches()) {
          super.insertString(fb, offset, text, attrs);
        }
      }

      @Override
      public void replace(
            FilterBypass fb,
            int offset,
            int length,
            String text,
            AttributeSet attrs) throws BadLocationException {
        if (matcher.reset(text).matches()) {
          super.insertString(fb, offset, text, attrs);
        }
      }
    });

    final JTextField tf = new JTextField(doc, "", 20);
    final Object[] message = { "Bitte geben Sie den Text ein!", tf, };
    final JOptionPane pane =
          new JOptionPane(message, JOptionPane.QUESTION_MESSAGE,
                JOptionPane.OK_CANCEL_OPTION) {

            @Override
            public void selectInitialValue() {
              tf.requestFocus();
            }
          };
    final JDialog dialog = pane.createDialog("Input \\w*");
    pane.selectInitialValue();
    dialog.setVisible(true);
    dialog.dispose();

    final Object value = pane.getValue();
    if (value instanceof Integer
          && ((Integer) value).intValue() == JOptionPane.OK_OPTION) {
      System.out.println(tf.getText());
    } else {
      System.out.println("Canceled!");
    }
    System.exit(0);
  }
}
Ich verwende übrigens in allen Eingabeaufforderungen grundsätzlich JOptionPane. Dafür gibt es einige Gründe. Zum Beispiel möchter Brite OK/CANCEL gern in umgekehrter Reihenfolge sehen, die Button-Labels sind bereits in allen möglichen Sprachen vorhanden, die verschiedenen Look&Feels haben recht unterschiedliches aussehen, etc.

Ebenius
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S JOption.Pane Java Basics - Anfänger-Themen 2
S Pane nach speziellen Child Objekten durchsuchen Java Basics - Anfänger-Themen 3
W Erste Schritte Content Pane scheint zweigeteilt zu sein. Java Basics - Anfänger-Themen 1
U JavaFX eine Vbox Instanz pro Pane? Java Basics - Anfänger-Themen 2
F Content Pane / BorderLayout Java Basics - Anfänger-Themen 2
R Text Pane Aktualisierung erst nach JOptionPane Java Basics - Anfänger-Themen 10
M Tabbed Pane wechsel via HotKey Java Basics - Anfänger-Themen 10
M Tabbed Pane Java Basics - Anfänger-Themen 5
TRunKX Tabbed Pane Problem Java Basics - Anfänger-Themen 6
G HTML in Pane öffnen+anzeigen? Java Basics - Anfänger-Themen 3
Juelin Sonderzeichen wie Euro (€) Java Basics - Anfänger-Themen 4
E Umlaute und Sonderzeichen werden nach der Build Project nicht richtig angezeigt Java Basics - Anfänger-Themen 2
O Regex bei ReplaceAll ersetzt Wort und Sonderzeichen nicht. Java Basics - Anfänger-Themen 9
F Java Programm, das kleine Buchstaben in einem String zählen soll und bei großen Buchstaben oder Sonderzeichen abbrechen soll. Java Basics - Anfänger-Themen 5
K Sonderzeichen einlesen Java Basics - Anfänger-Themen 3
C Wie erkennt man Sonderzeichen im String? Java Basics - Anfänger-Themen 26
J ireport Designer / CSV / Sonderzeichen was läuft falsch Java Basics - Anfänger-Themen 7
W Methoden Konvertierung von Sonderzeichen Java Basics - Anfänger-Themen 2
S Sonderzeichen '|' (u007C) mit Scanner einlesen Java Basics - Anfänger-Themen 1
T byte[] zu String mit Sonderzeichen Java Basics - Anfänger-Themen 2
J Datentypen Cast von int zu char führ zu 'Sonderzeichen' Java Basics - Anfänger-Themen 2
B Char-Vergleich Sonderzeichen Java Basics - Anfänger-Themen 6
X String Sonderzeichen/Zahlen erkennen Java Basics - Anfänger-Themen 3
E String soll mit Großbuchstaben anfangen und keine Sonderzeichen enthalten Java Basics - Anfänger-Themen 4
M Sonderzeichen werden nicht erkannt Java Basics - Anfänger-Themen 3
A Datentypen Sonderzeichen / Strings ersetzen Java Basics - Anfänger-Themen 3
K Sonderzeichen auf der Windowskonsole ausgeben Java Basics - Anfänger-Themen 8
turmaline Ein regulärer Ausdruck für HTML-Sonderzeichen Java Basics - Anfänger-Themen 3
F Sonderzeichen bei XML Serialisierung nicht konvertieren Java Basics - Anfänger-Themen 7
S String auf Sonderzeichen untersuchen Java Basics - Anfänger-Themen 6
V Sonderzeichen als eigene "Operatoren" im JTextField Java Basics - Anfänger-Themen 4
M Sonderzeichen beim usedelimiter Java Basics - Anfänger-Themen 4
Z Sonderzeichen in einem String gezeichnen/bearbeiten Java Basics - Anfänger-Themen 6
S Sonderzeichen "§" wird nicht erkannt - Stichwort Encoding! Java Basics - Anfänger-Themen 13
S Sonderzeichen in einem String erkennen Java Basics - Anfänger-Themen 20
Benji0815 Sonderzeichen Java Basics - Anfänger-Themen 8
M Sonderzeichen in einer Datei auslesen Java Basics - Anfänger-Themen 3
G String und Sonderzeichen Java Basics - Anfänger-Themen 6
T Sonderzeichen in label Java Basics - Anfänger-Themen 4
B Exception bei ImageIO wegen sonderzeichen Java Basics - Anfänger-Themen 11
Semox Umwandlung von Sonderzeichen in HTML-Datei mit Ausgabe Java Basics - Anfänger-Themen 7
D Sonderzeichen ä,ü,ö werden als ? ausgegeben Java Basics - Anfänger-Themen 3
T Sonderzeichen Java Basics - Anfänger-Themen 2
G Sonderzeichen automatisch ändern lassen Java Basics - Anfänger-Themen 23
A XML-Datei erzeugen+Sonderzeichen erlauben Java Basics - Anfänger-Themen 10
L Sonderzeichen automatisch escapen. Java Basics - Anfänger-Themen 7
U Sonderzeichen die zweite Java Basics - Anfänger-Themen 16
H GPS über ser. Schnittst. liefert teilweise Sonderzeichen Java Basics - Anfänger-Themen 3
M RandomAccessFile schreibt Sonderzeichen vor String Java Basics - Anfänger-Themen 2
B String mit Sonderzeichen wie " oder = überprüfen Java Basics - Anfänger-Themen 2
H Datei mit Sonderzeichen Java Basics - Anfänger-Themen 8
G Newline Sonderzeichen aus File entfernen u als String speic? Java Basics - Anfänger-Themen 3
T Robot-Problem mit Sonderzeichen Java Basics - Anfänger-Themen 2
M java sonderzeichen filtern Java Basics - Anfänger-Themen 3
M Konvertierung v. Strings (evtl. mit Sonderzeichen) nach HTML Java Basics - Anfänger-Themen 8
M Char Array mit Sonderzeichen in String umwandeln Java Basics - Anfänger-Themen 21
S Umlaute und Sonderzeichen erkennen Java Basics - Anfänger-Themen 12
S HTML Sonderzeichen in Unicode wandeln Java Basics - Anfänger-Themen 5
C Sonderzeichen (ä, ö, ü) in JTextArea Java Basics - Anfänger-Themen 9
J Sonderzeichen Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben