- ベストアンサー
JTextFiledの割込み処理(その2)
- JTextFiledの割込み処理について、マウスの割込みルーチンで第2行目と第3行目を同じ方式のコードを作成しました。
- 第2行目のUp0,Up1....Up20に関しては、バックグランドの色の変更ができました。
- しかし、第3行目のLw0,Lw1....Lw20に関しては、実行時にエラーが発生し、色の変更ができませんでした。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
以下をよく見ましょう。 static int HColor[]=new int[21]; //+する事 // ……(中略)…… for(int i=0; i<42; i++){ dataUpLw[i] = new JTextField(s_dataUpLw[i]); } // ……(中略)…… switch(HColor[fieldIndex]){ // ……(中略)…… for (int i = 0; i <dataUpLw.length; i++) { dataUpLw[i].addMouseListener(new DataUpMouseListener(i)); } ついでに、 static JTextField[] dataUpLw = new JTextField[42]; //下記の行を纏める //static JTextField[] dataLw = new JTextField[21]; いや、俺確かに「一つにまとめられることは一つにしましょう」とは言ったけど、一つにまとめちゃいかん物を一つにしたらだめでしょう。 これらは表示上では2行に分けて表示するものなんだから。 とりあえず、HColor[] のそれぞれの値をクリック周り以外で使わないなら、前とは違うけど DataUpMouseListener はこうすべきでしょう。 class DataUpMouseListener extends java.awt.event.MouseAdapter { private JTextField owner; private int hColor = 0; public DataUpMouseListener(JTextField owner) { this.owner = owner; } @Override // オーバーライドするメソッドにはこれを忘れないように。 public void mouseClicked (java.awt.event.MouseEvent evt) { if(evt.getClickCount () == 1) { //System.out.println("Click"); } else if(evt.getClickCount () == 2) { mouseDoubleClicked (evt); //System.out.println("Double Click"); } } void mouseDoubleClicked (java.awt.event.MouseEvent evt) { switch(hColor){ case 0: hColor=1; owner.setBackground(java.awt.Color.GREEN); break; case 1: hColor=0; owner.setBackground(java.awt.Color.WHITE); break; default: break; } owner.setText(owner.getText()); } } さらに言えば、hColor が 0 と 1 以外にならないなら 2 値で十分なので true と false でいいでしょう。 -------------------------------------------------------------------------- あと、前回は言わなかったことですが、 > //staticでok というのはクラス設計の上で大きな間違いです。 static なフィールド・メソッドはそのクラス全体で保持すべきもののためにあるものです。 今回のテキストフィールドは……って、これは……まあ、この件はとりあえず後回しで…… 今回のテキストフィールドは、明らかに表示しようとするフレームのインスタンスが保持しているべきものです。したがって、これらはそのフレームのクラスの非 static なフィールドとして保持すべきです。 で、上で「とりあえず後回し」にしていた点について。 あなたのプログラムでは JFrame を素の状態でインスタンス生成してそれに対してそのフレームの外からコンポーネント設定を行っていますが、それもまた問題です。 自分なら JFrame を extends したクラスを作成し、そのコンストラクタで自身にコンポーネント設定を行います。 そうすることで、表示だけの変更に対して修正する箇所がそのフレームクラスだけに絞られることになります。 # たとえば表示を JTable に切り替えるとか またそうすれば、この場合の EventSample2 はフレームに関しては生成と全体の表示を気にするだけで済みます。 まあそうしても多分今度はデータの更新とその表示で悩むでしょうが、とりあえず上記のことが飲み込めるまで左記については「そんな問題が出るだろう」と気に留める程度にしてください。
お礼
補足コメントで、hitomuraさんの改良(割込みでownerを使用するもの)が、コンパイルエラー にると連絡しましたが、その後、貴方の指摘された『以下をよく見ましょう』を再確認しました所 不具合箇所(下記参照)がありましたので、定数21を42に変更しました所、第2行目と3行目の TextFieldの背景色の変更が可能となりました。 ================== static int HColor[]=new int[42]; //<---21を42に変更 public static void main(String[] args) { JFrame frame = new JFrame("イベントのサンプル"); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); a=Math.PI; for (int i=0; i<42; i++){ //<---21を42に変更 HColor[i]=0; } ====================== その他の貴方の指摘の『static』の件と『JFrameをextendsしたクラスを作成し』の件に 付きまして、現在考えています。 今後の展開: JTextFieldは、Nouseに作成する予定です。そして、Westのには、comboBox群 を作成し、CenterにはJTable等を作成し、Eastには、グラフィックスのcanvasを作成し、 southには、オペレーション用のボタンとかチェックボックスを作成する予定です。 上記の今後の展開を行うために、その他の貴方の指摘が重要になってくると考えています。 最後に、初期の目的がお陰で達成できました事に感謝いたします。 以上
補足
早速の、お教え有難うございます。 ご指摘の様に、コードを変更しましたが、ダブルクリックでMoouseClickedには制御が 来ない様です(バックグランドの色変更は無し)。 また、class dataUpMouseListner....に警告ランプが付きました。 改良後のコードを下記に添付致しますので、コメント頂けますと大変あり難いです。 =============== package pkg; import static java.lang.Math.*; public class EventSample2 { static public double a=PI; // コンポーネントを作成 static JTextField[] titlen = new JTextField[21]; static JTextField[] dataUpLw = new JTextField[42]; //下記の行を纏める // static JTextField[] dataLw = new JTextField[21]; static JTextField[] dataMsr = new JTextField[21]; static String[] s_title={"t0","t1","t2","t3","t4","t5","t6","t7","t8","t9","t10","t11", "t12","t13","t14","t15","t16","t17","t18","t19","20"}; static String[] s_dataUpLw={"Up0","Up1","Up2","Up3","Up4","Up5","Up6","Up7","Up8","Up9","Up10","Up11", "Up12","Up13","Up14","Up15","Up16","Up17","Up18","Up19","Up20", "Lw0","Lw1","Lw2","Lw3","Lw4","Lw5","Lw6","Lw7","Lw8","Lw9","Lw10","Lw11", "Lw12","Lw13","Lw14","Lw15","Lw16","Lw17","Lw18","Lw19","Lw20"}; static String[] s_dataMsr={"Msr0","Msr1","Msr2","Msr3","Msr4","Msr5","Msr6","Msr7","Msr8","Msr9","Msr10","Msr11", "Msr12","Msr13","Msr14","Msr15","Msr16","Msr17","Msr18","Msr19","Msr20"}; static int HColor[]=new int[21]; //+する事 public static void main(String[] args) { JFrame frame = new JFrame("イベントのサンプル"); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); a=Math.PI; for (int i=0; i<21; i++){ HColor[i]=0; } // コンポーネントを作成 for(int i=0; i<21; i++){ titlen[i] = new JTextField(s_title[i]); } for(int i=0; i<42; i++){ dataUpLw[i] = new JTextField(s_dataUpLw[i]); } for(int i=0; i<21; i++){ dataMsr[i] = new JTextField(s_dataMsr[i]); } for(int i=0; i<21; i++){ titlen[i].setBackground(java.awt.Color.LIGHT_GRAY); //staticでok } // 一つにまとめられることは一つにしましょう<---感謝 class DataUpMouseListener extends java.awt.event.MouseAdapter { private JTextField owner; private int hColor; public DataUpMouseListener(JTextField owner) { this.owner = owner; } @Override public void mouseClicked (java.awt.event.MouseEvent evt) { if(evt.getClickCount () == 1) { System.out.println("Click"); } else if(evt.getClickCount () == 2) { mouseDoubleClicked (evt); System.out.println("Double Click"); } } void mouseDoubleClicked (java.awt.event.MouseEvent evt) { switch(hColor){ case 0: hColor=1; owner.setBackground(java.awt.Color.GREEN); break; case 1: hColor=0; owner.setBackground(java.awt.Color.WHITE); break; default: break; } owner.setText(owner.getText() ); } } // dataUpLw.length=42となっている System.out.println("dataUpLw.length="+dataUpLw.length); for (int i = 0; i <dataUpLw.length; i++) { // dataUpLw[i].addMouseListener(new DataUpMouseListener(i)); //エラーに付きコメント化 } // コンポーネントを登録 frame.getContentPane().setLayout(new GridLayout(4, 21)); for(int i=0; i<21; i++){ frame.getContentPane().add(titlen[i]); } for(int i=0; i<42; i++){ frame.getContentPane().add(dataUpLw[i]); } for(int i=0; i<21; i++){ frame.getContentPane().add(dataMsr[i]); } frame.setSize(900, 160); frame.setVisible(true); } } 以上、宜しくお願いします。