2009-04-25 11 views
39

私はJFrameにボタンをクリックすると、ダイアログボックスにユーザー入力用の複数のテキスト領域がポップアップされるようにしたいのです。私はこれを行う方法を理解しようとするために周りを見てきましたが、私はより混乱し続ける。誰も助けることができますか? JavaのチュートリアルからJava - カスタムダイアログボックスの作成方法

答えて

73

カスタム動作をあまり必要としない場合は、JOptionPaneを使用すると時間を節約できます。 OK/Cancelオプションの配置とローカライゼーションを担当し、独自のクラスを定義することなくカスタムダイアログを表示することができます。ほとんどの場合、JOptionPaneの "message"パラメータはStringですが、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

この例では、残念ながら、インスタンスがフィールド間のタブ移動または「OK」を押下するためにサポートしていません。 – aioobe

+0

コンストラクタを使用してJOptionPaneを作成し、その結果生成されるJOptionPaneでcreateDialogを呼び出すことで、ダイアログをより詳細に制御できます。これにより、JDialogが提供されます.JDialogは、表示する前にさらにカスタマイズすることができます。しかし、ある時点では、独自のカスタムコンポーネントをロールする方が理にかなっています。 –

+1

@aioobe私のJREでは、インスタンスのタブと押下の両方がOKボタンの作業のために入力されます(あなたのコメントから非常に多くの時間が経過しましたが)。しかし、もう一つの欠点はこの解決策です:OKボタンを押した状態とダイアログウィンドウを閉じた状態を区別する方法はありません。したがって、あなたの行動をキャンセルする方法はありません。 – Vic

2

This lessonは例やAPIのリンクを、詳細に各Swingコンポーネントについて説明します。

1

NetBeans IDE(最新のバージョンは6.5.1)を使用すると、File-> New Projectを使用して基本GUI Javaアプリケーションを作成し、Javaカテゴリを選択してからJava Desktop Applicationを選択できます。一度作成さ

は、メニューの選択を使用して開くことができる程度のボックスを含む単純な裸の骨のGUIアプリを持っています。これをあなたのニーズに合わせて、ボタンクリックからダイアログを開く方法を学ぶことができます。

ダイアログを視覚的に編集することができます。そこにある項目を削除し、テキストエリアを追加します。それで遊んで、あなたが動けなくなる場合:)

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。メッセージボックスと確認ボックスをサポートしています。 joptpaneのように入力とオプションのダイアログがすぐに実装されます。 CUstomDialogのAPIから

サンプルエラーダイアログ: CustomDialog Error Message