はじめに

  1. 現在運用テスト段階のSwingアプリがありまして、昨日お客さんから【優先度高】の変更依頼あり*1。その下調べ(←休日に技術検証なんてなんて良い社員だ!!*2)
  2. どういう画面かというと
    • テキストフィールドがたくさん並んでいる画面で、
      1. 既存の情報を読み込んできて、
      2. 人間が少し変更して、
      3. バッチ処理に流す。
    • まぁ電話オペレーターの受注処理画面みたいなものを想像してください
  3. どういう変更依頼かというと
    • tabキーで入力項目を変更したい(これはSwingで実装すると自然にそうなる)
    • tabキーでフォーカスが移ったときに、入力項目が全選択状態になってほしい
      • 現状ではいったん Back Space キーなどで消してから人間が変更値を入力

どうするか

  1. 現在使っている javax.swing.JTextField? を継承して、フォーカスが移ったときに全選択状態になる com.fuj(伏せ字).JTextField? を作成
    package com.snail.gui;
    
    import java.awt.event.FocusEvent;
    import java.awt.event.FocusListener;
    
    import javax.swing.text.Document;
    
    public class JTextField extends javax.swing.JTextField implements FocusListener{
    	public JTextField() {
    		this.addFocusListener(this);
    	}
    
    	public JTextField(String text) {
    		super(text);
    		this.addFocusListener(this);
    	}
    
    	public JTextField(int columns) {
    		super(columns);
    		this.addFocusListener(this);
    	}
    
    	public JTextField(String text, int columns) {
    		super(text, columns);
    		this.addFocusListener(this);
    	}
    
    	public JTextField(Document doc, String text, int columns) {
    		super(doc, text, columns);
    		this.addFocusListener(this);
    	}
    
    	public void focusGained(FocusEvent e) {
    		this.selectAll();
    	}
    
    	public void focusLost(FocusEvent e) {
    	}
    
    }
    
  2. 現状のソースコードのimport宣言を全置換
    :g/javax.swing.JTextField /s//com.fuj(伏せ字).JTextField /g

実験

  1. 改修前
    • Eclipse Visual Editor で、じゃりっと以下のようなアプリを作る
      ・・・
      import javax.swing.BorderFactory;
      import javax.swing.JButton;
      import javax.swing.JFrame;
      import javax.swing.JLabel;
      import javax.swing.JPanel;
      import javax.swing.JTextField;
      
      import javax.swing.SwingUtilities;
      import javax.swing.border.TitledBorder;
      
      public class TextBoxExam extends JFrame {
      
      	private static final long serialVersionUID = 1L;
      	private JPanel jPanel = null;
      	private JTextField jTextField1 = null;
      	private JTextField jTextField2 = null;
      	private JLabel jLabel = null;
      ・・・
    • フォーカスが移ると、キャレット*3がテキストフィールドに表示されている文字列の最後につくが、選択状態にはならない。
      jtxt1.png
  2. import宣言だけ換えてやると
    ・・・
    import javax.swing.BorderFactory;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    //import javax.swing.JTextField; // ここだけ換える
    import com.snail.gui.JTextField; // ここだけ換える
    
    import javax.swing.SwingUtilities;
    import javax.swing.border.TitledBorder;
    
    public class TextBoxExam extends JFrame {
    
    	private static final long serialVersionUID = 1L;
    	private JPanel jPanel = null;
    	private JTextField jTextField1 = null; // ここは換えなくて良い
    	private JTextField jTextField2 = null; // ここは換えなくて良い
    	private JLabel jLabel = null;
    ・・・
    • tabキーでフォーカスが移ると、全選択状態になる。ユーザが何か入力すると現在の値は消える。*4
      jtxt2.png

Java#GUI


*1 というか何で全くそのシステムを知らないオレに変更作業をやらせる?
*2 まぁ勤務中にやったものをここには載せられませんが・・・それにいつまで会社があるかわからないんで手に職をつけておいた方が・・・
*3 入力可能位置を示す記号 Windowsでは | 。UNIXでは _ など
*4 目出度シ目出度シ

添付ファイル: filejtxt2.png 609件 [詳細] filejtxt1.png 635件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS   sitemap
Last-modified: 2006-09-24 (日) 20:02:27 (3723d)
ISBN10
ISBN13
9784061426061