外出自粛中でも楽しく過ごす!QAまとめ>>

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内はこれだけでいいんでしょうか?
よろしくお願いします。

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

A 回答 (1件)

これは色々やり方があります。


ボタンをメンバ変数として定義して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"の処理
  }
}

制約が無ければアクションコマンドでの処理が私は好きです。
    • good
    • 2
この回答へのお礼

回答どうもありがとうございます。無事解決しました。JAVAのヘルプドキュメントを眺めながらどうしたらいいのかうんうん悩んでおりました。やはり経験した方に意見を聞くのが一番ですね。回答はWORD文書にして永久保存するつもりです。ありがとうございました!!

お礼日時:2003/03/09 15:30

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

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

このQ&Aを見た人はこんなQ&Aも見ています

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

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

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フレーム上のコンポーネントの削除について

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

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

Aベストアンサー

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


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

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

Qフォーム上で押されたボタンによってサーブレットの処理を変えたい

Urizakaです。
さて、さっそく質問です。
JSPの同一フォーム上に「登録」「修正」「削除」のボタンを置き、その押された
ボタンによってサーブレット内での処理が切り替わる(具体的には、違う
SQL文を実行し、違うJSPページをgetRequestDispatcherメソッドで生成
する)ようにしたいのですが、どのようにすればよいのでしょうか?
もちろんそれぞれの処理に対して別々のサーブレットを作り、javaScript
でそれぞれのサーブレットへ飛ぶように制御するという処理も考えたことは
考えたのですが、できれば一つのサーブレットで済ませたいと考えたもので
…宜しくお願いします。

Aベストアンサー

お恥ずかしい限りです。
前述の例、動くわけがありませんね(汗)

2つめの例、書きなおします。

---------------------------------------------------

■JSPのフォーム

<form name=MyForm action="<<サーブレットのURL>>" method=post>
<input type=button name=MyClick value=登録 onClick="func('Toroku');">
<input type=button name=MyClick value=修正 onClick="func('Shusei');">
<input type=button name=MyClick value=削除 onClick="func('Sakujo');">
<input type=hidden name=MySubmit>
</form>

<script language="JavaScript">
function func(MyCommand){
document.MyForm.MySubmit.value=MyCommand;
document.MyForm.submit();
}
</script>

■Servletでの処理
// リクエストの取得
String MyAction = req.getParameter("MySubmit");

// 処理の実行
if (MyAction.equals("Toroku")){...}
if (MyAction.equals("Shusei")){...}
if (MyAction.equals("Sakujo")){...}



---------------------------------------------------

こんな感じでどうでしょうか。
ちなみにこうやって書いておくと、フォームのボタンからじゃなくても
アンカーをクリックすることで同じ効果が出せそうな……

<a href="JavaScript:func('Toroku')">登録</a>

あ、でもまたボロが出そうなのでこの辺で(^_^;)

お恥ずかしい限りです。
前述の例、動くわけがありませんね(汗)

2つめの例、書きなおします。

---------------------------------------------------

■JSPのフォーム

<form name=MyForm action="<<サーブレットのURL>>" method=post>
<input type=button name=MyClick value=登録 onClick="func('Toroku');">
<input type=button name=MyClick value=修正 onClick="func('Shusei');">
<input type=button name=MyClick value=削除 onClick="func('Sakujo');">
<input type=hidden name=M...続きを読む

Qinterface,extend,implementのちがい

お世話になります、

Javaを勉強しているのですが、
interface,extend,implementの使い分けがわかりません。

私の解釈としては、
(1)interfaceは、グローバル変数の定義、グローバルメソッドの定義(実装はしない)。

(2)extendは、extendクラスを親クラスとして親クラスの機能を使用できる。

(3)implementは…,implementもextendと同じような意味だと解釈しているんですが、違う点は、implementで定義してあるメソッドは、使用しなくても、実装しなければならないという点でしょうか?

とにかくこの3つのを使い分けるコツとかあれば教えてください。
よろしくお願いします。

Aベストアンサー

バラバラに理解してもしょうがないッス。

まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば、getStringLength()メソッドなどが
あったほうが良いでしょうか。
このgetStringLength()メソッドは、2バイト文字も1バイト文字も「1文字」
と数えてくれると言う点で、まさに、日本語クラス用のメソッドだと言えるでしょう。

例えば、Java的に記述すると、、、
class Japanese {
public int getStringLength() {
  ・・・
return strlength;
 }
 ・・・
}

class TextField {
・・・
}

class JTextField extends TextField, extends Japanese {
・・・・
}

C++ではそのように実装するでしょう。
しかし、Javaにはこのような高度な機能はありません。

そこで、生まれた苦肉の策が、「interfaceとimplements」です。

interface Japanese {
public int getStringLength(); // interfaceは実装を含まない!
                 // すなわち「実装の継承」ができるわけではない。
}

class TextField {
・・・
}

class JTextField extends TextField implements Japanese {
・・・・
public int getStringLength() {
  ・・・
return strlength; //implementsの実装を「各クラスで」実装してやる必要がある。
 }
}


結局のところ、Javaでは、複数のクラスを親クラスには持ち得ないため、継承できなかったクラスは「各クラスで実装してやる必要性」があるのです。


ではどのように使うのが効果的か?

なまえのままです。「代表的なインターフェイス」にたいしてinterfaceを使うのが良いと思います。

例えば、プレイヤー系であれば、ビデオ・コンポ・ウォークマン・などにかかわらず、
interface controlpanel {
public play();
public stop();
public next();
public back();
}
というような基本的インターフェイスを「持っているべき」です。

こうすることで、それぞれのクラス宣言の際に、これらの「インターフェイスを持っているべきであり、実装されるべきである」ということを「強く暗示」することができます。
class videoplayer extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

こうすることで、同様のクラスを作成するユーザーは、
「プレイヤー系は、4つ操作が出来るコントロールパネルをインターフェイスとして持つべきなのだな!?」という暗示を受け取り、自分のクラスでもそれを模倣するでしょう。

class mp3player extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

また、これらのクラスを使用するユーザーも、「implements controlpanel」という
表記を見て、「4つの基本操作は押さえられているのだな!」という基本中の基本動作を抑えることが出来ます。

まとめると、クラスに「こういう特徴もたしてください!」「こういう特徴持ってますよ!」という一種の暗示的警告や方向性を与えることができるわけですね。

バラバラに理解してもしょうがないッス。

まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば...続きを読む

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をクラス変数として保持して、そこに設定するのが簡単だと思います。

QJButton配列でのイベント処理

JAVA初心者です。
ある、画面にボタン50個を作成しました。(JButtonの配列で作成しました。)
そこで質問です。下記のコールバックメソッド(?)btnActionPerformedを50個分作成するのは
煩雑なので1つで処理しようと考えております。

for (int cnt=0; cnt<50; cnt++) {
...
JButtonのインスタンス生成処理等
...
btn[cnt-1].addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnActionPerformed(evt);
}
});
}

...
...
...

private void btnActionPerformed(java.awt.event.ActionEvent evt) {

...
}

btnActionPerformedで受け取ったevtパラメータから押されたボタンのプロパティ等
が判別つくのでしょうか?ActionEventクラスのヘルプを参照しましたが、
いまひとつ良くわかりません。
また、このevtパラメータを使う方法以外で、この様な事が実現できる方法が
あれば教えてください。よろしくお願いします。

JAVA初心者です。
ある、画面にボタン50個を作成しました。(JButtonの配列で作成しました。)
そこで質問です。下記のコールバックメソッド(?)btnActionPerformedを50個分作成するのは
煩雑なので1つで処理しようと考えております。

for (int cnt=0; cnt<50; cnt++) {
...
JButtonのインスタンス生成処理等
...
btn[cnt-1].addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnActionPerformed(evt);
}
});
}

...
....続きを読む

Aベストアンサー

やり方は二つあります。

ご指摘の通り、evtパラメータから情報を得ます。
それで、その情報を得るときに、
「getSource()で、イベントを発生したオブジェクト参照を得る」のと、
「getActionCommand()で『アクションコマンド』を得る」方法があります。

前者から説明すると、、
getSource()メソッドで
イベントを発生したオブジェクトを得ることができます。
だから、
Object source = evt.getSource();

として、
if(source == btn[i]).....;
というふうに判別します。
この方法の欠点として、「判別する側で、ボタンオブジェクトの参照を全部持ってなければならない」
という事があります。

もう一つのアクションコマンドを使う方法は、
ボタンに「アクションコマンド」というStringをセットしておいて、
evtからgetActionCommand()で取り出し、判別します。

btn[i].setActionCommand("" + i);

....

String command = evt.getActionCommand();
if(command.equals("" + j))...;

のようにします。
この方法の欠点として、事前にアクションコマンドを登録しておく必要があります。
もっとも、ボタンにテキストを表示している場合、
デフォルトではそのテキストがアクションコマンドとなります。
ボタンにテキストがあり、それぞれ違っていたらそれを使用できます。

利点としては、ボタンの参照を知らなくても処理できること、
複数のボタンから同じアクションを受け取るのが簡単なことが挙げられます。

やり方は二つあります。

ご指摘の通り、evtパラメータから情報を得ます。
それで、その情報を得るときに、
「getSource()で、イベントを発生したオブジェクト参照を得る」のと、
「getActionCommand()で『アクションコマンド』を得る」方法があります。

前者から説明すると、、
getSource()メソッドで
イベントを発生したオブジェクトを得ることができます。
だから、
Object source = evt.getSource();

として、
if(source == btn[i]).....;
というふうに判別します。
この方法の欠点として、...続きを読む

Q複数のsubmitボタンで押されたボタンを取得する方法

form内の、submitボタンの値が拾えません。
1つだけsubmitボタンを設置すると値が拾えますが、
2つ以上submitボタンを設置すると拾えません。
仕様上、無理なのでしょうか?

<SCRIPT language="JavaScript">
function move_post(){
alert(document.frmMvPost.btn.value);
}
</SCRIPT>

<FORM name="frmMvPost" action="" method="post" onsubmit="return move_post()">
<INPUT type="submit" name="btn" value="テスト1">
<INPUT type="submit" name="btn" value="テスト2">
<INPUT type="submit" name="btn" value="テスト3">
</form>

Aベストアンサー

> alert(document.frmMvPost.btn.value);

btnというオブジェクトが複数あるため、btnは配列になってしまうため、
document.frmMvPost.btn.valueでは値が取れません。

回避策はonClickイベントにて値をHiddenへ格納すればOKです。

_____________________________________________________________

<SCRIPT language="JavaScript">
function move_post(){
alert(document.frmMvPost.onbtn.value);
}

function set_value(s_val)
{
document.frmMvPost.onbtn.value = s_val;
}

</SCRIPT>

<FORM name="frmMvPost" action="" method="post" onsubmit="return move_post()">
<INPUT type="submit" name="btn" value="テスト1" onClick="set_value('テスト1')">
<INPUT type="submit" name="btn" value="テスト2" onClick="set_value('テスト2')">
<INPUT type="submit" name="btn" value="テスト3" onClick="set_value('テスト3')">
<INPUT type="hidden" name="onbtn">
</form>

_____________________________________________________________


※テストしていないため動作は保証しません。問題ある場合にはお手数ですが何かしら手を加えてください。

> alert(document.frmMvPost.btn.value);

btnというオブジェクトが複数あるため、btnは配列になってしまうため、
document.frmMvPost.btn.valueでは値が取れません。

回避策はonClickイベントにて値をHiddenへ格納すればOKです。

_____________________________________________________________

<SCRIPT language="JavaScript">
function move_post(){
alert(document.frmMvPost.onbtn.value);
}

function set_value(s_val)
{
document.frmMvPost.onbtn.value = s_val;
}

</SCRIPT...続きを読む

QIOException ってどういうときに起こるのでしょうか?

IOException ってどういうときに起こるのでしょうか?

http://www.atmarkit.co.jp/fjava/rensai2/javaent12/javaent12.html
を見て勉強しています。

  catch ( IOException e) {
    System.out.println( "キーボードが故障しているのかもしれません" );
  }

と書いてあります。
ハード(キーボード)が故障しているのを Java のプログラムのレベル(ソフトウェア)で感知できるというのがよくわかりません。「

NumberFormatException の方はわかるのですが・・・

Aベストアンサー

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接続だったりするわけですけど、
InputStreamは、その入力元の情報を持っていないので、
データを読み取る際は常に
IOExceptionをキャッチするコードを書かなくてはいけません。
たとえ、絶対にIOエラーが発生しないストリームだとしても。

さらに付け加えるなら、
そもそも「標準入力=キーボード」であるとは限りません。
(一般的にはキーボードであることが多いですが。)
Javaでは、
System.setIn(InputStream)
を呼び出して、標準入力を変えてしまうことができますし、
標準入力を指定してプログラムを実行することができるOSもあります。

追伸1:
例外をキャッチしたときは、
スタックトレースをプリントすることをおすすめします。
catch (IOException e) {
e.printStackTrace();
}

追伸2:
そのプログラムでIOExceptionを発生させる最も簡単な方法は、
readLine()を呼び出す前に
標準入力(System.in)を閉じてしまうことです。
System.in.close();

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接...続きを読む

Q画面を隠す・消す方法を教えてください。

初心者の質問ですが、
java swingで画面を2つ作り、メイン画面のボタンからサブ画面を
呼ぶというクラスを作りました。
サブ画面には「OK」ボタンと「CANCEL」ボタンがあり、
「CANCEL」ボタンを押すとサブ画面が隠れるか、消える仕様に
したいのですがどのように実装すればいいでしょうか?
よろしくお願いします。

Aベストアンサー

簡単に作ってみました。
こんな感じでしょうか?
※見やすくするために全角スペースを使用しているのでコピペしてもコンパイルできません。

import java.awt.event.*;
import javax.swing.*;
import java.awt.*;

class Test implements ActionListener{
 JFrame f;
 JDialog dialog;
 JButton button, ok, cancel;

 Test(){
  // メイン画面を作成
  f = new JFrame("メイン画面");
  Container pane = f.getContentPane();

  // メイン画面のボタンを作成
  button = new JButton("サブ画面を作成");
  button.addActionListener(this);

  // ボタンを貼り付けるパネルを作成
  JPanel panel = new JPanel();

  // ボタンを貼り付ける
  panel.add(button);
  pane.add(panel);

  // 表示
  f.setBounds(0, 0, 200, 80);
  f.setVisible(true);
 }

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

 public void actionPerformed(ActionEvent e){
  // メイン画面のボタンが押されたら、
  // サブ画面(ダイアログ)を開く
  if(e.getSource() == button){
   dialog = new JDialog(f, "サブ画面");
   Container pane = dialog.getContentPane();

   // OKボタンとCANCELボタンを作成
   ok = new JButton("OK");
   cancel = new JButton("CANCEL");

   ok.addActionListener(this);
   cancel.addActionListener(this);

   // ボタンを貼り付けるパネルを作成
   JPanel panel = new JPanel();

   // ボタンを貼り付ける
   panel.add(ok);
   panel.add(cancel);
   pane.add(panel);

   // 表示
   dialog.setBounds(30, 30, 200, 80);
   dialog.setVisible(true);
  }

  // サブ画面(ダイアログ)のCANCELボタンが押されたら
  // サブ画面(ダイアログ)を消す
  if(e.getSource() == cancel){
   dialog.hide();
  }
 }
}

簡単に作ってみました。
こんな感じでしょうか?
※見やすくするために全角スペースを使用しているのでコピペしてもコンパイルできません。

import java.awt.event.*;
import javax.swing.*;
import java.awt.*;

class Test implements ActionListener{
 JFrame f;
 JDialog dialog;
 JButton button, ok, cancel;

 Test(){
  // メイン画面を作成
  f = new JFrame("メイン画面");
  Container pane = f.getContentPane();

  // メイン画面のボタンを作成
  button = new JB...続きを読む

Q違うクラスからの変数の共有化

一つのクラスの中にある変数の値を、二つの別なクラスから呼び出して、その二つのクラスのどちらから変数を参照しても同じ値が帰ってくるようにしたいのですが、いろいろ調べてもできなかったので質問させていただきますm(_ _)m

// 共有化させたい変数を持つクラス
// Var.java
public class Var{
 public static int i;

 public Var(int i){ this.i = i; }
 public Var(){}

 public static void getI(){
  return i;
 }
}

//クラス1
//Class1.java
public class Class1{
 Var var = new Var(1);
}

//クラス2
//Class2.java
public class Class2{
 Var var = new Var();

 System.out.println(var.getI());
}

とした場合、Class1を実行し、次にClass2を実行すると、クラス1で定義した変数の値である 1 が戻ってくるようにしたいのですが、上記の方法では、Class2を実行すると結果は 0 になってしまいました。
まだまだ習い始めたばかりでいまいちstaticを使い切れていないと思います・・・

たとえば、PrintStreamクラスの
public static final PrintStream out
というのはどこから参照しても同じ結果なのでそのようなやり方で大丈夫だろうと思ったのですが・・・

このような方法では共有化させることはできないのでしょうか?またできないのでしたらほかのやり方がもしあった場合は教えていただきたいと思います。
どうかお願いします。

一つのクラスの中にある変数の値を、二つの別なクラスから呼び出して、その二つのクラスのどちらから変数を参照しても同じ値が帰ってくるようにしたいのですが、いろいろ調べてもできなかったので質問させていただきますm(_ _)m

// 共有化させたい変数を持つクラス
// Var.java
public class Var{
 public static int i;

 public Var(int i){ this.i = i; }
 public Var(){}

 public static void getI(){
  return i;
 }
}

//クラス1
//Class1.java
public class Class1{
 Var var...続きを読む

Aベストアンサー

Class1 のインスタンス
Var var = new Var(1);
Class2 のインスタンス
Var var = new Var();
これは、それぞれ別物を指しています(だって、自分で new と書いて新しく生成しているじゃないですか!)。

Class1 で値を入れた static 領域を Class2 で参照するには、

public class Class2{
// Var は大文字(クラス名)
 System.out.println(Var.getI());
}

とします。「クラス名.staticメンバ」という書式です。ただし、共有されるためには同じ Java VM 上実行されることが条件です。

※参考
public Var(int i){ this.i = i; }
この書き方は実行はできますが、意味的には正しくありません。staticメンバ は new しないでアクセスされることが前提なので、
Var.setI(i);
Var.i = 1;
というような書き方が良いと思います(new はしません)。

Class1 のインスタンス
Var var = new Var(1);
Class2 のインスタンス
Var var = new Var();
これは、それぞれ別物を指しています(だって、自分で new と書いて新しく生成しているじゃないですか!)。

Class1 で値を入れた static 領域を Class2 で参照するには、

public class Class2{
// Var は大文字(クラス名)
 System.out.println(Var.getI());
}

とします。「クラス名.staticメンバ」という書式です。ただし、共有されるためには同じ Java VM 上実行されることが条件です。

※...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング