# eigenes JOptionPane ?



## jottes (19. Dez 2006)

Hallo allerseits...
ich kaspere schon seit gestern mit dem JOptionPane herum. Mein Problem damit ist, dass ich gerne zwischen den Buttons (YES_NO_OPTION) mit den Pfeiltasten hin- und her gehen will. Z.Zt. geht das aber (default) nur mit dem Tab. Ich habe darauf versucht über 
	
	
	
	





```
getComponents()
```
 an die Buttons zu kommen. Erst bekomme ich zwei Panel, von dem das untere die Buttons enthält. Beim casten bekomme ich dann aber eine Null-Pointer-Exception. Der Gedanke dabei war die Referenzen der Buttons zu bekommen, damit ich einen KeyListener an sie hängen kann und so das hin- und herschalten mit den Pfeiltasten hinzubekommen... 

Jetzt habe ich versucht mir eine eigene Component zu basteln (extends JDialog), die ähnliches können soll, wie ein JOptionPane. Dabei habe ich ja explizit die Referenzen auf meinen Ja- und Nein Button und kann da ohne Probleme auch die KeyListener dran machen. Dumm ist nur, dass ich das Sperren aller anderen Threads nicht hinbekomme, so wie das beim JOptionPane der Fall ist.

Hat irgend jemand sich sowas schonmal selber gebaut?


----------



## The_S (19. Dez 2006)

Ich hab zufällig einen etwas älteren Anmeldebildschirm von mir gefunden. Der funktioniert auf die gleiche Weise. Kannst ja n bisschen abschauen  .


```
package de.egui.dialogs;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

public class LoginScreen {

	public static final int CANCEL = 0;
	public static final int OK = 1;
	
	private int returnvalue = CANCEL;
	
	private JDialog dialog = null;
	
	private JTextField user = null;
	private JPasswordField pass = null;
	
	private JLabel text = null;
	private JLabel usertext = null;
	private JLabel passtext = null;
	
	private JButton ok = null;
	private JButton cancel = null;
	
	private JPanel mainpane = null;
	private JPanel leftpane = null;
	private JPanel middlepane = null;
	private JPanel downpane = null;
	
	public LoginScreen() {
		this(null);
	}
	
	public LoginScreen(Frame parent) {
		this(parent, "");
	}
	
	public LoginScreen(Frame parent, String text) {
		this(parent, text, "", "");
	}
	
	public LoginScreen(Frame parent, String text, String user, String pass) {
		
		dialog = new JDialog(parent, true);
		
		this.user = new JTextField();
		this.pass = new JPasswordField();
		
		this.text = new JLabel();
		usertext = new JLabel("User:");
		passtext = new JLabel("Password:");
		
		ok = new JButton("OK");
		cancel = new JButton("Cancel");

		mainpane = new JPanel();
		leftpane = new JPanel();
		middlepane = new JPanel();
		downpane = new JPanel();
		
		mainpane.setLayout(new BorderLayout());
		leftpane.setLayout(new GridLayout(0, 1, 0, 3));
		middlepane.setLayout(new BorderLayout());
		
		setText(text);
		setUser(user);
		setPassword(pass);
		
		mainpane.add(middlepane);
		mainpane.add(leftpane, BorderLayout.WEST);
		mainpane.add(downpane, BorderLayout.SOUTH);
		mainpane.add(this.text, BorderLayout.NORTH);
		
		leftpane.add(usertext);
		leftpane.add(passtext);
		
		middlepane.add(this.user);
		middlepane.add(this.pass, BorderLayout.SOUTH);
		
		downpane.add(ok);
		downpane.add(cancel);
		
		dialog.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent evt) {
				returnvalue = CANCEL;
			}
		});
		
		ok.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				returnvalue = OK;
				dialog.dispose();
			}
		});
		
		cancel.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				returnvalue = CANCEL;
				dialog.dispose();
			}
		});
		
		
		dialog.setContentPane(mainpane);
		dialog.setResizable(false);
	}

	public int showLoginDialog() {
		
		dialog.pack();
		dialog.setSize(new Dimension(dialog.getWidth() < 300 ? 300 : dialog.getWidth(), dialog.getHeight()));
		dialog.setLocationRelativeTo(dialog.getOwner());
		dialog.setVisible(true);
		return returnvalue;
	}
	
	public String getText() {
		return text.getText();
	}
	
	public void setText(String text) {
		this.text.setText(text);
	}
	
	public char[] getPassword() {
		return pass.getPassword();
	}
	
	public void setPassword(String password) {
		pass.setText(password);
	}
	
	public String getUser(){
		return user.getText();
	}
	
	public void setUser(String user) {
		this.user.setText(user);
	}
	
	public void setPasswordText(String str) {
		passtext.setText(str);
	}
	
	public void setUserText(String str) {
		usertext.setText(str);
	}
	
	public void setOKText(String str) {
		ok.setText(str);
	}
	
	public void setCancelText(String str) {
		cancel.setText(str);
	}
	
	public void setTitle(String title) {
		dialog.setTitle(title);
	}
	
	public static void main(String[] args) {
		JFrame frame = new JFrame();
		frame.setSize(400, 300);
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
		LoginScreen ls = new LoginScreen(frame, "Bitte Passwort eingeben");
		ls.setTitle("Bitte Passwort eingeben");
		System.out.println(ls.showLoginDialog());
		System.exit(0);
	}
}
```


----------



## jottes (19. Dez 2006)

die ausschlaggebenden Methode war createDialog(). Ein Klasse von JOptionPane erstellen und dann eine Instanz davon anzeigen lassen geht denke ich nur über diesen Weg. Man muss mittels createDialog() diese Instanz "wrappen" und bekommt ein JDialog zurück. Dann kann man sich den JDialog mit setVisible() anzeigen lassen. Jetzt muss ich nur noch die DefaultButton Eigenschaft da raus haben...

danke trotzdem...


----------

