Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

モーダルダイアログを開いた時にフォーカスを取得したい

はじめまして。Java素人のasukaと申します。

さっそくですが先輩方に質問いたします。

モーダルなダイアログを開いたと同時に、そのダイアログ内のテキストボックスのフォーカスを取得するようにしたいのですがどのようにすればいいのでしょうか?

以上です、お願いします。




17

回答

7993

閲覧

17件の回答

評価

0

フォーカスを取得、って何ですか(・ェ・)?

評価

0

「モーダルなダイアログ」「テキストボックス」が何か、Javaのパッケージだとかクラスだとかで説明を。
「フォーカスを取得」じゃなくて「フォーカスを設定」?
要素から見れば取得だろうけど。

素人だろうとなんだろうと、自分がやりたいことや、書いてるコードを元に、噛み砕いて説明することはできるはず。

評価

0

すいません、質問の仕方が悪かったです…

やりたいことは
1.ボタンを押してモーダルダイアログを表示
2.そのダイアログにはテキストフィールドがある

この状態で1でボタンを押した時に、2のテキストフィールドにフォーカスが移るようにすることが目的です。

テキストフィールドにそのフォーカスが移るようにダイアログ作成時にrequestFocusInWindowを使ってみましたが、移りませんでした。

以上説明が下手かもしれませんが、お願いします。

評価

0

実際にrequestFocusInWindowを呼び出すところは、
どんな風になってるの?
テキストフィールドであって、ダイアログじゃない、
ってことわかってるんなら、余計だろうけど。

評価

0

requestFocusInWindow()を使ってるなら、そのJavaDocくらいは読んだよね?

評価

0

大まかな感じは以下の様になっています。
(省略してある部分があります)

public class AAA extends JDialog {
  JButton button1 = new JButton();
  JTextField text1 = new JTextField();

  //コンストラクタ
  public AAA(Frame frame1, boolean modal) {
    super(frame1, true);
    init();
  }

  //部品構築
  private void init() {
    //ここで部品構築
    //ボタンを押した時に対する処理
    button1.addActionListener(this);
  }
  
  public void actionPerformed(ActionEvent e) {
    show();
  }
  //ダイアログ表示
  public void show() {
    //画面構築
    //フォーカスをtext1へ移す
    text1.setRequestFocusEnabled(true);
    text1.requestFocusInWindow();
  }
}

requestFocusInWindowは、ボタンを押してダイアログを表示する際に呼び出しています。

以上です、お願いします。

評価

0

> requestFocusInWindow()を使ってるなら、そのJavaDocくらいは読んだよね?

読みました。
その中に「このコンポーネントが表示可能であり、可視であり、フォーカス設定可能でなければなりません」と書いてあるので、モーダルなダイアログ内ではrequestFocusInWindowを呼び出しても意味がない気はします。

評価

0

show()ってdeprecatedなメソッドだと思ったけど。
JDialogを使ったことないから分からないけど、これって表示「させるためのメソッド」で、表示「したときのイベントハンドラ」じゃないんじゃなかったっけ。

評価

0

つか、ボタンを押してダイアログを表示させるなら、なんでダイアログの中にボタンがあるんだろう。

評価

0

show()の存在そのものを知らないんじゃないの。

さて。
手元でも確認してみたが、
コンポーネントの準備のタイミングの問題があって、
それなりの仕掛けが必要なようだ。

http://terai.xrea.jp/Swing/DefaultFocus.html

評価

0

ご指導ありがとうございます。

show()は単純に画面を表示するだけかと思っていました。

不良社員さんのWebページを参照して以下の様に作成してみましたが、うまくいきませんでした。

public class AAA extends JDialog {
  JButton button1 = new JButton();
  JTextField text1 = new JTextField();

  //コンストラクタ
  public AAA(Frame frame1, boolean modal) {
    super(frame1, true);
    init();
  }

  //部品構築
  private void init() {
    //ここで部品構築
    //ボタンを押した時に対する処理
    button1.addActionListener(this);
  //追加箇所
    this.addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowOpened(WindowEvent e) {
                OnWindowOpened(e);    
            }
        });
  }
  
  public void actionPerformed(ActionEvent e) {
    show();
  }
  //ダイアログ表示
  public void show() {
    //画面構築
    //フォーカスをtext1へ移す
    text1.setRequestFocusEnabled(true);
    text1.requestFocusInWindow();
  }
  //追加箇所
  void OnWindowOpened(WindowEvent e) {
    m_jTextFieldUser.setRequestFocusEnabled(true);
    m_jTextFieldUser.requestFocusInWindow();
  }
}

コンストラクタでmodalをtrueにすると、requestFocusInWindowは効かないんでしょうか?

評価

0

すいません、先の回答は無視してください。

public class AAA extends JDialog {
  JButton button1 = new JButton();
  JTextField text1 = new JTextField();

  //コンストラクタ
  public AAA(Frame frame1, boolean modal) {
    super(frame1, true);
    init();
  }

  //部品構築
  private void init() {
    //ここで部品構築
    //ボタンを押した時に対する処理
    button1.addActionListener(this);
  //追加箇所
    this.addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowOpened(WindowEvent e) {
                OnWindowOpened(e);    
            }
        });
  }
  
  public void actionPerformed(ActionEvent e) {
    show();
  }
  //ダイアログ表示
  public void show() {
    //画面構築
  }

  //追加箇所
  void OnWindowOpened(WindowEvent e) {
    text1.setRequestFocusEnabled(true);
    text1.requestFocusInWindow();
  }
}

以上のようにしましたがうまく行きませんでした。
コンストラクタでmodalをtrueにするとrequestFocusInWindowは効かないんでしょうか?

評価

0

やんちです。
長文失礼。
ちと、ごてごてやっていますが、手元で動作確認したソースコードです。

モーダルダイアログを開いた時に、テキストフィールドにカーソルが入っている事が
確認出来るかと思います。

JDKのバージョンが違うと、同じような動作をしないかもしれません。

確認環境:
Windows 2000 Pro
JDK 1.6.0_04
----------------------------------------------------------------------
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class AAA extends JDialog implements ActionListener {
    JButton button1 = new JButton();
    JTextField text1 = new JTextField();
    JPanel panel = new JPanel();
    
    //コンストラクタ
    public AAA(Frame frame1, boolean modal) {
        super(frame1, true);
        init();
    }
    
    //部品構築
    private void init() {
        Container contentPane = this.getContentPane();
        
        // ●ダイアログのサイズを設定
        int width = 640;
        int height = 480;
        this.setSize(new Dimension(width, height));
        contentPane.add(panel);
        setFocusable(true);
        
        //ここで部品構築
        //ボタンを押した時に対する処理
        button1.setText("ボタン1");
        button1.addActionListener(this);
        this.panel.add("Center", button1);
        
        text1.setColumns(20);
        this.panel.add("Center", text1);
        
        //追加箇所
        this.addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowOpened(WindowEvent e) {
                OnWindowOpened(e);
            }
        });
    }
    
    public void actionPerformed(ActionEvent e) {
//      show();
    }
    //ダイアログ表示
//  public void show() {
//      //画面構築
//  }
    
    //追加箇所
    void OnWindowOpened(WindowEvent e) {
        text1.setRequestFocusEnabled(true);
        text1.requestFocusInWindow();
    }
}
----------------------------------------------------------------------
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class MyApplet extends JApplet implements ActionListener {
    public static final int DEFAULT_HEIGHT = 480;
    public static final int DEFAULT_WIDTH = 540;
    JButton button1 = new JButton("ダイアログを開く");;
    JPanel panel = new JPanel();
    AAA aaa = null;
    
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        MyApplet myApplet = new MyApplet();
        
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add("Center", myApplet);
        frame.setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
        frame.setVisible(true);
        
        myApplet.init();
        myApplet.start();
    }
    
    public void init() {
        super.init();
        
        int width = 0;
        int height = 0;
        
        Container contentPane = this.getContentPane();
        
        width = this.getWidth();
        height = this.getHeight();
        panel.setPreferredSize(new Dimension(width, height));
        contentPane.add(panel);
        setFocusable(true);
        
        button1.addActionListener(this);
        panel.add("Center", button1);
        
    }
    
    public void start() {
        super.start();
    }
    
    public void stop() {
        super.stop();
    }
    
    public void destroy() {
        super.destroy();
    }
    
    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource().equals(button1)) {
            onButton1_Click(e);
        }
    }
    
    public void onButton1_Click(ActionEvent e) {
        Container parent = this.getParent();
        Frame parentFrame = null;
        
        while ((parent != null)) {
            if (parent instanceof Frame) {
                parentFrame = (Frame)parent;
                break;
            } else if (parent instanceof JFrame) {
                parentFrame = (Frame)parent;
                break;
            }
            parent = parent.getParent();
        }
        
        if (parentFrame != null) {
            boolean modal = true;
            this.aaa = new AAA(parentFrame, modal);
            this.aaa.setVisible(true);
        }
    }
}
----------------------------------------------------------------------

評価

0

やんちさん
ありがとうございます。

自分の環境は
Windows XP
JDK 1.6.0_17
ですが、うまく動きました。

他の方もありがとうございました。

評価

0

自分のコードで何が悪かったのか、理解したんだろうか。
コピペで動かすだけじゃ何の勉強にもならん。

評価

0

趣旨とは関係ないが、メソッドはシステムだって使ってるんだから、
自己都合でオーバーライドなんてするもんじゃないぞ。
画面構成なら、init()の中ですませるこった。

評価

0

$さん、不良社員さん
指摘ありがとうございます。

自分のコードが悪かった箇所は見直します。
今までshowはオーバーライドばかりで作っていました…
その辺りももう少し学習していきます。

以上です。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。