jCheckBoxの動作について

このQ&Aのポイント
  • jCheckBoxの動作について調査しています
  • jCheckBoxをクリックすると、jCheckBox1_stateChanged()が5回実行されます
  • Applet1クラスでjCheckBoxを作成し、その状態変化を監視しています
回答を見る
  • ベストアンサー

jCheckBoxの動作について。

jBuilder8にて、テストプログラムを作成しています。 アプレットに、ただ、単純にjCheckBoxをだけを作って、実行したところ、jCheckBox1_stateChanged()がcheckboxを1クリックにつき、5回実行されている。 (メッセージが5回表示される) なぜでしょうか? よろしくお願いいたします。 (ソースが見づらくすみません) public class Applet1 extends Applet { private boolean isStandalone = false; JCheckBox jCheckBox1 = new JCheckBox(); int i = 0; public Applet1() { } public void init() { try { jbInit(); } catch(Exception e) { e.printStackTrace(); } } private void jbInit() throws Exception { jCheckBox1.setText("jCheckBox1"); jCheckBox1.setBounds(new Rectangle(102, 77, 133, 23)); jCheckBox1.addChangeListener(new Applet1_jCheckBox1_changeAdapter(this)); this.setLayout(null); this.add(jCheckBox1, null); } void jCheckBox1_stateChanged(ChangeEvent e) { i++; System.out.println("i = " + i); } } class Applet1_jCheckBox1_changeAdapter implements javax.swing.event.ChangeListener { Applet1 adaptee; Applet1_jCheckBox1_changeAdapter(Applet1 adaptee) { this.adaptee = adaptee; } public void stateChanged(ChangeEvent e) { adaptee.jCheckBox1_stateChanged(e); } }

  • ssi77
  • お礼率76% (32/42)
  • Java
  • 回答数3
  • ありがとう数2

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

  • ベストアンサー
  • lawson
  • ベストアンサー率44% (29/65)
回答No.1

ごめんなさい。 なぜ、5回実行されるのかは、わかりません。 Swingにはよく、バグがあったりするようです。 JAVAのGUI周りはどうも、挙動不信なところをがあって、 バグもたくさんあります。 今回のがバグかどうかは知りません。 それなりに理由があるかもしれないですが・・。私にはわかりません。 googleで調べてもなかなか答えを見出せない時が多いですね。 J2EE関連のほうに比べて、知っている人が少ないのかもしれない・・。 とはいえ、 チェックボックス1回につき1回の実行にしたいのであれば 解決策はあります。 私がもし納期に迫られているのであれば、 以下の解決策をとります。 Applet1_jCheckBox1_changeAdapterクラスに 以下のコードを追加します。 (1) private boolean previousState; というフィールドをひとつ追加する。 (2) stateChangedを変更する (変更前) public void stateChanged(ChangeEvent e) { adaptee.jCheckBox1_stateChanged(e); } (変更後) public void stateChanged(ChangeEvent e) { boolean nowState = ( (JCheckBox)e.getSource() ).isSelected(); if( previousState == nowState ) { return; } adaptee.jCheckBox1_stateChanged(e); previousState = nowState; } 以上。 これで、チェックボックスを1回押すごとに、1回だけ jCheckBox1_stateChanged( が呼ばれます。 こんなので、回答になったでしょうか。

ssi77
質問者

お礼

返答ありがとうございます。 自己解決できまして、イベントを stateChangedではなく、itemStateChangedになおしたら、思ったとおりの動作をするようになりました。 丁寧な返答ほんとにありがとうございました。

その他の回答 (2)

  • kacchann
  • ベストアンサー率58% (347/594)
回答No.3

>jCheckBox1_stateChanged()がcheckboxを1クリックにつき、5回実行されている。 (メッセージが5回表示される) なぜでしょうか? まず間違いなく、 「ChangeEventが1クリックに付き5回、発生しているから」 でしょう。

  • lawson
  • ベストアンサー率44% (29/65)
回答No.2

NO1です >(1) >private boolean previousState; >というフィールドをひとつ追加する。 ですが、これの previousStateの初期値は jCheckBox1の初期と同じになるようにしといてくださいね。 private boolean previousState; を private boolean previousState = jCheckBox1.isSelected(); にするなり・・。そこらへんはうまくあわすという前提で・・ 以上です。

ssi77
質問者

お礼

返答ありがとうございます。 NO.1さんのお礼のところに書いたとおりです。 StateChangedの仕様はこれから調査したいと思っています。

関連するQ&A

  • HTMLから起動時、動作不正?

    お世話になります。 JAVA初心者です。 --- JAVA --- import java.awt.Frame; import java.awt.Label; public class sampleframe extends Frame { private Label label = null; public sampleframe() { super(); initialize(); } public void initialize() { label = new Label(); label.setBounds(24, 106, 116, 13); label.setText("aaaaaaaaaa"); label.setAlignment(java.awt.Label.CENTER); this.add(label, null); this.setLayout(null); this.setSize(500,300); this.setTitle("Frame"); } } public class MainPart { public static void main(String[] args) { sampleframe x = new sampleframe(); x.setVisible(true); } } --- HTML --- <html> <head> <title>java</title> </head> <body> <applet code="MainPart.class">></applet> </body> </html> なのですが、DOSプロンプトから 実行するとOKなのですが HTMLから実行すると グレーの画面だけになります。 エラーはでてません。 ローカル、サーバーともに 同じです。 どこがまずいのでしょうか? 宜しくお願いいたします。 PS. IEの設定は調べて変更した つもりです。

    • ベストアンサー
    • Java
  • マウスイベントに合わせた動作を行いたい。

    いつもお世話になってます。 再びお願いします。 枠上か否かの判別はできるようになったのですが 動作が不安定というか意図し動作にならず困っております。 悩み疲れてよく分からなくなってきました(汗) 枠上だと判定した場合にはボーダーサイズを変更して、 枠の内部と判定した場合にはボーダーを含んだパネルを ドラッグの動きに合わせて移動したいのです。 どなたかどこを直せば良いのか分かりますでしょうか。 宜しくお願いいたします。 public class SampleButtonSize extends JFrame { private static final long serialVersionUID = 1L; private JPanel jContentPane = null; private JPanel jPanel = null; private Border jBdrPower = null; private JButton jButton = null; private JButton jButton1 = null; public Point pMus; private JPanel getJPanel() { if (jPanel == null) { jPanel = new JPanel(); jPanel.setLayout(null); jPanel.setBounds(new Rectangle(30, 25, 205, 98)); jPanel.setBorder(new TitledBorder( new EtchedBorder(), "Power" )); jPanel.add(getJButton(), null); jPanel.add(getJButton1(), null); jPanel.addMouseMotionListener(new java.awt.event.MouseMotionListener() { public void mouseDragged(java.awt.event.MouseEvent e) { MusX = e.getX(); MusY = e.getY(); inner = jBdrPower.getBorderInsets(jPanel); Dimension PnlSize = jPanel.getSize(); pMus = jPanel.getLocation(); if( MusX< inner.left || MusX> PnlSize.width - inner.right || MusY< inner.top || MusY> PnlSize.height - inner.bottom ) { // border の内側線よりも外:サイズ変更 jPanel.setSize(MusX, MusY); } else { // border の内側線よりも内:移動 jPanel.setLocation( pMus.x + MusX, pMus.y + MusY ); } } public void mouseMoved(java.awt.event.MouseEvent e) { } }); } return jPanel; } private JButton getJButton() { if (jButton == null) { jButton = new JButton(); jButton.setBounds(new Rectangle(16, 25, 82, 58)); } return jButton; } private JButton getJButton1() { if (jButton1 == null) { jButton1 = new JButton(); jButton1.setBounds(new Rectangle(115, 24, 77, 59)); } return jButton1; } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { SampleButtonSize thisClass = new SampleButtonSize(); thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); thisClass.setVisible(true); } }); } public SampleButtonSize() { super(); initialize(); } private void initialize() { this.setSize(300, 200); this.setContentPane(getJContentPane()); this.setTitle("JFrame"); } private JPanel getJContentPane() { if (jContentPane == null) { jContentPane = new JPanel(); jContentPane.setLayout(null); jContentPane.add(getJPanel(), null); } return jContentPane; } }

    • ベストアンサー
    • Java
  • java アプレット

    学校の授業でアプレットを学んでいます。 しかし・・・ 下のプログラムで、計算した結果をlabel3にはりつけたいのですが、計算結果がでてくれません・・・ボタンを押しても何もでてきません。 コマンドプロンプトで、エラーはでてきません。 お手数ですが、誰かどこがいけないのか教えて下さい。 import java.awt.*; import java.awt.event.*; public class B extends java.applet.Applet implements ActionListener { Label label3 = new Label(); Button button2 = new Button(); TextField textfield1= new TextField(10); TextField textfield2= new TextField(10); public void init() { button2.setLabel("入力したらクリック!"); button2.setBounds(new Rectangle(50, 465, 120, 20)); this.setLayout(null); label3.setBackground(Color.blue); label3.setBounds(new Rectangle(325, 80, 200, 35)); textfield1.setBounds(100, 425, 100, 25); textfield2.setBounds(150, 350, 100, 25); this.add(textfield2, null); this.add(label3, null); this.add(textfield1, null); this.add(button2, null);} public void actionPerformed(ActionEvent event) {if(event.getSource() == button2) {int diff = Integer.parseInt(textfield1.getText()) - Integer.parseInt(textfield2.getText()); String otsuri; otsuri ="お釣りは"+ diff +"円です。"; label3.setText(otsuri);} }} よろしくお願いします。

    • ベストアンサー
    • Java
  • ボーダー上か否かの判定について

    いつもお世話になってます。 またお願いします。 画面上にパネルを配置して パネルに外枠を設定します。 その内部にボタンを2つ配置しました。 この設定した外枠をドラッグ&ドロップすることで パネル(外枠)のサイズを変更し、 外枠以外のパネル部分をドラッグ&ドロップすることで ボタンや外枠含むを含むパネル全体の移動を行いたいのです。 ★のところで枠上か否かを判定させれば良いのでしょうか? それとも他に方法がありますでしょうか? 宜しくお願いいたします。 public class SampleButtonSize extends JFrame { private static final long serialVersionUID = 1L; private JPanel jContentPane = null; private JPanel jPanel = null; private JButton jButton = null; private JButton jButton1 = null; public Point pMus; private JPanel getJPanel() { if (jPanel == null) { jPanel = new JPanel(); jPanel.setLayout(null); jPanel.setBounds(new Rectangle(30, 25, 205, 98)); jPanel.setBorder(new TitledBorder( new EtchedBorder(), "Power" )); jPanel.add(getJButton(), null); jPanel.add(getJButton1(), null); jPanel.addMouseMotionListener(new java.awt.event.MouseMotionListener() { public void mouseDragged(java.awt.event.MouseEvent e) { if( ★ ) { // 枠 pMus = jPanel.getLocation(); jPanel.setLocation(pMus.x + e.getX(), pMus.y + e.getY() ); } else { // 枠以外 jPanel.setSize(e.getX(), e.getY() ); } } public void mouseMoved(java.awt.event.MouseEvent e) { } }); } return jPanel; } private JButton getJButton() { if (jButton == null) { jButton = new JButton(); jButton.setBounds(new Rectangle(16, 25, 82, 58)); } return jButton; } private JButton getJButton1() { if (jButton1 == null) { jButton1 = new JButton(); jButton1.setBounds(new Rectangle(115, 24, 77, 59)); } return jButton1; } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { SampleButtonSize thisClass = new SampleButtonSize(); thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); thisClass.setVisible(true); } }); } public SampleButtonSize() { super(); initialize(); } private void initialize() { this.setSize(300, 200); this.setContentPane(getJContentPane()); this.setTitle("JFrame"); } private JPanel getJContentPane() { if (jContentPane == null) { jContentPane = new JPanel(); jContentPane.setLayout(null); jContentPane.add(getJPanel(), null); } return jContentPane; } }

    • ベストアンサー
    • Java
  • JAVAプログラミング

    プログラミングについて質問があります 割り勘ソフトを作りたいのですが button1を押したときに int i = Integer.parseInt(kazu.getText()); int e = Integer.parseInt(kane.getText()); int a = e/i; String s = String.valueOf(a); this.an.setText(s); というプログラムを実行したいのですが button1のクリック処理?イベント処理?というのはどのように書けばいいのでしょうか レイアウトは完成しているので ↓に付け足すような形でお願いします プログラミングの質問をするのは初めてなので何かおかしなところや足りないところがあれば教えてください public class jFram { public static void main(String[] args) { JFrame mainFrame = new JFrame("1"); mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); mainFrame.setSize(500,500); mainFrame.setResizable(false); mainFrame.setVisible(true); Container cont = mainFrame.getContentPane(); JButton button1 = new JButton("計算"); final JTextField kane = new JTextField(); final JTextField kazu = new JTextField(); JLabel mony = new JLabel("料金"); JLabel ninz = new JLabel("人数"); JLabel an = new JLabel("a"); button1.setLayout(null); cont.add(button1); button1.setBounds(40,380,100,30); button1.setBackground(Color.blue); kane.setLayout(null); cont.add(kane); kane.setBounds(160,340,100,30); kazu.setLayout(null); cont.add(kazu); kazu.setBounds(160,300,100,30); mony.setLayout(null); cont.add(mony); mony.setBounds(40,340,100,30); ninz.setLayout(null); cont.add(ninz); ninz.setBounds(40,300,100,30); an.setLayout(null); cont.add(an); an.setBounds(160,380,100,30); cont.setLayout(null); JPanel a = new JPanel(); a.setLayout(null); mainFrame.setVisible(true); } }

    • ベストアンサー
    • Java
  • 画像処理についておしえてください!

    ここに新たに表示した画像を消去するボタンを 追加したいので教えてください! import java.awt.*; import java.awt.event.*; import java.io.*; import java.applet.Applet; public class k202 extends Frame implements ActionListener { MyCanvas c1; Button b1; Button e1; Image img; Button btnClear; int flag; public k202() { super(); setTitle("Hello"); setSize(500,500); setLayout(null); c1 = new MyCanvas(); c1.setBounds(25,25,250,150); this.add(c1); b1 = new Button("Read"); b1.setBounds(25,200,100,25); b1.addActionListener(this); this.add(b1); e1 = new Button("Clear"); e1.setBounds(50,250,150,50); //ボタンのイベント処理メソッドを定義 e1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e){ flag = 0; repaint(); } }); } public static void main (String args []) { new k202().show(); } public void actionPerformed(ActionEvent ev) { if (ev.getSource() == b1) { this.readImageFromFile(); } } void readImageFromFile() { try { FileDialog fd = new FileDialog(this,"Select Image File.",FileDialog.LOAD); fd.setVisible(true); String fname = fd.getDirectory() + fd.getFile(); Toolkit tk = Toolkit.getDefaultToolkit(); img = tk.getImage(fname); c1.repaint(); } catch(Exception e) { System.out.println(e); } } class MyCanvas extends Canvas { public void paint(Graphics g) { if (img != null) { g.drawImage(img,0,0,this); } } } }

  • アプレットのプログラムがコンパイルできません。

    import java.applet.Applet; import java.awt.*; public class Lesson1Applet extends Applet { public void init(){ this.add(new Lesson1("")); this.setLayout(null); this.resize(600,450); } } 上記のプログラムがコンパイルできません。 本の通りに作ってみたのですが、コンパイルが出来ず Servlet1118Applet.java:7: シンボルを解決できません。 シンボル: クラス Lesson1 場所 : Lesson1Applet の クラス this.add(new Lesson1("")); ^ という、エラーが出ます。 なぜコンパイル出来ないのか、わかる方がいましたら お返事お願いいたします。

    • ベストアンサー
    • Java
  • テキストボックス、ボタンが見えません、画像の影響で

     Java初心者です、宜しくお願いします。  アプレットに画像とテキストボックス、ボタンを張り付ける プログラムを書きましたが、実行すると画像を張り付けているためか、 テキストボックスが指定した大きさに見えず、せいぜい1文字程度の 大きさにしか表示されません。  また、ボタンも実行後には見えない状態で、マウスでクリックする と見えるようになります。  最初から、指定した大きさで、テキストボックス、ボタンを表示させる方法は あるのでしょうか。  また、別のクラスでパネルに色をつけていますが、全く実行されて いないようです。  この原因が分かりません、何故でしょうか。  以上宜しくお願いします。 ======================================================== public class Sample1 extends JApplet { private static final long serialVersionUID = 1L; MediaTracker tracker ; Image img ; Text1 t1 ; public void init() { Container cnt = getContentPane( ); setLayout( null ) ; t1 = new Text1( ) ; t1.init( ) ; cnt.add( t1 ) ; 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 g ) { g.drawImage( img , 50 , 50 , 300 , 300 , this ) ; } } //=================================================================== class Text1 extends JPanel { private static final long serialVersionUID = 1L ; JTextField jtf ; public void init( ) { setLayout( null ) ; setBackground( Color.yellow ) ; setBounds( 30 ,30 ,500 , 500 ) ; jtf = new JTextField( "abcde" ) ; jtf.setBounds( 150 , 150 , 100 , 30 ) ; add( jtf ) ; JButton jbt = new JButton( "Check" ) ; jbt.setFont( new Font( "SansSerif" , Font.BOLD , 20 ) ) ; jbt.setBackground( Color.red ) ; jbt.setForeground( Color.blue ) ; jbt.setBounds( 100 , 200 , 220 , 40 ) ; this.add( jbt ) ; } }

    • ベストアンサー
    • Java
  • 配列で作ったオブジェクトのイベントを取得するには?

    下記のクラス内で"ary"という10枚のパネルのオブジェクトを配列で作成しました。その"ary"パネルがクリックされた時のイベントを書きたいのですが、私の書いたロジックではイベントを取得できませんでした。 なにか良い方法がありませんでしょうか? public class Main_Panel extends Panel{ int y = 0; Panel ary[] = new Panel[10];   //CONSTRUCT public MainPanel() { for(int i = 0 ; i < 10; i++ ){ ary[i] = new Panel() this.add(ary[i], null); ary[i].setBounds(new Rectangle(0, y, 5, 5)); intYPos = intYPos + 10; ary[i].addMouseListener(new ary_MouseAdapter(this)); } } //パネル(ary)クリックイベント void ary_mouseClicked(MouseEvent e){ } } class ary_MouseAdapter extends java.awt.event.MouseAdapter { Main_Panel adaptee; ary_MouseAdapter(Main_Panel adaptee) { this.adaptee = adaptee; } public void mouseClicked(MouseEvent e) { adaptee.ary_mouseClicked(e, num); } }

    • ベストアンサー
    • Java
  • java起動時にボタンが表示されない

    Javaの初心者です。以下のプログラムを起動するとJTextAreaとJLabel は、表示されるのですが、JButtonが表示されません。起動後にボタンの配置したところを触るとボタンが表示されるようになるのですが、ボタンのアクションリスナーが動作してしまいます。起動時にボタンも表示できるようにするには、どうしたらよいでしょうか? public class test_pro extends JFrame{ private static final long serialVersionUID = 1L; private JLabel label1;     JButton buton1,button2;     public JTextArea lt1; public test_pro() { this.setUndecorated(true);    GraphicsDevice device = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); device.setFullScreenWindow(this); Container contentPane = getContentPane(); contentPane.setLayout(null); label1 = new JLabel("menu"); Font f1=new Font("Serif",1,22); label1.setFont(f1); label1.setForeground(Color.red);     contentPane.add(label1); lt1=new JTextArea(3,3); JScrollPane pane=new JScrollPane(lt1); pane.setBounds(new Rectangle(50,300,550,150)); contentPane.add(pane);     button1 = new JButton("SendRequestTest!"); button2 = new JButton("ReceiveResponseTest!"); label1.setBounds(new Rectangle(50,20,200,20)); button1.setBounds(new Rectangle(50,80,230,20)); button2.setBounds(new Rectangle(50,110,230,20));  contentPane.add(button1); contentPane.add(button2); button1.addActionListener(new MyJsendActionAdapter()); button2.addActionListener(new MyJreceiveActionAdapter());     this.setDefaultCloseOperation(EXIT_ON_CLOSE);     this.setVisible(true);    } /*以下省略*/