# Swing, Datenformate und wie geht der Datentransfer?



## raptorrs (19. Jun 2006)

Guten Tag zusammen,

ich bin sehr frisch in der JAVA Scene und beschäftige mich zur Zeit mit Swing.

Da habe ich grundsätzliche Probleme.

1) ist das Datenformat, in dem Werte in eine Eingabemaske einzugeben sind, frei definierbar oder ist alles -String-??

Wenn alles -String- ist, könnte ich ja grundsätzlich Zahlenwerte casten. Was aber, wenn in Feld, das eine Zahlenangabe benötigt, ein Wert vom Typ -char- oder -String- eingegeben wird? Da nützt dann auch Casten nichts, oder?

2) Ich lese nun schon seit Tagen viele schlaue Bücher über Swing. In allen steht, wie so ein Window gestaltet wird. Das kriege ich ja auch hin. Aber wie geschieht der Datentransfer?

Ich habe ein Eingabe-Window kreiert, welches Zwei Felder jTextField1 und jTextfield2 hat. Jedes Feld hat einen "Input" Button.
Auf Mausclick hin sollen die beiden Zahlen in einer Klasse "Berechnung" addiert werden und das Ergebnis soll in einem Feld Ergebnis wieder im Eingabe-Window erscheinen.

Besteht die Möglichkeit, dass jemand den erforderlichen Code schreiben könnte, damit ich (und wahrscheinlich viele andere auch) einmal sehen könnte, wie das Datenhandling überhaupt geschieht?!?!?

Ich danke schon Mal im Voraus für Eure Hilfe

Schöne Grüsse 

raptorrs


----------



## André Uhres (19. Jun 2006)

1. Man kann bei einem Textfeld ein Dokument setzen (setDocument) das nur die gewünschten Werte annimmt.
2. Die Parameterübergabe ist eher ein allgemeines Thema als spezifisch Swing. 
Zwischen den Klassen gibt's die Möglichkeit über öffentliche get.. und set.. -Methoden Informationen auszutauschen.
Das sollte eigentlich von den Standard Java Methoden hinlänglich bekannt sein:
JTextField#getText(), JTextField#setText(..), ...


----------



## André Uhres (20. Jun 2006)

raptorrs hat gesagt.:
			
		

> ..Besteht die Möglichkeit, dass jemand den erforderlichen Code schreiben könnte..




```
/*
 * Swing_Demo.java
 */
//package schnipsel3;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;
public class Swing_Demo extends JFrame {
    public Swing_Demo() {
        super("Swing Demo");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400, 300);
        setResizable(false);
        setLocationRelativeTo(null);
        toolbar = new JToolBar();
        btRechnen = new JButton();
        mainPanel = new JPanel();
        label1 = new JLabel();
        zahl1 = new JTextField();
        label2 = new JLabel();
        zahl2 = new JTextField();
        resultat = new JLabel();
        btRechnen.setText("Addieren");
        toolbar.add(btRechnen);
        getContentPane().add(toolbar, BorderLayout.NORTH);
        label1.setText("Zahl 1: ");
        mainPanel.add(label1);
        zahl1.setColumns(12);
        zahl1.setDocument(new NurInteger(8));
        zahl1.setText("0");
        mainPanel.add(zahl1);
        label2.setText("    Zahl 2:");
        mainPanel.add(label2);
        zahl2.setColumns(12);
        zahl2.setDocument(new NurInteger(8));
        zahl2.setText("0");
        mainPanel.add(zahl2);
        resultat.setPreferredSize(new Dimension(350, 25));
        mainPanel.add(resultat);
        getContentPane().add(mainPanel, BorderLayout.CENTER);
        btRechnen.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                btRechnenActionPerformed(evt);
            }
        });
    }
    private void btRechnenActionPerformed(ActionEvent evt) {
        Berechnung b = new Berechnung(Integer.parseInt(zahl1.getText()), Integer.parseInt(zahl2.getText()));
        resultat.setText("Resultat: "+b.getResultat());
    }
    public static void main(String args[]) {new Swing_Demo().setVisible(true);}
    private JButton btRechnen;
    private JLabel label1, label2, resultat;
    private JPanel mainPanel;
    private JToolBar toolbar;
    private JTextField zahl1, zahl2;
}
class NurInteger extends DefaultStyledDocument {
    public NurInteger(int maxChars) {
        maxCharacters = maxChars;
    }
    public void insertString(int offs, String str, AttributeSet a)
    throws BadLocationException {
        int len = getLength() + str.length();
        if(len <= maxCharacters && str.matches("[\\d]*"))
            super.insertString(offs, str, a);
        else
            Toolkit.getDefaultToolkit().beep();
    }
    private int maxCharacters;
}
class Berechnung{
    private int z1, z2;
    public Berechnung(int z1, int z2){
        this.z1 = z1;
        this.z2 = z2;
    }
    public int getResultat(){
        return z1 + z2;
    }
}
```


----------



## raptorrs (20. Jun 2006)

Mein Gott,

das ist mehr als ich erwarten konnte!! Das wird mir sicher helfen!!

Sollte ich jemals wieder nach Luxemburg kommen, gebe ich selbstverständlich einen aus!!!

Vielen Dank, Andre'


----------



## raptorrs (21. Jun 2006)

Hallo mal wieder!

Ich trauen mich kaum zu fragen, aber es muss dennoch sein:

in Line 63:              public void insertString(int offs, String str, AttributeSet a) 

1) was heisst offs in dieser Zeile?

2)Wo ist das AttributeSet a definiert worden? Ich finde nirgendwo die Attribute, die sich hierin verstecken.

und zum schluss 

aus Line 66:   

  if(len <= maxCharacters && str.matches("[\\d]*")) </p>

Was verbirgt sich hinter diesem Ausdruck? Kann mir keinen Reim darauf machen

Schon mal wieder herzlichen Dank im Voraus!


Schöne Grüsse aus Norddeutschland

raptorrs


----------



## André Uhres (21. Jun 2006)

offs = die Position (offset) im Dokument wo der Inhalt eingefügt wird
AttributeSet = Inhaltsattribute oder null wenn keine da sind
str.matches("[\\d]*") --> stimmt überein mit dem angegeben regulären Ausdruck:
[\d]*  --> nur Ziffern (digits)


----------



## raptorrs (22. Jun 2006)

Hi Andre',

ich leider weiterfragen   

1)     Welche Attribute sind denn in diesem Attributeset a gesetzt?

Sind die in Deinem Code so geschickt definiert worden, dass mir die Definition entgangen ist oder ist das ein Standard-Attribute.set? Man tut sich natürlich leichter, wenn man weiss, was drin ist in den Attributen.


2) 

    [\d]*  </p> --> nur Ziffern (digits) OK

Aber wofür steht das zweite \ in Deinem Code?

Kann man durch Folgendes auch beispielsweise einen Punkt oder ein Minus zulassen? 





 str.matches("[\\d+"-" +"."]*")</p> ??? Wahrscheinlich zu einfach, oder?



Schöne Grüsse

raptorrs


----------



## André Uhres (22. Jun 2006)

Beim Attributeset würde ich mich nicht aufhalten, ist hier eh null. Das zweite \ ist für Java, der will die doppelt.
Floatzahlen mit Vorzeichen: "[-+]?\\b[0-9]*\\.?[0-9]+\\b" (s.a. FAQ JTextField)


----------



## raptorrs (22. Jun 2006)

Vielen Dank, Andre`,

wie immer erschöpfend beantwortet!

gruss

raptorrs


----------

