- PR -

swing if文が引っかからない

1
投稿者投稿内容
ryu
会議室デビュー日: 2004/07/29
投稿数: 4
投稿日時: 2004-07-29 18:02
初めましてryuと言います、今Swingのサンプルを弄っていたのですが、
おかしな場所がでてきて困っています。
問題の場所は下のコメントで囲ってある部分//-----問題の場所
の所なのですが、ElementからgetAttributeを取得して
その変数を3回 instanceof で DefaultButtonModelと比較しているだけなのですが
どうしても結果が HIT0とHIT2しかでないのです。
submit+=1 になっていると言うことは HIT1 も表示されるはずなんですが・・・。
似たような動きでもいいので何か知っていましたら教えてください



import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;
import javax.swing.event.*;
import javax.swing.text.html.*;
import java.util.*;

public class Form2 extends JFrame {
JEditorPane html;

String htmlText =
"<html><body><form action=aaa method=post>" +
"名前: <input type=text name=$1 ><p>" +
"パスワード: <input type=password name=$2 ><p>" +
"コメント: <textarea rows=8 cols=40 name=$3 > 備考 </textarea><p>" +
"選択1: <select name=$4><option value>aaaaa<option value>bbbbb<option value>cccc</select><p>" +
"選択2: <select name=$5 size=2><option>aaaaa<option>bbbbb<option>cccc<option>ddddd</select><p>" +
"ラジオボタン: <input type=radio name=$6 value>111 " +
" <input type=radio name=$7 value>222 <p>" +
"チェックボックス: <input type=checkbox name=$8 value>111 " +
" <input type=checkbox name=$9 value>222 <p>" +
" <input type=submit name=$10 value=OK> " +
" <input type=reset name=$11 value=Cancel> " +
"</form></body>" ;

public static void main(String[] args) {
Form2 frame = new Form2( "Form2" );
frame.setDefaultCloseOperation(3); // EXIT_ON_CLOSE
frame.setSize( 400, 600 );
frame.setVisible( true );
}
Form2( String title ){
super( title );
Container pane = getContentPane();
html = new JEditorPane( "text/html", htmlText );
pane.add( html );

Document doc = html.getDocument();
getAction( doc.getDefaultRootElement() );
}
int submit=0;
void getAction( Element e ){
AttributeSet aSet = e.getAttributes();
Enumeration enum = aSet.getAttributeNames();
while( enum.hasMoreElements() ){
Object o = enum.nextElement();
Object v = aSet.getAttribute( o );

//----------------------問題の場所------------------------------------------------------//
if(v instanceof DefaultButtonModel )
{
System.out.println("HIT0");
}

if( o.toString().equals("type") && v.toString().equals("submit") )
{
submit+=1 ;
if(v instanceof DefaultButtonModel )
{
System.out.println("HIT1");
}
}

if( submit!=0 && v instanceof DefaultButtonModel ){
System.out.println("HIT2");
DefaultButtonModel button = (DefaultButtonModel)v;
button.addActionListener( new CheckAction() );
}
//---------------------------------------------------------------------
}
//--------- Elementの階層を下へ再帰的に辿っていく
for( int i = 0 ; i < e.getElementCount() ; i++ ) {
getAction( e.getElement(i) );
}
}
class CheckAction implements ActionListener {
public void actionPerformed( ActionEvent e ){
System.out.println( "action from OK" );
html.setVisible(false);
}
}
}
raccoon
ベテラン
会議室デビュー日: 2002/12/18
投稿数: 58
投稿日時: 2004-07-29 20:33
べつにおかしい動作ではないと思いますよ。

おそらくryuさんは,HIT0とHIT2の表示がwhileループの
同一周回で出ていると思っているのでしょう。
本当に同一周回で出ていますか?そう思った根拠はなんですか?
(あ,swingは全然知らないんで,swingに関係ない次元で言ってます)


### 以下ひとりごと ###
# いやー,最近熱かったスレがあったためか,みなさん
# 初心者や初歩的な質問に厳しめになってるんでしょうかねぇー(^^
# わたしもちょっと躊躇したけど,2つの理由でヒントだけ出しとこっと。
# 1) ryuさんは初心者と思われるが「教えてくん」ではないと思うから
# 2) わたしは初歩的な質問に対してしか貢献できないから・・・(;;;

vincent
大ベテラン
会議室デビュー日: 2004/07/09
投稿数: 142
投稿日時: 2004-07-29 20:46
まずはこう考えます。
単に条件がfalseだから通らない確率:99%
JavaVMのバグである確率:1%

> if( o.toString().equals("type") && v.toString().equals("submit") )
の直前に
System.out.println("o = " + o.getClass().getName() + ": " + o.toString());
System.out.println("v = " + v.getClass().getName() + ": " + v.toString());
とでも書いてみて、実際にoやvにはどんな型のインスタンスが来ているのか
調べてみてください。こういうのは考えるより手を動かしたほうが速いです。

あと、どんな書式で出力されるかアテにならないtoString()を
判断材料として使うのはオススメできません。
ちゃんとキャストして値を取得したほうがいいと思いますよ。
実行時にキャストが失敗しても、そこでコードの間違いに気づくわけですし。
ryu
会議室デビュー日: 2004/07/29
投稿数: 4
投稿日時: 2004-07-30 14:04
どうも、素早いレスありがとうございます。
raccoonさんに「べつにおかしい動作ではないと思いますよ。」
と言われ、もう一度見直してみたところ、IF文の中に
IF文が入っていてif( submit!=0 && v instanceof DefaultButtonModel )
がまず引っかからないとHIT1はでませんよね・・
本当顔から火がでる程恥ずかしいです(涙
思い込みでプログラムを打ってましたすいません。

vincentさんのSystem.out.printlnを使いなんとなくの流れは把握できました。
System.out.println(---Line ○○目)と書いてデバックをして
System.out.println("o = " + o.getClass().getName() + ": " + o.toString());
System.out.println("v = " + v.getClass().getName() + ": " + v.toString());
で実行時のクラスネームが返ってくるんですね、便利な関数です。
もっとデバックのレベルを上げて行こうと思います、ありがとうございました
1

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