Ho un pulsante su un JFrame che quando si fa clic su Voglio una finestra di dialogo per far apparire una finestra con più aree di testo per l'input dell'utente. Mi sono guardato intorno per cercare di capire come farlo, ma continuo ad essere più confuso. Qualcuno può aiutare?Java - Come creare una finestra di dialogo personalizzata?
risposta
Se non è necessario molto in termini di comportamento personalizzato, JOptionPane è un buon risparmio di tempo. Si occupa del posizionamento e della localizzazione delle opzioni OK/Annulla ed è un modo rapido e sporco per mostrare una finestra di dialogo personalizzata senza dover definire le proprie classi. La maggior parte delle volte il parametro "message" in JOptionPane è una stringa, ma puoi passare anche un JComponent o una matrice di JComponent.
Esempio:
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);
}
This lesson dal tutorial Java spiega in dettaglio ogni componente Swing, con esempi e collegamenti API.
Se si utilizza NetBeans IDE (la versione più recente è 6.5.1), è possibile utilizzarla per creare un'applicazione GUI di base della GUI utilizzando File-> Nuovo progetto e scegliere la categoria Java, quindi Applicazione desktop Java.
Una volta creato, si avrà una semplice GUI Bare Bones che contiene una casella di informazioni che può essere aperta utilizzando una selezione di menu. Dovresti essere in grado di adattarlo alle tue esigenze e imparare come aprire una finestra di dialogo con un clic del pulsante.
È possibile modificare visivamente la finestra di dialogo. Elimina gli elementi presenti e aggiungi alcune aree di testo. Gioca con esso e torna con altre domande se rimani bloccato :)
Bene, in pratica crei un JDialog, aggiungi i componenti del testo e rendilo visibile. Potrebbe essere utile se si restringe il bit specifico con cui si hanno problemi.
Prova questa semplice classe per la personalizzazione di una finestra di dialogo a proprio piacimento:
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>";
}
}
ho creato una finestra di dialogo personalizzata API. dai un'occhiata qui https://github.com/MarkMyWord03/CustomDialog. Supporta messaggio e casella di conferma. la finestra di dialogo di input e opzioni, proprio come in joptionpane, verrà implementata a breve.
errore di esempio di dialogo da CUstomDialog API: CustomDialog Error Message
Questo esempio purtroppo non supporta per esempio tabulazione tra i campi o premendo Invio per "ok". – aioobe
È possibile ottenere un maggiore controllo sulla finestra di dialogo creando un JOptionPane utilizzando un costruttore, quindi chiamando createDialog sul JOptionPane risultante. Questo ti dà un JDialog, che puoi personalizzare ulteriormente prima di renderlo visibile. Ad un certo punto, ha più senso girare il proprio componente personalizzato. –
@aioobe Nel mio JRE entrambe le schede di istanza e premendo invio per il pulsante OK funzionano (anche se è passato molto tempo dal tuo commento). Tuttavia, c'è un altro svantaggio di questa soluzione: non c'è modo di distinguere tra il pulsante OK premuto e la finestra di dialogo chiusa. Quindi non c'è modo di cancellare la tua azione. – Vic