こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

アプレットにテキストボックスが表示されません

 こんばんは、Java初心者です、宜しくお願いします。

 アプレットを表示、背景に画像を表示させ、テキストボックス
に文字、数字を入力するプログラムを書きました。

 背景の画像は表示されるのですが、テキストボックスは
表示されません。

 何故でしょうか、原因がよく分かりません。
宜しくお願い致します。

==============================================
public class TextboxTest extends Applet
{
MediaTracker tracker ;
Image img ;

TextTest tet ;

public void init()
{
tracker = new MediaTracker( this ) ;
img = getImage( getDocumentBase() , "../a.jpg" ) ;
tracker.addImage( img , 0 ) ;
}
public void start()
{
try
{
tracker.waitForAll();
}
catch (InterruptedException e) { }
}

public void paint( Graphics g2 )
{
g2 = getGraphics();
g2.drawImage( img , 50 , 50 , 250 , 250 , this ) ;
}


public void abc( )
{
tet = new TextTest() ;

}
}

//===================================================================

class TextTest extends Applet implements ActionListener
{
JTextField jt0 ;
Double lon = 0.0 ;

public void init()
{
setLayout( null ) ;
jt0 = new JTextField( "" ) ;
jt0.setBounds( 150 , 150 , 100 , 30 ) ;
this.add( jt0 ) ;

Button bt = new Button( "Input" ) ;

bt.setFont( new Font( "SansSerif" , Font.BOLD , 20 ) ) ;
Color d = new Color( 0xff00ff );
bt.setBackground( d ) ;
bt.setForeground( new Color( 0.0f , 0.0f , 0.0f ) ) ;
bt.setBounds( 100 , 200 , 220 , 40 ) ;

bt.addActionListener( this ) ;
this.add( bt ) ;
}

public void actionPerformed( ActionEvent ae )
{
jttest();
}

void jttest()
{
try
{
String str_lon = jt0.getText() ;
lon = Double.parseDouble( str_lon ) ;
System.out.println( "lon =" + lon ) ;
}

catch( Exception ee ) { }
}
}

投稿日時 - 2014-07-18 22:25:01

QNo.8683602

すぐに回答ほしいです

質問者が選んだベストアンサー

># この意味が読み返してみるとよく理解出来ないのですが、AWTでは、継承とかメソッドの上書きは
>出来ると思うのですが、shylockさんの回答の内容はそのような意味ではないということでしょうか。

継承やメソッドの上書きをしてもそれが機能しない、ということです。

例えば、Buttonを継承してMyButtonというクラスを作ったとします。そこにpaintメソッドをオーバーライドし、描画をして独自の表示を作ったとしましょう。

しかし、実際にこのMyButtonを組み込んで表示しても、paintで作った独自の表示はされません。Buttonの表示のままです。paintの処理はまったく機能しないのです。

AWTのコンポーネントは、JavaではなくWindowsなどのプラットフォームにあるAPIによって描画されていますので、paintをオーバーライドし、Graphicsのメソッドを呼び出しても一切描画を行うことはできないのです。描画の部分は、すべてJava以外のところで行われるので、Javaのコードでどんなに描画をしてもすべて機能しないのです。

PanelやCanvasのように、具体的な表示が実装されていないものは、paintをオーバーライドしJavaのコードで描画を行うことができます。が、ボタンやラジオボタン、チェックボックスなどのようなGUIのコンポーネントは、すべて描画はJavaの外側で行われるため、一切干渉できないのです。

投稿日時 - 2014-07-22 19:17:26

お礼

 shylockさん、回答有り難うございます。

 参考書には書いていない(書いてはいるけども私が理解できなていないのかも)貴重な回答有り難う
御座いました、目からウロコです。

 未だ未だ勉強することが一杯有りそうですが、今後とも宜しくお願いします。

 

投稿日時 - 2014-07-23 09:53:40

ANo.6

このQ&Aは役に立ちましたか?

6人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.5

># ところで、Eclipse(Ver3.7)を使ってjavaのコードを書いていますが、Eclipseからライブラリを参照することは出来るのでしょうか。

これは、どういう意味でしょうか。システムライブラリ(Javaに最初からついてくるライブラリ)であれば、そのまま使えるはずですよ。Eclipseのプロジェクトが表示されているところに「JREシステム・ライブラリー」というような項目が表示されているはずです。これがライブラリの参照です。AWTやSwingなどはこれにより使える状態となっています。

それ以外のライブラリは、ライブラリのJarファイルをプロジェクトにドラッグ&ドロップして組み込んだりできるはずです。あるいは、JREのlibフォルダ内にコピーして利用することもできます。他、プロジェクトの設定を追加してライブラリの参照を組み込むこともできます。

そのへんは、いろいろやり方があります。Eclipseは機能がかなりたくさんあるので、入門書などで勉強されると良いと思います。

投稿日時 - 2014-07-21 13:52:09

お礼

shylockさん、回答有難うございます。

Eclipseの機能について、もう少し勉強します。

ところで、No3の回答の中で、

>「コンポーネントのカスタマイズ」・・・・こうしたことがAWTではできない、ということです。

# この意味が読み返してみるとよく理解出来ないのですが、AWTでは、継承とかメソッドの上書きは
 出来ると思うのですが、shylockさんの回答の内容はそのような意味ではないということでしょうか。

宜しくお願いします。

投稿日時 - 2014-07-22 17:36:52

ANo.4

>アプレットにパネルをaddするなら、「Panel」クラスとか「Frame」クラスが「Applet」クラスの
>サブクラスになるべきのような感じがするのですが、この考えは間違っているのでしょうか。

間違っています。

継承というのは、既にあるクラスを元に、その機能を拡張して新しいクラスを作ることです。つまり、継承して作ったサブクラスのほうが、より特定の用途において高機能になるわけです。逆にいえば、継承する元になったスーパークラスのほうが、特定の用途に限定されないだけ幅広い利用が可能になります。

Panelは、コンテナ(コンポーネントを組み込むための部品)のベースとなるもので、特に何も機能はありません。それを継承して作ったAppletは、Webページに埋め込んで利用するための仕組みをPanelに追加しています。ですからWebページに埋め込むという特定用途に関してはAppletが役立ちますが、それ以外の用途では使えません。より汎用的なPanelのほうが幅広く利用できるわけです。

PanelクラスがAppletのサブクラスになるということは、PanelにもAppletの全機能が継承されている、ということになります。アプレットとは全然関係のない分野でPanelを利用する場合も、常にその中にアプレットの機能が組み込まれていることになります。それは非常に無駄なことです。幅広く利用される部品は低機能(必要最小限の機能)であるべきなのです。

例えば、「飛行機=Panel」「戦闘機=Applet」と考えてみてください。普通の飛行機を元に機能を追加して戦闘機を作ったとします。自衛隊が利用する(=Webページに埋め込んで使う)場合には戦闘機(Applet)でないといけません。それ以外の民間企業が使う場合は、飛行機(Panel)で十分です。すべての民間企業で利用する飛行機(Panel)に、戦闘機(Applet)の機能が実装されていたらまずいでしょう?

GUIクラスの組み込み状態と、継承の構造をごっちゃにして考えると混乱します。GUIの組み込みは、単なる外見上の問題に過ぎないのですから。

投稿日時 - 2014-07-21 08:25:33

お礼

 shylockさん、回答有難うございます。

 > 継承というのは、既にあるクラスを元に、その機能を拡張して新しいクラスを作ることです。
 # そうでした。
   参考書等を読んで何となく理解していたつもりでしたが、やはり継承の基本的なことを
   理解出来ていなかったようです。

 # ところで、Eclipse(Ver3.7)を使ってjavaのコードを書いていますが、Eclipseからラ
イブラリを参照することは出来るのでしょうか。

宜しくお願い致します。

投稿日時 - 2014-07-21 10:30:35

ANo.3

>何とか画像が表示されました。
> しかし、Panelの部分が、画像を隠すように(欠けるように)表示されます。
> これを解決する方法はあるのでしょうか。

それが、先の回答で説明した、AWTの制約です。AWTはネイティブコードを直接呼び出してコンポーネントの描画を行っているため、表示のカスタマイズができません。例えば、下の表示と上に重なったコンポーネントを透過させたり融合させたりすることはできないのです。

Panel部分の画像が隠されてしまうのを避けたいのであれば、設計を変更するしかありません。現在、AppletにPanelを組み込み、その中にTextFieldなどを組み込んでいますね? これを、Appletに直接TextFieldを組み込むような形に作りなおすしかありません。(つまり、Panelを使わないようにします)

既にTextFieldをAppletに組み込むことはできるのですから、これをAppletに直接組み込むようにすることはあなたにもできるはずです。頑張ってみてください。


># これ("ネイティブコードで実装"、"コンポーネントの内部の描画などをカスタマイズ")は具体的には
> どの様な意味でしょうか。

「ネイティブコードで実装」というのは、OSに依存するコードで実装している、という意味です。Javaのプログラムは、Java仮想マシンというプログラム内で実行されることはご存知と思います。Javaのプログラムは、すべてこの仮想マシンのCPU(ソフトェア的に作られたCPUのエミュレータですね)が処理するコードとして作られています。

が、AWTコンポーネントのグラフィック描画に関する部分は、Java仮想マシンの外側のOSにある機能を直接呼び出して実行しているのです。たとえばWindowsなら、WindowsのAPIを呼び出して直接描いています。

描画の処理がJava仮想マシンの外部で行われるということは、Java仮想マシン内からその部分にアクセスできないということです。つまり、Javaのプログラムでは扱えない機能でできている、ということです。

「コンポーネントのカスタマイズ」というのは、具体的にはコンポーネントクラスを継承して新しいクラスを作る、ということです。Swingなら、例えばJButtonを継承したクラスを作り、そこに描画処理のメソッドをオーバーライドすることで、表示をカスタマイズしたJButtonを作れます。こうしたことがAWTではできない、ということです。

投稿日時 - 2014-07-20 18:39:02

お礼

 shylockさん、回答有難うございます。

 # AWTコンポーネントのグラフィック描画に関する内容等については、もう少し自分で勉強してみます。

 # ところで、色々と参考書を読むと「Applet」クラスは「Panel」クラスのサブクラスとなっていま
  すが、プログラムでは、アプレットにパネルをaddする書き方となります。
   勿論クラスの構成?とプログラムの書き方は違うのかも知れませんが、何か奇異な感じがします。

   アプレットにパネルをaddするなら、「Panel」クラスとか「Frame」クラスが「Applet」クラスの
  サブクラスになるべきのような感じがするのですが、この考えは間違っているのでしょうか。

 以上宜しくお願いします。

投稿日時 - 2014-07-21 00:01:14

ANo.2

># init()の中で、add(tet)と変更してtetを呼んでいますが、やはり表示されません。
> どこが原因でしょうか。

・TextboxTestのinitでadd(tet);していますが、サイズが設定されていません。tet.setSize(400,300);みたいな感じで大きさを設定する必要があります。

・TextTestの初期化処理をinitメソッドに書いてありますが、初期化時にinitが呼び出されるのはAppletだからです。Panelならば、initではなくコンストラクタで初期化をするか、あるいはtet = new TextTest();した際にtet.init();を呼び出して初期化をしてやる必要があります。

とりあえず、上記の2点を確認して下さい。


>GUIライブラリが異なりますから混在すべきではありません
# ライブラリの混在は良くないのは何となく理解出来るのですが、
 具体的にはどのような理由でしょうか。?
 ライブラリとOS間との処理方法、手順等が違っているということでしょうか。

ライブラリの使い方が間違っている、ということです。
AWTは、GUIのもっとも基本的なライブラリで、描画関係をネイティブコードで実装しています。このため、コンポーネントの内部の描画などをカスタマイズできません。

この欠点をなくすために作られたのがSwingで、こちらはコンポーネントの描画処理をすべてpure Javaで実装しています。これによりJavaで描画をカスタマイズできます。

仕組みが異なるものですので、混在は避けるべきです。Swing自体はAWTを継承して作られていますので、混在して組み込むこともできないわけではないのですが、仕組みが異なるものを無理やり組み込むことでトラブルの温床となりかねないので、初心者のうちはなるべくさけたほうが賢明です(不必要にトラブルの要因を自ら作るべきではない、という意味です)。

投稿日時 - 2014-07-20 11:58:49

お礼

 shylockさん、回答有難うございます。

 何とか画像が表示されました。
 しかし、Panelの部分が、画像を隠すように(欠けるように)表示されます。
 これを解決する方法はあるのでしょうか。


> 描画関係をネイティブコードで実装しています。
このため、コンポーネントの内部の描画などをカスタマイズできません。

# これ("ネイティブコードで実装"、"コンポーネントの内部の描画などをカスタマイズ")は具体的には
 どの様な意味でしょうか。

 宜しくお願いします。

投稿日時 - 2014-07-20 13:03:26

ANo.1

コードを見ただけで、実際に動作確認してはいませんが、気がついた点を。

まず、なんでAppletの中にAppletを組み込むの?というのが最初の印象です。まぁ、Appletはコンテナですから組みこないことはないでしょうが、意味がないでしょう。中に組み込むのはAppletなど使わず、Panelなどに変えるべきです。

次に、なんでAppletにJTextFieldを組み込むの?という疑問。Appletはawtであり、JTextFieldはSwingです。GUIライブラリが異なりますから混在すべきではありません。JTextFieldをTextFieldに変えるか、あるいはAppletとButtonをJApplet、JButtonに変えるか、どちらか一方だけ使うようにして下さい。

最後に、GUIが表示されない直接の原因ですが。アプレットのabcメソッド、どこからも呼び出されていませんから実行されません。initなどからabcを呼び出してやらないと実行されませんよ。そしてメソッドの中身、new TextTest() でインスタンスを作ってはいますが、どこにもaddして組み込んでいません。作成したインスタンスはアプレットのaddを呼び出して組み込んでください。

以上の点を改良してみてください。

投稿日時 - 2014-07-19 21:07:55

お礼

shylockさん、回答有難うござます。

# init()の中で、add(tet)と変更してtetを呼んでいますが、やはり表示されません。
 どこが原因でしょうか。

>GUIライブラリが異なりますから混在すべきではありません
# ライブラリの混在は良くないのは何となく理解出来るのですが、
 具体的にはどのような理由でしょうか。?
 ライブラリとOS間との処理方法、手順等が違っているということでしょうか。

 宜しくお願いします。

===============================================================

public class TextboxTest extends Applet
{
MediaTracker tracker ;
Image img ;

TextTest tet ;

public void init()
{
tracker = new MediaTracker( this ) ;
img = getImage( getDocumentBase() , "../a.jpg" ) ;
tracker.addImage( img , 0 ) ;

tet = new TextTest() ;
add(tet);
}

public void start()
{
try
{
tracker.waitForAll();
}
catch (InterruptedException e) { }
}

public void paint( Graphics g2 )
{
g2 = getGraphics();
g2.drawImage( img , 50 , 50 , 250 , 250 , this ) ;
}
}

//===================================================================

class TextTest extends Panel implements ActionListener
{
TextField t0 ;
Double lon = 0.0 ;

public void init()
{
setLayout( null ) ;
t0 = new TextField( "" ) ;
t0.setBounds( 150 , 150 , 100 , 30 ) ;
this.add( t0 ) ;

Button bt = new Button( "Input" ) ;

bt.setFont( new Font( "SansSerif" , Font.BOLD , 20 ) ) ;
Color d = new Color( 0xff00ff );
bt.setBackground( d ) ;
bt.setForeground( new Color( 0.0f , 0.0f , 0.0f ) ) ;
bt.setBounds( 100 , 200 , 220 , 40 ) ;

bt.addActionListener( this ) ;
this.add( bt ) ;
}

public void actionPerformed( ActionEvent ae )
{
ttest();
}

public void ttest()
{
try
{
String str_lon = t0.getText() ;
lon = Double.parseDouble( str_lon ) ;
System.out.println( "lon =" + lon ) ;
}

catch( Exception ee ) { }
}
}

投稿日時 - 2014-07-20 10:00:45

あなたにオススメの質問