17.2 Mehrzeilige Textfelder

Mit der Klasse JTextArea lassen sich mehrzeilige Ein- bzw. Ausgabefelder erzeugen.

Im Beispiel wird ein mehrzeiliger Text in einer JTextArea ausgegeben. Der automatische Zeilenumbruch ist aktiviert und so eingestellt, dass ein Wort, welches nicht mehr ganz in die Zeile passt, komplett in die nächste Zeile verschoben wird.

img/Abb_17_19_JTextArea.jpg
Abb. 17-19: Eine JTextArea dient als mehrzeiliges Ausgabefeld
Quellcode
JAVA
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
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JTextArea;
import java.awt.Font;

public class FensterJTextArea extends JFrame {

    private JPanel contentPane;
    private JTextArea taTestTextArea;

    public FensterJTextArea() {
        setTitle("Test JTextArea");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 321, 150);
        
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        taTestTextArea = new JTextArea();
        taTestTextArea.setFont(new Font("Tahoma", Font.PLAIN, 13));
        taTestTextArea.setBounds(25, 25, 255, 63);
        taTestTextArea.setLineWrap(true);
        taTestTextArea.setWrapStyleWord(true);
        taTestTextArea.setText("Mit der Klasse JTextArea lassen sich mehrzeilige Ein- bzw. Ausgabefelder erzeugen.");
        contentPane.add(taTestTextArea);
    }
}

Abb. 17-20: Die Klasse FensterJTextArea
Erläuterungen
Zeile 10 Unter der Bezeichnung taTestTextArea wird ein Attribut vom Typ JTextArea deklariert.
Zeile 22 Dem Attribut taTestTextArea wird ein neues Objekt der Klasse JTextArea zugewiesen.
Zeile 23 Der in taTestTextArea angezeigte Text wird in der Schriftart Tahoma, mit dem Schriftstil Font.PLAIN und der Schriftgröße 13 formatiert.
Zeile 24 Position und Größe von taTestTextArea werden festgelegt. Die linke obere Ecke von taTestTextArea hat die Koordinaten (25, 25). Seine Breite beträgt 255 und seine Höhe 63.
Zeile 25 Für taTestTextArea wird der automatische Zeilenumbruch aktiviert.
Zeile 26 Für taTestTextArea wird festgelegt, dass ein Wort, welches nicht mehr ganz in die Zeile passt, komplett in die nächste Zeile geschoben wird. Andernfalls erfolgt der Zeilenumbruch mitten im Wort.
Zeile 27 Der anzuzeigende Text wird taTestTextArea zugewiesen.
Zeile 28 taTestTextArea wird der contentPane hinzugefügt.

Soll eine JTextArea über Bildlaufleisten verfügen, muss sie in eine JScrollPane eingebettet werden.

Im Beispiel wird eine JTextArea in eine JScrollPane eingebettet. Auf diese Weise wird automatisch eine vertikale Bildlaufleiste eingeblendet, falls der in der JScrollPane enthaltene Text nicht komplett angezeigt werden kann.

img/Abb_17_21_JTextAreaInJScrollPane.jpg
Abb. 17-21: Eine JTextArea eingebettet in eine JScrollPane
Quellcode
JAVA
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
46
47
48
49
50
51
52
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class FensterJTextArea extends JFrame {

    private JPanel contentPane;
    private JTextArea taTestTextArea;

    public FensterJTextArea() {
        setTitle("Test JTextArea");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 321, 200);
        
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        taTestTextArea = new JTextArea();
        taTestTextArea.setFont(new Font("Tahoma", Font.PLAIN, 13));
        taTestTextArea.setLineWrap(true);
        taTestTextArea.setWrapStyleWord(true);
        taTestTextArea.setText("Mit der Klasse JTextArea lassen sich mehrzeilige Ein- bzw. Ausgabefelder erzeugen.");
        
        JScrollPane scrollPane = new JScrollPane();
        scrollPane.setBounds(25, 25, 255, 63);
        scrollPane.setViewportView(taTestTextArea);
        contentPane.add(scrollPane);

        JButton btAnzeige = new JButton("Anzeige");
        btAnzeige.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                anfuegen();
            }
        });
        btAnzeige.setBounds(191, 110, 89, 23);
        contentPane.add(btAnzeige);

    }
    
    private void anfuegen() {
        taTestTextArea.append("\nSoll das Eingabefeld über Bildlaufleisten verfügen, muss die JTextArea in eine JScrollPane eingebettet werden.");
        taTestTextArea.setCaretPosition(0);
    }
}

Abb. 17-22: Die Klasse FensterJTextArea
Erläuterungen
Zeile 32 Unter der Bezeichnung scrollPane wird eine lokale Variable vom Typ JScrollPane deklariert und ihr ein neu erzeugtes Objekt dieser Klasse zugewiesen.
Zeile 33 Position und Größe von scrollPane werden festgelegt. Die linke obere Ecke von scrollPane hat die Koordinaten (25, 25). Seine Breite beträgt 255 und seine Höhe 63.
Zeile 34 Bettet taTestTextArea in scrollPane ein. Auf diese Weise wird automatisch eine vertikale Bildlaufleiste eingeblendet, falls der in taTestTextArea enthaltene Text nicht komplett angezeigt werden kann.
Zeile 35 scrollPane wird der contentPane hinzugefügt.
Zeile 49 An den Text, der bisher in taTestTextArea angezeigt wird, wird der Inhalt des übergebenen Strings angefügt.
Zeile 50 Setzt die Position des Cursors an den Anfang der taTestTextArea.
Aufgabe

Aufgabe 17-3: Kapitalanlage mit fester Laufzeit (GUI)

Erstellen Sie für die in Aufgabe 14-4 erstellte Anwendung „Kapitalanlage mit fester Laufzeit“ folgende grafische Benutzeroberfläche:

img/Abb_17_23_FensterKapitalanlage.jpg
Abb. 17-23: Die GUI-Klasse FensterKapitalanlage
Vorgaben
  • Nutzen Sie hierzu die vorbereiteten Pakete. Diese enthalten die in Aufgabe 14-4 erstellte Fachklasse Kapitalanlage und die Hilfsklasse Werkzeug.
  • Verwenden Sie zur Ausgabe der Kapitalentwicklung ein Objekt der Klasse JTextArea, dessen Text mit Hilfe der Methode setEditable(b: boolean) vor Änderungen durch den Benutzer geschützt wird.
  • Richten Sie den in den Eingabefeldern angezeigten Text rechtsbündig aus. Rufen Sie dazu von jedem JTextField die Methode setHorizontalAlignment(SwingConstants.Right) auf.
  • Durch das Betätigen der Schaltfläche Neu sollen alle Ein- und Ausgabefelder geleert werden.
  • Beim Programmstart und nach dem Betätigen der Schaltfläche Neu soll die Eingabemarke in das Eingabefeld tfAnfangskapital gesetzt werden.
  • Berücksichtigen Sie das Schichtenkonzept. Das heißt, ersetzen Sie die bisher genutzte UI-Klasse Benutzerkonsole durch die neu erstellte GUI-Klasse FensterKapitalanlage, ohne dass hierdurch Änderungen an der Fachklasse Kapitalanlage notwendig werden.
Lösung
Lösung
JAVA
package gui;

import app.Kapitalanlage;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class FensterKapitalanlage extends JFrame {

    private JPanel contentPane;
    private JTextField tfAnfangskapital;
    private JTextField tfZinssatz;
    private JTextField tfLaufzeit;
    private JTextArea taKapitalentwicklung;

    public FensterKapitalanlage() {
        setTitle("Kapitalanlage mit fester Laufzeit");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 339);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        JLabel lbAnfangskapital = new JLabel("Anfangskapital:");
        lbAnfangskapital.setFont(new Font("Tahoma", Font.PLAIN, 12));
        lbAnfangskapital.setBounds(38, 25, 98, 15);
        contentPane.add(lbAnfangskapital);

        tfAnfangskapital = new JTextField();
        tfAnfangskapital.setHorizontalAlignment(SwingConstants.RIGHT);
        tfAnfangskapital.setFont(new Font("Tahoma", Font.PLAIN, 12));
        tfAnfangskapital.setBounds(138, 21, 66, 23);
        contentPane.add(tfAnfangskapital);
        tfAnfangskapital.setColumns(10);

        JLabel lbEur = new JLabel("EUR");
        lbEur.setFont(new Font("Tahoma", Font.PLAIN, 12));
        lbEur.setBounds(214, 25, 45, 15);
        contentPane.add(lbEur);

        JLabel lbZinssatz = new JLabel("Zinssatz p. a.:");
        lbZinssatz.setFont(new Font("Tahoma", Font.PLAIN, 12));
        lbZinssatz.setBounds(38, 55, 98, 15);
        contentPane.add(lbZinssatz);

        tfZinssatz = new JTextField();
        tfZinssatz.setHorizontalAlignment(SwingConstants.RIGHT);
        tfZinssatz.setFont(new Font("Tahoma", Font.PLAIN, 12));
        tfZinssatz.setColumns(10);
        tfZinssatz.setBounds(138, 51, 66, 23);
        contentPane.add(tfZinssatz);

        JLabel lbProzent = new JLabel("%");
        lbProzent.setFont(new Font("Tahoma", Font.PLAIN, 12));
        lbProzent.setBounds(214, 55, 45, 15);
        contentPane.add(lbProzent);

        JLabel lbLaufzeit = new JLabel("Laufzeit:");
        lbLaufzeit.setFont(new Font("Tahoma", Font.PLAIN, 12));
        lbLaufzeit.setBounds(38, 85, 98, 15);
        contentPane.add(lbLaufzeit);

        tfLaufzeit = new JTextField();
        tfLaufzeit.setHorizontalAlignment(SwingConstants.RIGHT);
        tfLaufzeit.setFont(new Font("Tahoma", Font.PLAIN, 12));
        tfLaufzeit.setColumns(10);
        tfLaufzeit.setBounds(138, 81, 66, 23);
        contentPane.add(tfLaufzeit);

        JLabel lbJahre = new JLabel("Jahre");
        lbJahre.setFont(new Font("Tahoma", Font.PLAIN, 12));
        lbJahre.setBounds(214, 85, 45, 15);
        contentPane.add(lbJahre);

        JButton btBerechnen = new JButton("Berechnen");
        btBerechnen.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                berechnen();
            }
        });
        btBerechnen.setBounds(290, 50, 101, 25);
        contentPane.add(btBerechnen);

        JButton btNeu = new JButton("Neu");
        btNeu.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                neu();
            }
        });
        btNeu.setBounds(290, 20, 101, 25);
        contentPane.add(btNeu);

        JButton btBeenden = new JButton("Beenden");
        btBeenden.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                beenden();
            }
        });
        btBeenden.setBounds(290, 80, 101, 25);
        contentPane.add(btBeenden);

        JScrollPane spKapitalentwicklung = new JScrollPane();
        spKapitalentwicklung.setBounds(38, 168, 357, 109);
        contentPane.add(spKapitalentwicklung);

        taKapitalentwicklung = new JTextArea();
        taKapitalentwicklung.setEditable(false);
        taKapitalentwicklung.setFont(new Font("Courier New", Font.PLAIN, 12));
        tfAnfangskapital.setFont(new Font("Courier New", Font.PLAIN, 12));
        spKapitalentwicklung.setViewportView(taKapitalentwicklung);

        JLabel lbKapitalentwicklung = new JLabel("Kapitalentwicklung:");
        lbKapitalentwicklung.setFont(new Font("Tahoma", Font.PLAIN, 12));
        lbKapitalentwicklung.setBounds(38, 142, 121, 15);
        contentPane.add(lbKapitalentwicklung);
    }

    private void neu() {
        tfAnfangskapital.setText(null);
        tfZinssatz.setText(null);
        tfLaufzeit.setText(null);
        taKapitalentwicklung.setText(null);
        tfAnfangskapital.requestFocus();
    }
    
    private void beenden() {
        dispose();
        System.exit(0);
    }
    
    private void berechnen() {
        double anfangskapital = Double.parseDouble(tfAnfangskapital.getText().replace(',', '.'));
        double zinssatz = Double.parseDouble(tfZinssatz.getText().replace(',', '.'));
        Kapitalanlage kapitalanlage = new Kapitalanlage();

        kapitalanlage.setAnfangskapital(anfangskapital);
        kapitalanlage.setZinssatz(zinssatz);
        kapitalanlage.setLaufzeit(Integer.parseInt(tfLaufzeit.getText()) );
        taKapitalentwicklung.setText(kapitalanlage.erstelleKapitalentwicklung());
        taKapitalentwicklung.setCaretPosition(0);
    }
}
Abb. 17-24: Die GUI-Klasse FensterKapitalanlage (Quellcode)