- PR -

キーイベントの具体的な方法が分かりません。

投稿者投稿内容
bardon
会議室デビュー日: 2008/05/16
投稿数: 6
お住まい・勤務地: 兵庫県
投稿日時: 2008-05-16 09:18
初めまして、Javaを始めて1ヵ月の者です。現在、書籍を読みながら色々とサンプルプログラムを改造しながら、力を付けて行ければ考えてやっているのですが、やはり基本が出来てないからなのでしょうが、躓いております。そこで具体的な方法を詳しい方に教授して頂きたく、書き込みました。

本題ですが、現在、JFrameにGridBagLayoutを組み込んで綺麗に表を作るサンプルがあります。以下のようなコードで始まります。

public class table extends JFrame {



table() {
GridBagLayout layout = new GridBagLayout();
layout.columnWeights = new double[3];
            ・
            ・ 
            ・

           (途中省略します。)
            ・
            ・
JLabel lblx2y0 = new JLabel("利益");
lblx2y0.setBorder( BorderFactory.createRaisedBevelBorder());
gbc.fill = GridBagConstraints.HORIZONTAL;
layout.setConstraints(lblx2y0, gbc);
add(lblx2y0);

JLabel lblYear[] = new JLabel[5];
for (int i=0; i<5; i++) {
gbc.gridx = 0; gbc.gridy = i+1; gbc.gridwidth = 1; gbc.gridheight = 1;
lblYear[i] = new JLabel( String.format("%d", 2005 + i) );
lblYear[i].setHorizontalAlignment(SwingConstants.CENTER);
lblYear[i].setBorder( BorderFactory.createRaisedBevelBorder());
gbc.fill = GridBagConstraints.HORIZONTAL;
layout.setConstraints(lblYear[i], gbc);
add(lblYear[i]);
}

JTextField txt[][] = new JTextField[2][5];
for (int x=0; x<2; x++) {
for (int y=0; y<5; y++) {
txt[x][y] = new JTextField(20);txt[x][y].setHorizontalAlignment(SwingConstants.CENTER); gbc.gridx = x + 1; gbc.gridy = y + 1; gbc.gridwidth = 1; gbc.gridheight = 1; gbc.fill = GridBagConstraints.HORIZONTAL; layout.setConstraints(txt[x][y], gbc); add(txt[x][y]);
}
}

setSize(280, 180);
setVisible(true);
}

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

protected void processEvent(AWTEvent e) {
if(e.getID() == WindowEvent.WINDOW_CLOSING)
System.exit(0); //フレームが閉じたらプログラム終了
}
}

で終わります。こんな感じのサンプルプログラムがあるのですが、これが実行すると
年間の売上表になるのですが(売り上げと利益が打ち込めます。)、この項目(JTextFiled)が、一つの関数のの中に入って居て、自動生成される為、キーイベント(具体的にはENTERキーで項目移動する)の組み込み方、ロジック?が分からずに居り一週間ほど彼是とやってみたのですが、コンパイルすら通らなくお手上げ状態に陥り、余りに初歩的な質問で大変、お恥ずかしいのですが、ご助言頂けないかと思い書き込みました。申し訳御座いませんが、アドバイスだけでも頂けませんでしょうか?不躾では御座いますが、宜しくお願い致します。

ranco
大ベテラン
会議室デビュー日: 2007/11/02
投稿数: 112
投稿日時: 2008-05-16 10:34
Java GUIのフォーカス制御は、簡単なのから高度なものまで、いろんな方法がありますが、ここではTABではなくENTER打鍵で次のテキストフィールドにキーフォーカスを与えたいだけなら、テキストフィールドのActionListenerの中で次のテキストフィールドのrequestFocusInWindow()を呼べばいいでしょう。
bardon
会議室デビュー日: 2008/05/16
投稿数: 6
お住まい・勤務地: 兵庫県
投稿日時: 2008-05-16 11:37
初めまして、ranco様。
早速のご助言、有難う御座います。まだ今ひとつ理解しておりませんが、ctionListenerとrequestFocusInWindow()がキーポイントなのですね。有難う御座います。

もう一度、上記2つをキーに再トライしてみます。有難う御座いました。
また泣き言を申すかも知れませんが、その際は、またご助言、お願い致します。

# しかし途中省略したから何ですが、最初の投稿に載せたサンプルプログラム、私には
# 難易度が滅茶苦茶、高度過ぎます。


ranco
大ベテラン
会議室デビュー日: 2007/11/02
投稿数: 112
投稿日時: 2008-05-16 12:48
> 難易度が滅茶苦茶、高度過ぎます。
ていうか、こんなきたねー、古いコードが、日本の現場では通用してんの?
とくに、tableというクラス名は最悪!。

ただし、難しく感じるのは、GridBacConstraintsを使い慣れていない人だけでしょう。
bardon
会議室デビュー日: 2008/05/16
投稿数: 6
お住まい・勤務地: 兵庫県
投稿日時: 2008-05-16 13:39
ranco様

>ていうか、こんなきたねー、古いコードが、日本の現場では通用してんの?
>とくに、tableというクラス名は最悪!。

その様です....何せ藁にも縋る思いで買った「プロもご用達...」というアピール付きの「逆引きハンドブック Java」っていう本に載ってたコードですので....A^^;
私にはよく分かりませんが。

GridConstraintsもキーワードなんですね....これもじっくり時間を掛けて勉強して行きたいと思います。
bardon
会議室デビュー日: 2008/05/16
投稿数: 6
お住まい・勤務地: 兵庫県
投稿日時: 2008-05-17 17:46
続けて様に申し訳在りません。やはり色々と試してみたのですが、どうにも手詰まりなので教えて下さい。文法間違いのエラーが出ているので極々、基本的な間違いなのでしょうが、当該部分のコードとエラー内容を貼り付けますので、手解きして頂けませんでしょうか?申し訳御座いませんが宜しくお願い致します。

-------コード始まり-------

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class table extends JFrame {

table() {
GridBagLayout layout = new GridBagLayout();
            ・
            ・
          (途中省略)
            ・
    JTextField txt[][] = new JTextField[2][5];

for (int x=0; x<2; x++) {
for (int y=0; y<5; y++) {
txt[x][y] = new JTextField(8);
txt[x][y].setHorizontalAlignment(SwingConstants.CENTER);
gbc.gridx = x + 1;
gbc.gridy = y + 1;
gbc.gridwidth = 1;
gbc.gridheight = 1;
gbc.fill = GridBagConstraints.HORIZONTAL;
layout.setConstraints(txt[x][y], gbc);
/*add(txt[x][y]);*/
}

}
txt[][].addActionListener(this);
txt[][].addKeyListener(this);

setSize(280, 180);
setVisible(true);
}

public class MyListener implements ActionListener,KeyListener{
public void actionPerformed(ActionEvent e){
requestFocusInWindow();
}

public void keyReleased(KeyEvent e) {
if(KeyEvent.VK_ENTER == e.getKeyCode()) {
requestFocusInWindow();
}
}
}


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

protected void processEvent(AWTEvent e) {
if(e.getID() == WindowEvent.WINDOW_CLOSING)
System.exit(0); //フレームが閉じたらプログラム終了
}
}
------コード終わり--------        

--------エラー内容------
table.java:74: classがありません。
          txt[][].addActionListener(this);
^
table.java:74: ';'がありません。
          txt[][].addActionListener(this);
^
table.java:75: classがありません。
          txt[][].addKeyListener(this);
^             
table.java:74: ';'がありません。
          txt[][].addKeyListener(this);
^
--------エラー内容終わり----------

以上です。汚いコードを更に汚くしてしまって申し訳御座いませんが、宜しくお願い致します。




お散歩
会議室デビュー日: 2008/04/14
投稿数: 6
お住まい・勤務地: 東京都
投稿日時: 2008-05-17 22:59
初めまして。お散歩です。

プログラムとエラーメッセージを見せていただいたのですが、
TextField txt[][] = new JTextField[2][5]; の宣言を
以下の様にされてはいかがですか?

public class table extends JFrame {
TextField txt[][] = new JTextField[2][5];
table() {

プログラム内の各種メソッドで使用されるオブジェクト変数の宣言文を
全て table(){ コンストラクタの前に記述し、メソッドの中では値の変更のみを行うようにすると良いかも知れません。
私も以前、このようなエラーを経験しており、上記の対処をした所、
現在bardonさんのプログラムで出ているようなエラーはなくなった経験があります。

私の場合こんな感じで作ってます。
public class クラス名 extends JFrame implements ActionListener{
JButton Button_01;
JPanel jp = new JPanel();
コンストラクタ名(){
jp.setLayout(null);
Button_01 = new JButton(Button_01);
Button_01.addActionListener(this);
jp.add(Button_01);
getContentPane().add(jp, BorderLayout.CENTER);
}
public void actionPerformed(ActionEvent e){
}
}
bardon
会議室デビュー日: 2008/05/16
投稿数: 6
お住まい・勤務地: 兵庫県
投稿日時: 2008-05-18 07:45
初めまして。お散歩さま。
お早う御座います。

返事が遅くなり大変、申し訳御座いませんでした。
ご教授頂き、有難う御座います。

只今、ご教示頂いた様に改造をしています。
仰られるようにエラーの内容が変わりました。
コンパイルは通る様になったのですが、実行不能に陥ってしまいました。
もう少し弄ってみます。また結果が出ましたら書き込みたいと思います。

スキルアップ/キャリアアップ(JOB@IT)