Java – Wie erstelle ich ein benutzerdefiniertes Dialogfeld?

Lesezeit: 4 Minuten

Ich habe eine Schaltfläche auf einem JFrame, auf die beim Klicken ein Dialogfeld mit mehreren Textbereichen für Benutzereingaben angezeigt werden soll. Ich habe mich überall umgesehen, um herauszufinden, wie das geht, aber ich werde immer verwirrter. Kann jemand helfen?

Benutzer-Avatar
Sam Barnum

Wenn Sie nicht viel benutzerdefiniertes Verhalten benötigen, ist JOptionPane eine gute Zeitersparnis. Es kümmert sich um die Platzierung und Lokalisierung von OK/Abbrechen-Optionen und ist eine schnelle und schmutzige Möglichkeit, einen benutzerdefinierten Dialog anzuzeigen, ohne dass Sie Ihre eigenen Klassen definieren müssen. Meistens ist der „message“-Parameter in JOptionPane ein String, aber Sie können auch eine JComponent oder ein Array von JComponents übergeben.

Beispiel:

JTextField firstName = new JTextField();
JTextField lastName = new JTextField();
JPasswordField password = new JPasswordField();
final JComponent[] inputs = new JComponent[] {
        new JLabel("First"),
        firstName,
        new JLabel("Last"),
        lastName,
        new JLabel("Password"),
        password
};
int result = JOptionPane.showConfirmDialog(null, inputs, "My custom dialog", JOptionPane.PLAIN_MESSAGE);
if (result == JOptionPane.OK_OPTION) {
    System.out.println("You entered " +
            firstName.getText() + ", " +
            lastName.getText() + ", " +
            password.getText());
} else {
    System.out.println("User canceled / closed the dialog, result = " + result);
}

  • Dieses Beispiel unterstützt z. B. das Tabulatoren zwischen Feldern oder das Drücken der Eingabetaste für “OK” leider nicht.

    – aiobe

    18. Februar 2011 um 17:02 Uhr

  • Sie können den Dialog etwas besser steuern, indem Sie mit einem Konstruktor ein JOptionPane erstellen und dann createDialog für das resultierende JOptionPane aufrufen. Dadurch erhalten Sie einen JDialog, den Sie weiter anpassen können, bevor Sie ihn sichtbar machen. Irgendwann ist es jedoch sinnvoller, eine eigene benutzerdefinierte Komponente zu rollen.

    – Sam Barnum

    23. Februar 2011 um 18:07 Uhr

  • @aioobe In meiner JRE funktionieren sowohl das Tabulatoren als auch das Drücken der Eingabetaste für die Schaltfläche OK (obwohl seit Ihrem Kommentar sehr viel Zeit vergangen ist). Diese Lösung hat jedoch einen weiteren Nachteil: Es gibt keine Möglichkeit, zwischen gedrückter OK-Schaltfläche und geschlossenem Dialogfenster zu unterscheiden. Es gibt also keine Möglichkeit, Ihre Aktion abzubrechen.

    – Vic

    28. August 2016 um 18:35 Uhr

  • @Vic, Sie können JOptionPane.showConfirmDialog anstelle von JOptionPane.showMessageDialog verwenden. Ich habe das Beispiel aktualisiert, danke!

    – Sam Barnum

    29. August 2016 um 22:19 Uhr

Benutzer-Avatar
BullyWiiPlaza

Probieren Sie diese einfache Klasse aus, um einen Dialog nach Ihren Wünschen anzupassen:

import java.util.ArrayList;
import java.util.List;

import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JRootPane;

public class CustomDialog
{
    private List<JComponent> components;

    private String title;
    private int messageType;
    private JRootPane rootPane;
    private String[] options;
    private int optionIndex;

    public CustomDialog()
    {
        components = new ArrayList<>();

        setTitle("Custom dialog");
        setMessageType(JOptionPane.PLAIN_MESSAGE);
        setRootPane(null);
        setOptions(new String[] { "OK", "Cancel" });
        setOptionSelection(0);
    }

    public void setTitle(String title)
    {
        this.title = title;
    }

    public void setMessageType(int messageType)
    {
        this.messageType = messageType;
    }

    public void addComponent(JComponent component)
    {
        components.add(component);
    }

    public void addMessageText(String messageText)
    {
        JLabel label = new JLabel("<html>" + messageText + "</html>");

        components.add(label);
    }

    public void setRootPane(JRootPane rootPane)
    {
        this.rootPane = rootPane;
    }

    public void setOptions(String[] options)
    {
        this.options = options;
    }

    public void setOptionSelection(int optionIndex)
    {
        this.optionIndex = optionIndex;
    }

    public int show()
    {
        int optionType = JOptionPane.OK_CANCEL_OPTION;
        Object optionSelection = null;

        if(options.length != 0)
        {
            optionSelection = options[optionIndex];
        }

        int selection = JOptionPane.showOptionDialog(rootPane,
                components.toArray(), title, optionType, messageType, null,
                options, optionSelection);

        return selection;
    }

    public static String getLineBreak()
    {
        return "<br>";
    }
}

Diese Lektion aus dem Java-Tutorial erklärt jede Swing-Komponente im Detail, mit Beispielen und API-Links.

Wenn Sie die verwenden NetBeans-IDE (Die aktuellste Version ist derzeit 6.5.1), Sie können damit eine einfache GUI-Java-Anwendung erstellen, indem Sie Datei->Neues Projekt verwenden und die Java-Kategorie und dann Java Desktop-Anwendung auswählen.

Nach der Erstellung verfügen Sie über eine einfache Bare-Bones-GUI-App, die eine About-Box enthält, die über eine Menüauswahl geöffnet werden kann. Sie sollten in der Lage sein, dies an Ihre Bedürfnisse anzupassen und zu lernen, wie Sie einen Dialog per Knopfdruck öffnen.

Sie können den Dialog visuell bearbeiten. Löschen Sie die vorhandenen Elemente und fügen Sie einige Textbereiche hinzu. Spielen Sie damit herum und kommen Sie mit weiteren Fragen zurück, wenn Sie nicht weiterkommen 🙂

Nun, Sie erstellen im Wesentlichen einen JDialog, fügen Ihre Textkomponenten hinzu und machen ihn sichtbar. Es könnte hilfreich sein, wenn Sie eingrenzen, mit welchem ​​​​spezifischen Bit Sie Probleme haben.

Benutzer-Avatar
MarkMyWord03

Ich habe eine benutzerdefinierte Dialog-API erstellt. sieh es dir hier an https://github.com/MarkMyWord03/CustomDialog. Es unterstützt Nachrichten- und Bestätigungsfelder. Eingabe- und Optionsdialog wie in joptionpane werden in Kürze implementiert.

Beispiel für einen Fehlerdialog von der CUstomDialog-API:
CustomDialog-Fehlermeldung

1014760cookie-checkJava – Wie erstelle ich ein benutzerdefiniertes Dialogfeld?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy