こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

javaのJTextFieldにマウスフォーカス

お世話になります。

Q1)下記のコードに於きまして、JTextFieldにマウスフォーカス
が当りますと、その旨、System.out.println("JTextField_tt")と表示する方法をお教えください。
import java.awt.BorderLayout;

import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.LineBorder;

public class EObjectTest extends JFrame implements ActionListener {
public static JButton b1;
public static JButton b2;
public static JTextField tt;
static EObjectTest frame;

public static void main(String args[]){
frame=new EObjectTest("AAAA");
frame.setVisible(true);

}

EObjectTest(String title) {
setTitle(title);
setBounds(100, 100, 300, 250);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel p = new JPanel();
// ボタン作成・追加
b1 = new JButton("One");
b2 = new JButton("Two");
tt = new JTextField("aaa");
LineBorder border = new LineBorder(Color.RED, 2, true);
tt.setBorder(border);
tt.setColumns(15);

p.add(b1);
p.add(b2);
p.add(tt);
Container contentPane = getContentPane();
contentPane.add(p, BorderLayout.CENTER);

// リスナ登録
b1.addActionListener(this);
b2.addActionListener(this);
tt.addActionListener(this);

}

public void actionPerformed(ActionEvent e) {
// getSource() でイベントソースのオブジェクトを獲得し
// Button クラスにキャストする
JButton b = (JButton)e.getSource();
// JTextField ttt = (JTextField)e.getSource();

if (b==b1) {
System.out.println("Oneのボタン");
}
if (b==b2) {
System.out.println("Twoのボタン");
}
/*
if (ttt==tt) {
System.out.println("JTextField_tt");
}
*/

}
}
以上

投稿日時 - 2015-04-06 11:59:18

QNo.8950308

困ってます

質問者が選んだベストアンサー

マウスフォーカスがマウスでテキストボックスをクリックして入力可能状態になるという事と仮定すると以下のようなのはどうだろう。これだとマウスクリックに限らずTABキーによるフォーカス取得やフォーカスがある状態でウィンドウを最小化して元に戻すというのでも反応してしまうのだがそれでも良ければ。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent; // 追加
import java.awt.event.FocusListener; // 追加

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.LineBorder;

public class EObjectTest extends JFrame implements ActionListener,
FocusListener { // FocusListerインターフェースを実装
public static JButton b1;
public static JButton b2;
public static JTextField tt;
static EObjectTest frame;

public static void main(String args[]) {
frame = new EObjectTest("AAAA");
frame.setVisible(true);

}

EObjectTest(String title) {
setTitle(title);
setBounds(100, 100, 300, 250);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel p = new JPanel();
// ボタン作成・追加
b1 = new JButton("One");
b2 = new JButton("Two");
tt = new JTextField("aaa");
LineBorder border = new LineBorder(Color.RED, 2, true);
tt.setBorder(border);
tt.setColumns(15);

p.add(b1);
p.add(b2);
p.add(tt);
Container contentPane = getContentPane();
contentPane.add(p, BorderLayout.CENTER);

// リスナ登録
b1.addActionListener(this);
b2.addActionListener(this);
tt.addActionListener(this);
tt.addFocusListener(this); // 追加

}

public void actionPerformed(ActionEvent e) {
// getSource() でイベントソースのオブジェクトを獲得し
// Button クラスにキャストする
JButton b = (JButton) e.getSource();

if (b == b1) {
System.out.println("Oneのボタン");
}
if (b == b2) {
System.out.println("Twoのボタン");
}

}

// ここから下を追加
@Override
public void focusGained(FocusEvent e) {
if (e.getSource() instanceof JTextField) {
JTextField ttt = (JTextField) e.getSource();
if (ttt == tt) {
System.out.println("JTextField_tt got focus");
}
}
}

@Override
public void focusLost(FocusEvent e) {
if (e.getSource() instanceof JTextField) {
JTextField ttt = (JTextField) e.getSource();
if (ttt == tt) {
System.out.println("JTextField_tt lost focus");
}
}
}
}

AWTやSwingにはActionListerやFocusListenerの他にもたくさんのイベントリスナーがある。各コンポーネントのaddほにゃららListener()というメソッドを調べてみるといい。
後、イベントリスナーの中でキャストする前にinstanceofでクラスを確認するか、==での比較ならキャストしなくてもできるのでそのまま比較するのが良かろう。

投稿日時 - 2015-04-06 14:59:52

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

JTextFieldのマウスフォーカス取得には、ActionListenerではなくFocusListenerを使うようですね。

FocusListenerをimplementしたオブジェクトを、
ttの addFocusListener に渡してあげれば良いと思います。

参考URL:http://www.java2s.com/Code/JavaAPI/javax.swing/JTextFieldaddFocusListenerFocusListenerl.htm

投稿日時 - 2015-04-06 14:13:54

あなたにオススメの質問