プロが教えるわが家の防犯対策術!

public void drawPhotograph( ) {
Graphics gra = this.getGraphics( );
if (image != null) {
x = 0; y = 0;
gra.drawImage(image,x,y,this);
}
}
この場合、graの値がnullとなり、実行時に、NullPointer
Exceptionが起こります。その原因は何なのでしょうか、また回避策はどのようにすればよいでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (3件)

 ビジュアルコンポーネントのグラフィックコンテキストが有効に取得できるのは、


そのコンポーネットが実際に画面に表示されてからです。
以下の例を実行し、コンソールに表示される文字と画面に表示されるフレームの関係を見てもらえばわかると思います。
対処法としては、キャンバスなどのグラフィックコンテキストは直接取得しないで、
paintなどが渡してくれるものを極力使うように心がけることでしょうか。

import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;

class imagecanvas extends Canvas {

private BufferedImage OSI;

public imagecanvas() {
CreateOffScreenImage();
GetCanvasGraphics(1);
setVisible(true);
GetCanvasGraphics(2);
};

private void CreateOffScreenImage() {
OSI = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB);
Graphics g = OSI.getGraphics();
g.setColor(Color.GREEN);
g.fillRect(0, 0, 100, 100);
g.setColor(Color.RED);
g.fillOval(0, 0, 100, 100);
};

public void GetCanvasGraphics(int n) {
try { Thread.sleep(3000); } catch (Exception e) {};
System.out.print(Integer.toString(n) + ":");
System.out.println(this.getGraphics() == null ? "Null" : "Not Null");
};

public void paint(Graphics g) {
g.drawImage(OSI, 0, 0, getWidth(), getHeight(), this);
};

}

public class gratest {

public static void main(String args[]) {

Frame MF = new Frame("Main Frame");
imagecanvas IC = new imagecanvas();
MF.add(IC, BorderLayout.CENTER);
MF.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent we) { System.exit(0); };
});

MF.setSize(200, 200);
MF.setVisible(true);
IC.GetCanvasGraphics(3);

System.out.print("End of Main");

};

}
    • good
    • 0

>this.setVisible(true);


>としてみましたが、やはり同じでうまくいきません。

PhotographPaneをvisibleにするのではなく、
PhotographPaneが乗っているウインドウ(UremjnFrame)のほうを
visibleにしないといけない。

ウインドウがvisibleになった後に、
PhotographPaneのgetGraphics()メソッドを呼ぶと、
うまくいく。
    • good
    • 0

>原因は何なのでしょうか



getGraphics()というのは、
ComponentクラスのgetGraphics()のこと、でいいのかな?

Component#getGraphics()がnullを返すのは、
たとえば、
(そのコンポーネントが乗っている)ウインドウがpack()されてなかったり、またはvisibleでなかったりした場合・・・だったと思う。


>また回避策はどのようにすればよいでしょうか

(そのコンポーネントが乗っている)ウインドウがpack()された後や、visibleになった後で、(そのコンポーネントに対し)getGraphics()を使えばよい。
いちばん簡単でよく使われる方法は、
(そのコンポーネントの)paint()メソッドやpaintComponent()メソッド(※swingコンポーネントの場合)の内部で、getGraphics()を呼ぶ。

一例として、
たとえば、簡単に
void paint(Graphics g) {
drawPhotograph();
}
とかやってみるだけでも、うまくいくような気がする。

この回答への補足

回答ありがとうございます。質問の説明を補足します。
JFrameを継承したコンポネントUremjnFrameに、いずれも
JPanelを継承した、4つのコンポネントを載せています。
そのうちの一つが、photographPaneです。
PhotographPane photographPane =
new PhotographPane( );
PhotographPaneクラスの中で
this.setBounds(x,y,width,heigth);
this.setLayout(null);
this.setVisible(true);
としてみましたが、やはり同じでうまくいきません。
pack( )の意味と使い方を教えて戴けないでしょうか。

私、いまインターネット通信囲碁対局 烏鷺苑名人 の開発
に着手したところです。よろしくお願いします。

補足日時:2004/03/20 07:33
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QJava、jPanelに描画する

お世話になっています。
Java言語を始め、オブジェクト指向というなれない環境にいます。(今まではBASICを利用)

今回、jPanelなるものを使い、その中に四角形などを描画したいのですが、
うまくいきません。

public void paintComponent(){
Graphics pnl = panel.getGraphics();
pnl.setColor(new Color(0,0,255));
pnl.drawOval(100,100,50,50);
}

こういう関数を作り、プログラムから呼び出しています。(フレーム作成時には表示しない)
おそらくこの辺りがダメだと思うのですが、よくわかりません。

すいませんが、jPanelの使い方を詳しく教えていただけないでしょうか。
ゲームを作る課題なのですが、ここで詰まってしまい進めません。

ご存じの方がいらっしゃいましたら、ご教授ください。
よろしくお願い致します。

Aベストアンサー

このクラスの定義をざっくり書くと、

class Frame extends JFrame{
 Jpanel panel = new Jpanel(); //描画領域
 Jpanel label = nel Jpanel("得点");
 JButton btnNewButton = new JButton("ヘルプ");

 public Frame(){
  いろいろコンポーネントを追加...
  btn.newActionListener(this);
  this.setVisible(true);★
 }

 actionPerformed(ActionEvent e){
  this.repaint(); //自身のインスタンス(フレームを再描画)
 }
}

と推測しました。★のタイミングでpaintComponent(Graphics g)が呼び出されます。引数Graphics ???(なんでもよい)は必要です。描画が必要なタイミングでpaintComponentメソッドを呼び出します。詳しくは後述。

>はよく見るカタチのサンプルですが、これは呼びださなくてもjFrameだけなら描画されていることがないですかね?^^;
回答はJPanelを想定しております。
JFrameに対して、setVisible(true)した段階では、JPanelのpaintComponentのことまで構っていないように感じられますが、きちんと伝搬されます。 contentPane.add によってJpanelをJFrameに追加しているためです。

描画の際は、描画対象となるオブジェクトの情報がGraphicsクラスに入っているため、Graphicsのインスタンスを参照します。Graphics gならば"g"がインスタンスにあたります。

>引数に何を渡しているのか、それはどうやって取得するのか……
paintComponentの引数は(Graphics g)が必須だったと思います。
"paintComponent Java" をキーワードとして検索します。JComponentのクラスに関するドキュメントが得られます。クラスドキュメントを参照する限りでは、引数Graphics gは必須です。その他の条件のpaintComponentメソッドがここに記載されていないためです。

http://docs.oracle.com/javase/jp/6/api/javax/swing/JComponent.html#paintComponent(java.awt.Graphics)
Jpanelじゃないの?という疑問が生まれると思いますが、前提をお読みください。

java.lang.Object
 └java.awt.Component ◎
  └java.awt.Container
    └javax.swing.JComponent ★
      └javax.swing.JPanel ☆

(前提)
1)お示ししたURLは★のJComponentですが、☆のJPanelから上位のクラスで定義されているメソッドを参照することができます。今回は継承と呼びます。
2)定義済みのメソッドをプログラマ自身が書き換えることができます。これをオーバーライドと言います。
3)特に定義しなくても★のpaintメソッドでpaintComponent(Graphics g)を呼ぶよう定義されているため、プログラマは、paintComponent(Graphics g)を定義すればよいことになります。

(重要)
・paintComponent(Graphics g)が発生するのは、イベントが発生して、FrameやPanelに描画の必要が生じた時です。例えばフレームの表示、サイズの変更が挙げられます。他にもあるかもしれませんが全てを把握しておりません。
JFrame.setVisible(true)を強調しているのは、これが発行されるまでJFrameに配置したコンポーネントのpaintComponentが呼ばれることがないためです。

paintComponent()と定義することはできますが、Javaは、paintComponent(Graphics g)に対して呼び出しをかけるので、定義されたメソッドは呼び出されないことになります。

プログラム上の処理が発生して、再描画が必要であれば、そのコンポーネントに対して、repaint()を起こすことになります。その延長でpaintComponent(Graphics g)が呼び出されます。repaintは◎で定義されているメソッドです。前提1に基づいて呼び出し可能となります。

>(※1)System.out.printlnでnullpointerが返ってきていないのでそう判断
これは再上位から「標準出力」をとっているだけなので、NullPointerは返りません。ハンドル(Javaではインスタンス)が取得できていることにはなりません。

>Javaにはデバイスコンテキストという概念が表に出ていないと聴きました。
インスタンスという概念で特定をします。
例えば、paintComponent(Graphics g)の場合、

paintComponentメソッドは、Graphicsクラスの gインスタンス(変数)を引数に持つ。という意味になります。デバイスハンドラやデバイスコンテキストはインスタンスになっているという認識で私はいます。
また、paintComponent()としてしまうと、引数を持たないpaintComponentメソットとなります。同時に定義することができる全く違うメソッドになってしまうので注意が必要です(多相性といいます)。

このクラスの定義をざっくり書くと、

class Frame extends JFrame{
 Jpanel panel = new Jpanel(); //描画領域
 Jpanel label = nel Jpanel("得点");
 JButton btnNewButton = new JButton("ヘルプ");

 public Frame(){
  いろいろコンポーネントを追加...
  btn.newActionListener(this);
  this.setVisible(true);★
 }

 actionPerformed(ActionEvent e){
  this.repaint(); //自身のインスタンス(フレームを再描画)
 }
}

と推測しました。★のタイミングでpaintComponent(Graphics g)が呼び...続きを読む

QgetGraphics()の意味を教えてください

Java初心者です、宜しくお願いします。

 getGraphicsとは、何からGraphicsを取っているのでしょうか。
 imageをつくる場合(createImage())、Applet、Canvas等への描画の場合にも
「getGraphics()により、グラフックスコンテキストを取得する」等と書かれている
参考書を見かけます。

・imageをつくる場合と、Applet、Canvas等への描画の場合でも、「getGraphics()」の意味は
同じなのでしょうか。

例として
  →(createImage(widt,height)). getGraphics();とか、
  →Appletクラスを継承したConstructor内で「g=getGraphics();」とありますが、
 Graphicsを取得する対象が違うような気がするのですが?

 そもそもグラフックス、グラフックスコンテキストとがどのようなものなのかが理解出来ていないのですが、どのようにイメージしたら良いのでしょうか。

宜しくお願いします。

Java初心者です、宜しくお願いします。

 getGraphicsとは、何からGraphicsを取っているのでしょうか。
 imageをつくる場合(createImage())、Applet、Canvas等への描画の場合にも
「getGraphics()により、グラフックスコンテキストを取得する」等と書かれている
参考書を見かけます。

・imageをつくる場合と、Applet、Canvas等への描画の場合でも、「getGraphics()」の意味は
同じなのでしょうか。

例として
  →(createImage(widt,height)). getGraphics();とか、
  →Appletク...続きを読む

Aベストアンサー

Image / Applet / Canvas / Component
→ 絵を描く対称。

グラフィックス
→ 絵を描く道具。線を引いたり塗りつぶしたりセピア色に変えたり変形させたり。

コンテキスト
→ 絵を描くにあたって必要な情報である、縦横の幅とか色空間などの詳細。

何か.getGraphics() でグラフィックス・コンテキストを取得する
→ 何かに絵を描く為に必要な詳細を教え込ませた、専用のお絵かき道具を用意いたします。

QSwingのpaintComponent()メソッドについて

 JAVA初心者です、宜しくお願いします。
 参考書で、Swingについて以下のようなコメントを見つけました、ただ何故そうなのかの理由を書いていません。
 以下の内容はどのような理由からそうなるのでしょうか。

 「Swing コンポーネントでは、メソッドpaintは推奨されていません。
 paintComponentをプログラムから呼び出してはいけません。描画をしたい場合は、 paintComponent をオーバー
ライドしたクラスの repaint() メソッドを呼び出します。
 Swing コンポーネント上に描画するには、 描画したいコンポーネントのクラスを継承したクラスで、
メソッド paintComponent(Graphics g) をオーバーライドし、 パラメータで渡された g に対して Graphics
クラスのメソッドで描画をします。
 オーバーライドした paintComponent の先頭で、このコンポーネントの土台を描画するために、
super.paintComponent(g) を呼び出しておきます。」

 宜しくお願いします。

 JAVA初心者です、宜しくお願いします。
 参考書で、Swingについて以下のようなコメントを見つけました、ただ何故そうなのかの理由を書いていません。
 以下の内容はどのような理由からそうなるのでしょうか。

 「Swing コンポーネントでは、メソッドpaintは推奨されていません。
 paintComponentをプログラムから呼び出してはいけません。描画をしたい場合は、 paintComponent をオーバー
ライドしたクラスの repaint() メソッドを呼び出します。
 Swing コンポーネント上に描画す...続きを読む

Aベストアンサー

Swingでは、コンポーネントの描画はかなり複雑になっている。AWTでは、repaintが呼ばれると、updateが呼ばれた後、paintが呼ばれる。が、Swingでは、paing内で更にpaintComponentによってコンポーネントが描画され、それからpaintBorderでボーダーが描画され、最後にpaintChildrenによって内包するコンポーネントの描画が呼び出される、という仕組みになっている。

したがって、paintをオーバーライドしてしまうとその中で呼ばれる各種描画メソッドが呼ばれなくなり、コンポーネントの描画が正しく行われなくなる可能性がある。このため、何かを描画したい場合には、paint内の、コンポーネント描画のために用意されているpaintComponentをオーバーライドして描画を行う。ただし、これもsuperにメソッドを送るのを忘れると本来の描画が正しくなされないため、かならずsuper.paintComponentしないといけない。

また、このように複雑に描画が行われるため、全体を再描画する場合にはかならずrepaintしないといけない。途中のメソッドを呼び出すと、全体の描画が正しく行われない可能性がある。

要するに、AWTの場合は、paintは描画処理の末端のメソッドであり、「プログラマが勝手に使っていいメソッド」として用意されていて、そこではコンポーネントのクラスでは何も処理が実装されていなかった。ところがSwingでは、paintは末端の何もしていないメソッドではなくなり、その内部でコンポーネントの描画に必要なメソッドの呼び出しなどが細かく実行されるようになった。このために、すべてのメソッドが正しく実行されるように注意してコードを書かないといけなくなった、ということ。やれ、「このメソッドはオーバーライドするな」とか「これは最初にsuperに送れ」とかというのは、すべて「あらかじめ設計されたとおり、描画のためのメソッドが正しい順にすべてきちんと実行される」ようにするためのマナー、ということ。

Swingでは、コンポーネントの描画はかなり複雑になっている。AWTでは、repaintが呼ばれると、updateが呼ばれた後、paintが呼ばれる。が、Swingでは、paing内で更にpaintComponentによってコンポーネントが描画され、それからpaintBorderでボーダーが描画され、最後にpaintChildrenによって内包するコンポーネントの描画が呼び出される、という仕組みになっている。

したがって、paintをオーバーライドしてしまうとその中で呼ばれる各種描画メソッドが呼ばれなくなり、コンポーネントの描画が正しく行われなくな...続きを読む

Q描画処理が実行されない

while(gameflag==true){
(数値設定)   
repaint();
long start = System.currentTimeMillis();
while(System.currentTimeMillis()<start+1000){
}
}

上記のようにwhileループの中で数値などの設定を行い、描画をし、遅延をしているのですが他の処理はちゃんと実行されるのになぜか描画処理だけが行われません。また、whileループ外でも描画を行っていますがその時点ではきちんと描画されます。描画されない原因はどのようなことが考えられるでしょうか?描画はpaintComponent(Graphics g) メソッドで描画しています。

Aベストアンサー

>描画されない原因はどのようなことが考えられるでしょうか?

Swingの描画はダブルバッファを使っている関係上、描画メソッドを呼び出したときではなく、その後、もっとも早く再描画できるタイミングで表示を更新します。このため、while内で描画を行っている場合には、そのwhileを抜け、処理が終了した頃で表示が更新されるため、while中で行っている描画処理は見えません。(途中の描画は見えず、最終的に描画された状態だけが表示される)

この処理は、別スレッドを使って実行していますか? メインスレッドでは、上のような理由で途中の更新は見えませんから、マルチスレッドで実行し、描画ごとに強制的にrepaintするなどしてみてはいかがでしょう。

Qシンボルが見つかりませんというエラーが理解できません。

以下のようなじゃんけんゲームのプログラムを書いたのですが、「シンボルが見つかりません。」というエラーが表示されるのですが、エラーの意味が理解できず、解決できません。どこが間違っているのか教えていただけませんか。

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class janken extends Applet
implements Runnable, ActionListener {
private static final int EXTERNAL_BUFFER_SIZE = 128000;

Image image[] = new Image[3];
Thread t;
int index1 = 0;
int index2 = 0;
String msg = "";
String msg1 = "";

boolean state = false;
Button b1 = new Button("ぐー");
Button b2 = new Button("ちょき");
Button b3 = new Button("ぱー");

public void init(){
for(int i = 0; i<=2; i++){
img[i] = getImage(getDocumentBase(),"hanabi" + (i+1) + ".JPG");
}
add(b1);
add(b2);
add(b3);
b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
msg1 = "結果は・・";

}

public void paint(Graphics g){
g.drawImage(img[index1],350,30,this);
g.drawImage(img[index2],695,30,this);
g.drawString("コンピューター",420,300);
g.drawString("あなた",800,300);
g.drawString(msg,630,320);
g.drawString(msg1,550,320);
}

public void start(){
state = true;
t = new Thread(this);
t.start();

}

public void run(){
while(state){
index1++;
if(index1 == 3){
index1 = 0;
}
index2++;
if(index2 == 3){
index2 = 0;
}
repaint();
try {
Thread.sleep(60);
}catch(InterruptedException e) { }
}
}

public void actionPerformed(ActionEvent e){
if(state == false) {
start();
return;

}
state = false;
if(e.getSource() == b1) {
msg = "ぐー";
index2 = 0;
}

else if(e.getSource() == b2){
msg = "ちょき";
index2 = 1;
}

else if(e.getSource() == b3){
msg = "ぱー";
index2 = 2;
}
check();
repaint();
}

public void check() {
if(index1 == index2) msg ="あいこ";


else if (index1 == 0) {
if(index2 == 2) msg="あなたの勝ち";
else msg ="あなたの負け";
}

else if(index1 == 1) {
if(index2 == 0) msg="あなたの勝ち";
else msg="あなたの負け";
}

else if(index1 == 2) {
if(index2 == 1) msg="あなたの勝ち";
else msg="あなたの負け";
}

}
}

以下のようなじゃんけんゲームのプログラムを書いたのですが、「シンボルが見つかりません。」というエラーが表示されるのですが、エラーの意味が理解できず、解決できません。どこが間違っているのか教えていただけませんか。

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class janken extends Applet
implements Runnable, ActionListener {
private static final int EXTERNAL_BUFFER_SIZE = 128000;

Image image[] = new Imag...続きを読む

Aベストアンサー

「シンボルを見つけられません。」というエラーの下に何か表示がありませんでしたか?そこにヒントがあると考えられます。
シンボルを見つけられませんといエラーが表示される主な理由は4つあります。
(1)クラス、メソッド、変数などの綴りミスや定義していない変数を使用している可能性がある。
(2)コンストラクタを呼び出すときに、newを忘れている可能性がある。(3)公開されていないメンバーを呼び出している可能性がある。
(4)必要なimport文を記述し忘れている可能性がある。
ここでのあなたのエラーは(1)番ではないでしょうか?上記ではimageとなっている変数がimgになっていますね。
これはエラー表示をよく見ることで意外と簡単に解決できるのです。
ゆっくり丁寧にエラー表示を見るように心がけることが大事ですよ。

Qボタンの複数割り当てについて

public class TestButton extends Applet implements ActionListener
{
     Button bt1,bt2,bt3;

     public void init()
     {
         bt1 = new Button("red");
         add(bt1);
         bt2 = new Button("blue");
         add(bt2);
         bt3 = new Button("yellow");
         add(bt3);
         bt1.addActionListener(this);
      }

java初心者です。アプレットで上のようにボタンを作ります。それぞれが押された時に、red,blue,yellowが表示されるようにしたいのです。ActionListenerをインプリメントしているので、

     public void actionPerformed(ActionEvent ae)

をオーバーライドする必要がありますが、そこで質問です。
ボタンを3種類別々に関連づけるには、actionPerformed内をどのように記述したらよいでしょうか?また、init内はこれだけでいいんでしょうか?
よろしくお願いします。

public class TestButton extends Applet implements ActionListener
{
     Button bt1,bt2,bt3;

     public void init()
     {
         bt1 = new Button("red");
         add(bt1);
         bt2 = new Button("blue");
         add(bt2);
         bt3 = new Button("yellow");
         add(bt3);
         bt1.addActionListener(this);
      }

java初心者です。アプレットで上のようにボタン...続きを読む

Aベストアンサー

これは色々やり方があります。
ボタンをメンバ変数として定義してActionEventの
getSource()メソッドでEventが発生したObjectと
比較するとか、getSource()で取得したオブジェクト
をButtonにキャストしてからgetLabel()でラベルの
文字列を取得し任意の文字列と比較するとか。
他にはアクションコマンドで分岐する方法もあります。

・メンバ変数の例

public class TestButton extends Applet implements ActionListener {
  Button btn1,btn2,bt3;
  public void init(){
    btn1=new Button("red");
    add(btn1);
    btn2=new Button("blue");
    add(btn2);
    btn3=new Button("yellow");
    add(btn3);
  }
  public void actionPerformed(ActionEvent e){
    Object obj=e.getSource();
    if(obj == btn1){
      // "red"の処理
    }
    else if(obj == btn2){
      // "blue"の処理
    }
    else if(obj == btn3){
      // "yellow"の処理
    }
  }
}

・ラベルで比較する例

public void acitonPerformed(ActionEvent e){
  Object obj=e.getSource();
  if(obj instanceof Button){
    Button btn=(Button)obj;
    String labStr=btn.getLabel();
    if("red".equals(labStr)){
      // "red"の処理
    }
    else if("blue".equals(labStr)){
      // "blue"の処理
    }
    else if("yellow".equals(labStr)){
      // "yellow"の処理
    }
  }
}

・アクションコマンドの例

public void actionPerformed(ActionEvent e){
  String cmdName=e.getActionCommand();
  if("red".equals(cmdName)){
    // "red"の処理
  }
  else if("blue".equals(cmdName)){
    // "blue"の処理
  }
  else if("yellow".equals(cmdName)){
    // "yellow"の処理
  }
}

制約が無ければアクションコマンドでの処理が私は好きです。

これは色々やり方があります。
ボタンをメンバ変数として定義してActionEventの
getSource()メソッドでEventが発生したObjectと
比較するとか、getSource()で取得したオブジェクト
をButtonにキャストしてからgetLabel()でラベルの
文字列を取得し任意の文字列と比較するとか。
他にはアクションコマンドで分岐する方法もあります。

・メンバ変数の例

public class TestButton extends Applet implements ActionListener {
  Button btn1,btn2,bt3;
  public void init(){
    btn1=new Bu...続きを読む

Qフレーム上のコンポーネントの削除について

フレーム上の表示内容を切り替えるために、
それまでフレーム上にあったチョイス(choice)を
remove(choice1)メソッドで削除して、その場所に(その上に)画像(image)を表示したいと思うのですが、
チョイスは消えて表示されなくなるのですが、
チョイスのあったところだけ画像が表示されません。
チョイスの影響を消して、普通に画像を表示するにはどうしたらよいでしょうか。よろしくお願いします。

choice1.setLayout(null);
choice1.setBounds(500,300,100,20);
のように、nullレイアウトにしてあります。

Aベストアンサー

>remove(choice1)メソッドで削除
>チョイスは消えて表示されなくなる
>チョイスのあったところだけ画像が表示されません


「『チョイス』以外にそこにまだ
不要なごみコンポーネントが追加されてるから
(つまり削除してない「何か」があるから)」。

どのコンポーネントになにをどれだけ追加(add)したのか、
自分のソースコードを
再点検しましょう。

Q生成したインスタンスを削除する方法

言語:JAVA

生成したインスタンスを削除するにはどのようにすれば良いでしょうか?

testData = new TestData();

testDataはセッション内に格納してあります。
また、testDataはNULLのままだったり、実際に値が入っていたりもします。

NULLのままだと不具合があるため、NULLの場合は、インスタンスそのものを削除してしまいたいと考えています。
初歩的な質問ですみませんが、教えてください。

よろしくお願いいたします。

Aベストアンサー

浅学なため、TestDataというクラス名と「セッション内に格納」という表現だけからどうしてHttpSessionが出てくるのか分かりませんが...

Javaでは、明示的な操作(C++のdeleteのような)によってインスタンスを削除することはできません。そのインスタンスがどこからも参照されなくなったらGCで消えます。もう要らない(消えてほしい)インスタンスを参照している変数やフィールドにはnullを代入することで参照をなくします。

testData = null;

> NULLのままだと不具合があるため、NULLの場合は、インスタンスそのものを削除してしまいたい

何がNULLだとどのように不都合なのかを説明してもらえると、別の回答がつくかもしれません。

QKeyListenerの使い方について

FrameクラスのフレームにKeyListenerをaddKeyListenerで登録してキー入力を受け付けたいのですが、キーを入力してもまったく反応がありません。どうやらkeyTyped,keyPressed,keyReleasedのどのメソッドも呼び出されてないようです。クラスの概要は以下のとおりです。
class sampleFrame extends Frame implements KeyListener
{
{
addKeyListener(this);//コンストラクタ内で登録
}



で、keyPressedとうのメソッドはすべて定義しています。それから、キーを入力するとなぜか同じフレーム上のリストボックスの項目が入れ替わったりします。
どうぞよろしくお願いいたします。

Aベストアンサー

こんにちは。
おそらくフォーカスの問題だと思います。
フォーカスをフレームに設定してあげれば良いのですが、一度でも内部のコンポーネントに(クリックするなど)フォーカスを設定すると、フォーカスをフレームに再設定する仕掛けを用意しておく必要があります。
- - -
import java.awt.*;
import java.awt.event.*;

public class Test extends KeyAdapter {

Frame frame;
List list;

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

public Test() {
list = new List();
list.add("apple");
list.add("orange");
list.add("banana");
list.removeKeyListener(this);

frame = new Frame("Test");
frame.add(list);
frame.setSize(400, 300);
frame.setLocation(100, 100);
frame.addKeyListener(this);
frame.show();
frame.requestFocus(); // フレームにフォーカスを設定
}

public void keyPressed(KeyEvent e) {
System.out.println("key pressed.");
}

}

こんにちは。
おそらくフォーカスの問題だと思います。
フォーカスをフレームに設定してあげれば良いのですが、一度でも内部のコンポーネントに(クリックするなど)フォーカスを設定すると、フォーカスをフレームに再設定する仕掛けを用意しておく必要があります。
- - -
import java.awt.*;
import java.awt.event.*;

public class Test extends KeyAdapter {

Frame frame;
List list;

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

public Test() {
list = new List();
list....続きを読む

Qボタンクリック後パネルを再描画repaintしたい

ボタンをクリック後にstaticで保持していた値にプラス1して
その値をパネルに再描画したいと思っています。
下記のプログラムだとボタンをクリックすると
(<1<2<3<4)となって画像と数字が増えてしまいます
行いたいのは数字の部分だけが再描画されて
カウントされて<3と表示されるだけになってもらいたい


クラス1つ目

import java.awt.BorderLayout;
import java.awt.Cursor;
import java.awt.event.MouseEvent;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;


public class Sample extends JFrame{
static int value=1;
JPanel work = new JPanel();
public static void main(String[] args) {
Sample frame = new Sample();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(100, 200, 200, 100);
frame.add(frame.createPanel(), BorderLayout.LINE_END);
frame.setVisible(true);
}
public JPanel createPanel() {

ImageIcon icon = new ImageIcon("./img/left.gif");
JLabel label = new JLabel();
Cursor c = new Cursor(Cursor.HAND_CURSOR);
label.setCursor(c);
label.setIcon(icon);
JLabel strLabel = new JLabel();
String str = Integer.toString(value);
strLabel.setText(str);
work.add(label);
work.add(strLabel);
label.addMouseListener(new myListener());
return work;
}
class myListener extends MouseAdapter{
public void mouseClicked(MouseEvent e){
System.out.print(Sample.value++);
createPanel().repaint();
setVisible(true);
}
}
}


クラス2つ目
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class MouseAdapter implements MouseListener{
public void mouseClicked(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
public void mousePressed(MouseEvent e){}
public void mouseReleased(MouseEvent e){}
}

ボタンをクリック後にstaticで保持していた値にプラス1して
その値をパネルに再描画したいと思っています。
下記のプログラムだとボタンをクリックすると
(<1<2<3<4)となって画像と数字が増えてしまいます
行いたいのは数字の部分だけが再描画されて
カウントされて<3と表示されるだけになってもらいたい


クラス1つ目

import java.awt.BorderLayout;
import java.awt.Cursor;
import java.awt.event.MouseEvent;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing....続きを読む

Aベストアンサー

>class myListener extends MouseAdapter{
>createPanel().repaint();

createPanelでパネルを新規作成してrepaintしていますから、そういった動作になると思います。
labelをクラス変数として保持して、そこに設定するのが簡単だと思います。


人気Q&Aランキング