3 Häufig gepostete Fragen

3.1 [LANG] Die Sprache Java

3.2 [STRING] Strings

3.3 [IO] Eingabe/Ausgabe, Streams, etc.

3.4 [NET] Netzwerk

3.5 [AWT] Abstract Window Toolkit

3.6 [SWING] Swing, das bevorzugte GUI

3.7 [APPLET] Java-Applets und ihre Zusammenarbeit mit Browsern

3.8 [SERVER] Servlets und andere Server-Implementierungen in Java

3.9 [NONCORE] Klassen/Packages, die über den Kern der Sprache hinausgehen, also Java3D etc.

3.10 [OOP] OOP-Konzepte und Patterns in Java

3.11 [JDK] Virtuelle Maschinen, alles über JDKs und deren Installation und Verwendung

3.12 [TOOLS] Java-Zusatz-Tool, zum Beispiel IDEs, Build-Tools, Profiler, etc.

3.13 [MISC] Alles, was nicht in eine der anderen Rubriken paßt

3.14 [ERROR] Fehlermeldungen


3.6 [SWING] Swing, das bevorzugte GUI

Zurück zu "3 Häufig gepostete Fragen"

3.6.1 Wie mache ich globale Font-Änderung für meine Komponenten?

Das geht mit:

    UIManager.put("component.font", new FontUIResource(...));

Autor: Linda Radecke

Zurück zu "3.6 [SWING] Swing, das bevorzugte GUI"

3.6.2 Wie kann ich bei der Eingabe in ein JTextField die Anzahl der eingebbaren Zeichen beschränken?

Wenn ein JTextField benutzt wird sollte man ein benutzerdefiniertes Document implementieren. Für AWT-Textfelder funktioniert es mit einigen Anpassungen auch über das Interface KeyListener.

import javax.swing.text.PlainDocument;
import javax.swing.text.BadLocationException;
import javax.swing.text.AttributeSet;

/**
 * Diese Klasse ist ein Dokument für Textfelder, welches die Eingabe auf
 * x Zeichen begrenzt.
 *
 * Die Zuweisung geschieht über
 * JTextfield.setDocumenT(new Validation(int anzahl));
 */
public class Validation extends PlainDocument{
    private int limit;

    /**
     * Konstruktor für das Validationdokument
     * @param int limit: maximale Anzahl der einzugebenen Zeichen
     */
    public Validation(int newLimit){
        super();
        if (limit < 0){
            limit = 0;
        } else {
            limit = newLimit;
        }
    }

    /**
     * Funktion überschreibt die Methode insertString von PlaintDocument
     * @param int offset: Position
     * @param String str: der String
     * @param AttributeSet attr: Attributset
     */
    public void insertString (int offset, String str, AttributeSet attr)
            throws BadLocationException {
        if (str == null) return;

        if ((getLength() + str.length()) <= limit){
            super.insertString(offset, str, attr);
        }
     }
}

Die hier aufgezeigte Lösung zur Begrenzung von Textfeldern kann auch verwendet werden, wenn unerwünschte Zeichen in einem Textfeld nicht eingegeben werden dürfen.

Autor: Alexander Elsholz

Zurück zu "3.6 [SWING] Swing, das bevorzugte GUI"

3.6.3 Wie setze ich den Cursor an den Anfang der JTextArea?

Das geht mit:

    textarea.setCaretPosition(0);

Autor: Linda Radecke

Zurück zu "3.6 [SWING] Swing, das bevorzugte GUI"

3.6.4 Wie scrolle ich an das Ende der JTextArea?

Hierzu existieren mehrere Möglichkeiten:

    textarea.setCaretPosition(textarea.getDocument().getLength());
try{

    textarea.scrollRectToVisible(textarea.modelToView(
            textarea.getDocument().getLength()));

} catch (BadLocationException be) {
    be.toString();
}

(Geht auch, weniger schön): mit getText().length();

Scrolling wrappen in SwingUtilities.invokeLater(), bspw:

SwingUtilities.invokeLater(new Runnable() {

    public void run() {

        // scrolling code

    }
};

Autor: Linda Radecke

Zurück zu "3.6 [SWING] Swing, das bevorzugte GUI"

3.6.5 Wie bekomme ich es hin, das der Benutzer in meiner JTable keine Eingaben tätigen kann?

Das funktioniert über das Tabellenmodell deiner JTable:

import javax.swing.table.DefaultTableModel

/**
 * Diese Klasse repräsentiert das Datenmodell für eine oder mehrere
 * Tabellen
 *
 * Die Zuweisung geschieht über JTable.setModel(new YourTableModel()));
 */
public class YourTableModel extends DefaultTableModel {

    /**
     * aus der API: Returns true if the cell at rowIndex and columnIndex
     * is editable. Otherwise, setValueAt on the cell will not change the
     * value of that cell.
     */
    public boolean isCellEditable(int row, int column) {
        return false;
    }
}

Dieses Bespiel verhindert das Editieren von zellen in allen Zellen der Tabelle, durch Auswerten der Parameter könn aber auch einzelne Spalte, Zeilen oder Zellen gesperrt werden.

Autor: Alexander Elsholz

Zurück zu "3.6 [SWING] Swing, das bevorzugte GUI"

3.6.6 Wie bekomme ich eine horizontale ScrollBar bei JTable?

Das geht mit:

    table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

Autor: Linda Radecke

Zurück zu "3.6 [SWING] Swing, das bevorzugte GUI"

3.6.7 Wie scrolle ich ans Ende von JTable?

Das geht mit:

    table.scrollRectToVisible(table.getCellRect(
            table.getRowCount()-1,-1,true));

Autor: Linda Radecke

Zurück zu "3.6 [SWING] Swing, das bevorzugte GUI"

3.6.8 Wie verhindere ich ein reordering der Spalten bei JTable?

Das geht mit:

    table.getTableHeader().setReorderingAllowed(false);

Autor: Linda Radecke

Zurück zu "3.6 [SWING] Swing, das bevorzugte GUI"

3.6.9 Wie verhindere ich ein Resizen der Spalten bei JTable?

Das geht mit:

    table.getTableHeader().setResizingAllowed(false);

Autor: Linda Radecke

Zurück zu "3.6 [SWING] Swing, das bevorzugte GUI"

3.6.10 Wie ändere ich die Hintergrundfarbe von JScrollPane?

Das geht mit:

    scrollpane.getViewport().setBackground(new Color(....));

Autor: Linda Radecke

Zurück zu "3.6 [SWING] Swing, das bevorzugte GUI"

3.6.11 Wie kann ich ein JLabel dazu bringen, seinen Hintergrund zu füllen?

JLabel zeichnet (wie die meisten Swing-Komponenten) seinen Hintergrund nicht, wenn es nicht "opaque" ist (obwohl dies unterschiedliche Dinge sind).

Loesung:
Fuer *undurchsichtige* Hintergrundfarben funktioniert folgendes:

    JLabel l = new JLabel("Text");
    l.setOpaque(true);
    l.setColor(Color.red);

Diese Loesung funktioniert auch fuer transparente Hintergrundfarben:

public class JLabelWithBackground extends JLabel {
    public JLabelWithBackground(String title) {
        super(title);
    }

    public void paintComponent(Graphics g) {
        if (!isOpaque()) {
            Rectangle vr = getVisibleRect();
            g.setColor(getBackground());
            g.fillRect(vr.x, vr.y, vr.width, vr.height);
        }
        super.paintComponent(g);
    }
}

    JLabel l = new JLabelWithBackground("Text");
    l.setBackground(new Color(255, 0, 0, 128));

Autor: Gerhard Bloch

Zurück zu "3.6 [SWING] Swing, das bevorzugte GUI"