中小企業の働き方改革をサポート>>

Javaで、キー押下をkeyPressed(KeyEvent eve)で認識しています。
このイベント処理では、TABキー(VK_TAB)押下を認識できないようなのですが、どうしたら TABキー押下を認識できるでしょうか?
ご教示をお願いいたします。

A 回答 (2件)

setFocusTraversalKeysEnabled(false);


とか使えるんじゃないでしょうか。

VK_TABは、デフォルトで、フォーカスマネージャが使用しているみたいですから、そのままでは、keyPressed()で取れないみたいです。
    • good
    • 0
この回答へのお礼

Yanch さん、
早速の ご教示、ありがとうございます。

なるほど、やっぱり取れないのですね。
setFocusTraversalKeysEnabled(false);
の使い方などのヒントが見れるURLを
ご存知でしたら、教えていただけると、
助かります。
よろしくお願いします。

お礼日時:2008/12/04 08:14

keyPressed/keyReleasedを使う。

    • good
    • 0
この回答へのお礼

logger_man さん
ご回答、ありがとうございます。
勉強します。

お礼日時:2008/12/04 08:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QTABキーの検出

Swingコンポーネントで、TABキーのイベントを取得する
方法を教えてください。

タブキー以外は検出できるのですが…


import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class TabKeyListener {

public TabKeyListener() {
JPanel panel = new JPanel();
panel.addKeyListener( new KeyListener(){
public void keyPressed(KeyEvent e) {
System.out.println(e.getKeyCode());
}
public void keyReleased(KeyEvent e) {
}
public void keyTyped(KeyEvent e) {
}
} );
JFrame frame = new JFrame();
frame.add(panel);
frame.setBounds(100,100,200,200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
panel.requestFocusInWindow();
}

public static void main(String[] args) {
new TabKeyListener();
}

}

Swingコンポーネントで、TABキーのイベントを取得する
方法を教えてください。

タブキー以外は検出できるのですが…


import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class TabKeyListener {

public TabKeyListener() {
JPanel panel = new JPanel();
panel.addKeyListener( new KeyListener(){
public void keyPressed(KeyEvent e) {
System.out.println(e.getKeyCode());
}
public void keyReleas...続きを読む

Aベストアンサー

これじゃないかな?
http://oshiete1.goo.ne.jp/qa4525996.html

setFocusTraversalKeysEnabled(false);
とか使えるんじゃないでしょうか。

VK_TABは、デフォルトで、フォーカスマネージャが使用しているみたいですから、そのままでは、keyPressed()で取れないみたいです。

QKeyListenerの使い方について

FrameクラスのフレームにKeyListenerをaddKeyListenerで登録してキー入力を受け付けたいのですが、キーを入力してもまったく反応がありません。どうやらkeyTyped,keyPressed,keyReleasedのどのメソッドも呼び出されてないようです。クラスの概要は以下のとおりです。
class sampleFrame extends Frame implements KeyListener
{
{
addKeyListener(this);//コンストラクタ内で登録
}



で、keyPressedとうのメソッドはすべて定義しています。それから、キーを入力するとなぜか同じフレーム上のリストボックスの項目が入れ替わったりします。
どうぞよろしくお願いいたします。

Aベストアンサー

こんにちは。
おそらくフォーカスの問題だと思います。
フォーカスをフレームに設定してあげれば良いのですが、一度でも内部のコンポーネントに(クリックするなど)フォーカスを設定すると、フォーカスをフレームに再設定する仕掛けを用意しておく必要があります。
- - -
import java.awt.*;
import java.awt.event.*;

public class Test extends KeyAdapter {

Frame frame;
List list;

public static void main(String args[]) {
new Test();
}

public Test() {
list = new List();
list.add("apple");
list.add("orange");
list.add("banana");
list.removeKeyListener(this);

frame = new Frame("Test");
frame.add(list);
frame.setSize(400, 300);
frame.setLocation(100, 100);
frame.addKeyListener(this);
frame.show();
frame.requestFocus(); // フレームにフォーカスを設定
}

public void keyPressed(KeyEvent e) {
System.out.println("key pressed.");
}

}

こんにちは。
おそらくフォーカスの問題だと思います。
フォーカスをフレームに設定してあげれば良いのですが、一度でも内部のコンポーネントに(クリックするなど)フォーカスを設定すると、フォーカスをフレームに再設定する仕掛けを用意しておく必要があります。
- - -
import java.awt.*;
import java.awt.event.*;

public class Test extends KeyAdapter {

Frame frame;
List list;

public static void main(String args[]) {
new Test();
}

public Test() {
list = new List();
list....続きを読む

Qjava.lang.NullPointerException

java初心者です。
*******************************************
Exception in thread "main" java.lang.NullPointerException
at Region2.<init>(Region2.java:7)
at Region2.main(Region2.java:11)
*******************************************
というエラーで困っています。
ソースは、
*******************************************
import java.io.*;

public class Region2 {
 public Test[] t = new Test[10];

 public Region2(){
  t[0].x = 1;//ココ
  System.out.println(t[0].x);
 }
 public static void main(String[]args){
  Region2 reg = new Region2();//ココ
  System.out.println(reg.t[0].x);
  System.exit(0);
 }
}
class Test{
 public int x;

 public Test (int x){//xをセット
  this.x = x;
 }
 public void Show () {//xを表示
  System.out.println(x);
 }
}
****************************************

見ての通りのプログラムで、あまり意味のないものですが、オブジェクトの配列の動作をテストしています。でずが、「ココ」とコメントしたところでたたかれてしまいます。私は恥ずかしながら「え?何でダメなの?」という感じです。

何がいけないのか、もしくはどうすれば、
1
1
と表示されるか、どなたかアドバイスください。

java初心者です。
*******************************************
Exception in thread "main" java.lang.NullPointerException
at Region2.<init>(Region2.java:7)
at Region2.main(Region2.java:11)
*******************************************
というエラーで困っています。
ソースは、
*******************************************
import java.io.*;

public class Region2 {
 public Test[] t = new Test[10];

 public Region2(){
  t[0].x = 1;//ココ
  System.o...続きを読む

Aベストアンサー

今アルコール入ってるんで、
回答の妥当性はそちらでチェックしてくださいね。

これは
public Test[] t = new Test[10];
のところで、「配列tができた」と思っていたところが
できていなかったのが原因です。

Javaのオブジェクトというのは、宣言しただけでは使えなくて、
newしなくてはならないというのはおわかりですね?
つまり、Abcというクラスがあった場合、
Abc a;
だけでは使えなくて、
Abc a = new Abc();
のようにしなくてはなりません。

配列を宣言したというのは、
「配列の変数を宣言しただけ」なのです。
「Javaの配列はテーブルタップのようなもの」
というたとえがあります。
テーブルタップには、実際に使う電化製品をつながないといけません。

public Test[] t = new Test[10];
では、「配列の変数が宣言された」だけです。

具体的には、
t[0] = new Test(...);
t[1] = new Test(...);
...
t[9] = new Test(...);
のようにします。こうしないと、配列の要素の各オブジェクトは存在しません。
(for(int i = 0; i < 10; i++){
t[i] = new Test(...);
}
でもいい。)

t[0].x = 1;
のところでは、存在しないオブジェクトのフィールドに値を代入しています。
だからエラーになります。

今アルコール入ってるんで、
回答の妥当性はそちらでチェックしてくださいね。

これは
public Test[] t = new Test[10];
のところで、「配列tができた」と思っていたところが
できていなかったのが原因です。

Javaのオブジェクトというのは、宣言しただけでは使えなくて、
newしなくてはならないというのはおわかりですね?
つまり、Abcというクラスがあった場合、
Abc a;
だけでは使えなくて、
Abc a = new Abc();
のようにしなくてはなりません。

配列を宣言したというのは、
「配列の変数...続きを読む

Q文字列をタブ区切りで出力したい

HTMLファイルをタグごとに区切って、value属性を持つものには、value=""のダブルクオートの
中に文字列を入れて、以下のように出力させたいと思っています。


<html>
<body>
<input type="text" name="name" value="出力させたい値">
</body>
</html>


そのため、以下のクラスを作成しました。

public class Sample {

private static final String findValue = "value=\"";
private static final int valueLen = findValue.length();

public static void main(String[] args) {

String html = "<html><body><input type=\"text\" name=\"name\" value=\"\"></body></html>";

StringBuffer sb = new StringBuffer(html);
int tagStart = sb.indexOf("<");
int tagEnd = sb.indexOf(">") + 1;
if (tagStart >= 0 && tagEnd > 0) {
String tag = sb.substring(tagStart, tagEnd);
System.out.println("tag : " + tag);
int valueIndex = tag.indexOf(findValue) + valueLen;// パラメータ挿入開始位置

if (valueIndex > valueLen) {
String tagLeft = tag.substring(0, valueIndex);
String tagRight = tag.substring(valueIndex, tag.length());
String ret = null;

ret = tagLeft + "あああ" + tagRight;

System.out.println("ret : " + ret);
}

}

}

}

しかしこの処理だと最初のタグしか読んでくれず、次のタグの呼び出し方が思い浮かびません。
どなたかご助言をお願いいたします。

HTMLファイルをタグごとに区切って、value属性を持つものには、value=""のダブルクオートの
中に文字列を入れて、以下のように出力させたいと思っています。


<html>
<body>
<input type="text" name="name" value="出力させたい値">
</body>
</html>


そのため、以下のクラスを作成しました。

public class Sample {

private static final String findValue = "value=\"";
private static final int valueLen = findValue.length();

public static void main(String[] args) {

String ...続きを読む

Aベストアンサー

//1つの方法
public static void main(String[] args) {
String html = "<html><body><input type=\"text\" name=\"name\" value=\"\"></body></html>";

int tagStart = 0;
int tagEnd = 0;

while(true){
tagStart = html.indexOf("<", tagEnd);
if(tagStart == -1) break;
tagEnd = html.indexOf(">", tagStart + 1) + 1;
if(tagEnd == 0) break;
String tag = html.substring(tagStart, tagEnd);
String rep = tag.replace("value=\"\"","value=\"あああ\"");
// System.out.println("tag : " + tag);
System.out.println("rep : " + rep);
}
}

//1つの方法
public static void main(String[] args) {
String html = "<html><body><input type=\"text\" name=\"name\" value=\"\"></body></html>";

int tagStart = 0;
int tagEnd = 0;

while(true){
tagStart = html.indexOf("<", tagEnd);
if(tagStart == -1) break;
tagEnd = html.indexOf(">", tagStart + 1) + 1;
if(tagEnd == 0) break;
String tag = html.substring(tagStart, tagEnd);
String rep = tag.r...続きを読む

QWord 文字を打つと直後の文字が消えていく

いつもお世話になっています。
Word2000を使っているものです。
ある文書を修正しているのですが,文章中に字を打ち込むと後ろの字が消えてしまいます。
分かりにくいですが,
「これを修正します。」
という文章の「これを」と「修正します。」の間に「これから」という単語を入れたときに,その場所にカーソルを合わせて「これから」と打つと,
「これをこれからす。」
となってしまいます。
他の文書では平気です。
何か解決する方法があれば教えて下さい。

Aベストアンサー

入力モードが「挿入」(普通の入力)から、「上書き」になってしまっているのだと思われます。
キーボードに[Insert]というキーがあると思いますので、1度押してみてください。

QJTable の 列幅を個別に設定するには

JTable の 列幅を個別に設定するには、
どのようにしたらよいのでしょうか?
APIを参照しましたが、個別に列幅を
変えられるようなメソッドは見当たらなかったのですが…

Aベストアンサー

簡単なサンプルコードを示しました。
ご参考まで。


import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class TableSample {

public static void main(String[] args) {

JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JTable table = new JTable();
table.setModel( new DefaultTableModel(100,30) );
table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );
table.getColumnModel().getColumn(3).setPreferredWidth( 150 );
table.setRowHeight( 2, 60 );
table.setValueAt( "<html>ここの列幅を150<br>行高を60にしました", 2, 3 );

frame.add( new JScrollPane(table) );
frame.setSize( 800, 400 );
frame.setVisible( true );

}
}

簡単なサンプルコードを示しました。
ご参考まで。


import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class TableSample {

public static void main(String[] args) {

JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JTable table = new JTable();
table.setModel( new DefaultTableModel(100,30) );
table.setAutoResizeMode( JTable.AUTO_RESIZE_OF...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報