2009-04-25 2 views
39

У меня есть кнопка на JFrame, которая при щелчке я хочу, чтобы диалоговое окно отображалось в виде нескольких текстовых областей для ввода пользователем. Я искал все вокруг, чтобы попытаться выяснить, как это сделать, но я все больше смущаюсь. Может ли кто-нибудь помочь?Java - Как создать настраиваемое диалоговое окно?

ответ

73

Если вам не нужно много настраивать поведение, JOptionPane - хорошая экономия времени. Он позаботится о размещении и локализации параметров OK/Отмена и является быстрым и грязным способом отображения пользовательского диалога без необходимости определять ваши собственные классы. В большинстве случаев параметр «сообщение» в JOptionPane является строкой, но вы также можете передать JComponent или массив JComponents.

Пример:

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); 
} 
+0

Этот пример, к сожалению, не поддерживает, например табулируя между полями или нажатием ввести для «ОК». – aioobe

+0

Вы можете получить больше контроля над диалогом, создав JOptionPane с помощью конструктора, а затем вызовите createDialog на результирующем JOptionPane. Это дает вам JDialog, который вы можете настроить, прежде чем сделать его видимым. Однако в какой-то момент имеет смысл развернуть свой собственный компонент. –

+1

@aioobe В моей JRE оба экземпляра табуляции и нажатия на ввод кнопки OK (хотя прошло очень много времени с момента вашего комментария). Однако есть и другой недостаток - это решение: нет способа переназначить нажатие кнопки OK и закрытие диалогового окна. Таким образом, вы не можете отменить свое действие. – Vic

2

This lesson из учебника Java подробно объясняет каждый компонент Swing с примерами и ссылками API.

1

Если вы используете NetBeans IDE (последняя версия на данный момент составляет 6.5.1), вы можете использовать его для создания основного GUI-приложения Java с помощью File-> New Project и выбрать категорию Java, а затем приложение Java Desktop.

После создания у вас будет простое графическое приложение с голыми костями, которое содержит окно, которое можно открыть с помощью выбора меню. Вы должны уметь адаптировать это к вашим потребностям и научиться открывать диалог нажатием кнопки.

Вы сможете редактировать диалог визуально. Удалите элементы, которые есть, и добавьте некоторые текстовые области. Играйте с ним и возвращайтесь с дополнительными вопросами, если вы застряли :)

1

Ну, вы по существу создаете JDialog, добавляете свои текстовые компоненты и делаете их видимыми. Это может помочь, если вы сузите какой конкретный бит, с которым вы столкнулись.

1

Попробуйте этот простой класс для настройки диалогового окна по своему вкусу:

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>"; 
    } 
} 
0

я создал диалоговое пользовательского API. проверьте здесь https://github.com/MarkMyWord03/CustomDialog. Он поддерживает окно сообщений и подтверждения. диалог ввода и опции, как и в joptionpane, будет реализован в ближайшее время.

Пример ошибки Диалог с CUstomDialog API: CustomDialog Error Message

 Смежные вопросы

  • Нет связанных вопросов^_^