• ベストアンサー

swing初心者です

swingを使って簡単なアプレットを作ったのですが、ボタンの表示のタイミングが妙です。ボタンが起動時に表示されず、マウスオーバーして初めて表示されます。 import java.awt.*; import javax.swing.*; public class Test extends JApplet implements Runnable{ public void init(){ getContentPane().add(new JButton("START")); new Thread(this).start(); } public void run(){ try{ while(true){ Thread.sleep(10); } catch(InterruptedException ie){ ie.printStackTrace(); } } } これはどうしてなのでしょうか。初歩的な質問かもしれませんが、どうかご教授お願いいたします。 環境 WindowsXP SP2, java1.5.0_07

noname#71195
noname#71195
  • Java
  • 回答数3
  • ありがとう数2

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

  • ベストアンサー
回答No.3

public void paint(Graphics g){   super.paint(g);//追加 } 親クラスのpaintメソッドを呼んだらちゃんと表示されましたよ。 あっ、No.1なので環境はちょっと違います。 参考になれば。

noname#71195
質問者

お礼

なるほど、親クラスのpaintメソッドですね!そういえばVC++でも同じ現象で悩んで、スーパクラスの関数呼んだら解決した、なんてことがありましたが、忘れてました。 ありがとうございました!

その他の回答 (2)

  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.2

 こんばんは。  私の環境とたぶん同じだと思うのですが、 WindowsXP SP2, java version "1.5.0_07"  アプレットビューアー、Firefox/1.5.0.8、IE6 SP2で試してみましたが、表示に問題がなく、同じ現象が再現されません。  なにが違うんでしょうかねぇ。

noname#71195
質問者

補足

わざわざ調べていただいたのに申し訳ありません、paint()メソッドのオーバーライドを書き忘れていました。これが原因のようです。 import javax.swing.*; public class Test extends JApplet implements Runnable{ ... public void paint(Graphics g){} //追加 } awtでこれに相当するコードを書いても普通にボタンが表示されるのですが、swingだと仕様が違うのでしょうか。

回答No.1

Win2000,Eclipse3.1.1,J2SE 1.4.2_12 Eclipseから実行しましたが、最初からボタンが表示されました。 参考にならないかもしれませんが。

noname#71195
質問者

お礼

ありがとうございます。もう少し調べてみます。

関連するQ&A

  • java(swing)で、登録ボタンを押すとファイルを読み込みDBに登

    java(swing)で、登録ボタンを押すとファイルを読み込みDBに登録する処理です。 その処理で、登録ボタンを押すと、ダイアログを起動して、処理中とメッセージ表示したいのですが、データが多く、画面が固まった状態になり、メッセージが表示されないのです。何かいい方法ありますでしょうか? ******************************************************************* import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; public class topMain { public static void main(String[] args) { //メニュー画面を起動する topMain frame = new topMain(); frame.topFrame(); } private void topFrame() { JFrame jf = new JFrame(); //フレームのサイズ設定 jf.setSize(1000, 600); jf.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); jf.getContentPane().setLayout(null); JButton b1 = new JButton("登録ボタン"); b1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { //ダイアログボックスを開く     //ダイアログボックスは起動するが、 //メッセージが表示されない、 //おそらく大きいデータを読むとき画面が固まるため //重いファイルを読み込む //DB登録処理 //ダイアログを閉じる } }); jf.getContentPane().add(b1); b1.setBounds(40, 400, 240, 100); jf.setVisible(true); } } *******************************************************************

  • Swing自作コンポーネントをadd出来るように、

    JTextFieldやJButtonなどを一つにまとめたコンポーネントを自作し、それをadd()出来るようにしたいです。frame.add(自作のクラスのインスタンス)を可能にしたいです。 調べて、paintComponent()を使えば良いということはわかったのですが、Graphicsのインスタンス(?)に線を描いたり、円を描いたりする方法はわかりましたが、JButtonやJTextFieldなどをGraphicsのインスタンス(?)に追加する方法はわからず、paintComponent()を使うやり方はできませんでした。 paintComponent()も使わずに、自分のできる方法で、組んだものを一応載せます。 import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; public class MyComponentTest{ public static void main(String[] args){ JFrame frame = new JFrame("タイトル"); frame.setSize(400, 300); frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS)); // 2つのテキストフィールドと一つのボタンを4つ追加する frame.add(new TwoTextFieldsAndOneButton().getContent()); frame.add(new TwoTextFieldsAndOneButton().getContent()); frame.add(new TwoTextFieldsAndOneButton().getContent()); frame.add(new TwoTextFieldsAndOneButton().getContent()); frame.setVisible(true); } } //2つのテキストフィールドと一つのボタンを一つの部品にしたい class TwoTextFieldsAndOneButton{ JTextField textField1 = new JTextField("テキストフィールド1"); JTextField textField2 = new JTextField("テキストフィールド2"); JButton button = new JButton("ボタン"); // こんなメソッドを使わずに、再現したい JPanel getContent(){ JPanel panel = new JPanel(); panel.add(textField1); panel.add(textField2); panel.add(button); return panel; } }

    • ベストアンサー
    • Java
  • Javaのメモリ・リークについて

    Javaのメモリ・リークについて 以下のコードはスレッド内で、無限ループをしています。 コンストラクタで呼び出し、ずっとこのままにしておいてもフリーズするか否かが知りたいです。 (jconsole.jarというツールがありますが、まだ理解に至っておりません。) ご存知の方がおられましたら教えてください。 よろしくお願いいたします。 import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; public class ActioneventRoopTest extends JFrame implements Runnable, ActionListener { JButton start = new JButton(); JButton change = new JButton("切り替え"); Boolean flag = true; public static void main(String[] args) { new ActioneventRoopTest(); } public ActioneventRoopTest() { change.addActionListener(this); start.addActionListener(this); this.add(change); this.pack(); this.setVisible(true); Thread thread = new Thread(this); thread.start(); } public void actionPerformed(ActionEvent e) { if (e.getSource() == change) { if (flag) { flag = false; } else if (!flag) { flag = true; } } } public void run() { while (true) { while (flag) { System.out.println("リンゴ"); } while (!flag) { System.out.println("ミカン"); } } } }

    • ベストアンサー
    • Java
  • javaでアニメーションを簡単に作るには?

    5枚の絵をループでアニメーションさせたいのですが。フレームを表示させるところまでは出来たのですが、その先がよく分かりません。どのようにしてアニメーションすればいいのでしょうか? よろしくお願い致します。 package animation; import java.awt.*; import javax.swing.*; public class Animation extends JFrame implements Runnable{ Animation () { getContentPane ().setLayout (new FlowLayout ()); setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); setSize (200, 300); setVisible (true); Thread th = new Thread (); th.start (); } public void start(){ } public void run(){ } /** * @param args the command line arguments */ public static void main (String[] args) { // TODO code application logic here Animation anime = new Animation (); } }

  • コンポーネントの組み込みについて

    アプレットでもAWTアプリでもSwingアプリでもなんでもいいんですが、 特定の条件を満たした時に、はじめは表示されていないボタンやテキストフィールドなどを後から表示させたいのですが、できません。 単純にadd()ではできないようで… やり方を教えていただけませんか。。 下は、10秒後にボタンが表示されるように自分で作ってみたサンプルアプレットです。 //<applet code="buttonsample.class" width=300 height=200></applet> import java.applet.*; import java.awt.*; import java.awt.event.*; public class buttonsample extends Applet implements Runnable { int count; //カウント Thread th; //スレッド Button BT; //ボタン public void init() { setLayout(new FlowLayout()); count = 0; BT = new Button(); BT.setLabel("ボタン"); } public void start() { if(th == null) { th = new Thread(this); th.start(); } } public void stop() { th = null; } public void run() { while(count < 10) { repaint(); count++; try { Thread.sleep(1000); } catch(InterruptedException e){} } add(BT); } public void paint(Graphics g) { g.drawString(""+(count+1),100,100); } } <EOS>

    • ベストアンサー
    • Java
  • javaでストップウォッチが上手く作れません

    あるサイトを参考にして作ってみたんですが うまく動いてくれません、多分おかしいところだらけですが どこがダメか教えてもらえるとありがたいです package timeP; import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.border.EmptyBorder; public class timeC extends JFrame implements Runnable { private JPanel contentPane; private JTextField textField; private Thread th = null; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { timeC frame = new timeC(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public timeC() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 450, 85); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.X_AXIS)); JPanel panel_3 = new JPanel(); contentPane.add(panel_3); panel_3.setLayout(new BorderLayout(0, 0)); textField = new JTextField(); panel_3.add(textField, BorderLayout.CENTER); textField.setColumns(10); JPanel panel_2 = new JPanel(); contentPane.add(panel_2); panel_2.setLayout(new BorderLayout(0, 0)); JButton JButtonstart = new JButton(" 開始 "); JButtonstart.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if ( th == null ) { th = new Thread ( ); th.start(); } } }); panel_2.add(JButtonstart, BorderLayout.CENTER); JPanel panel_1 = new JPanel(); contentPane.add(panel_1); panel_1.setLayout(new BorderLayout(0, 0)); JButton JButtonstop = new JButton(" 停止 "); JButtonstop.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if ( th != null ){ th = null; } } }); panel_1.add(JButtonstop, BorderLayout.CENTER); JPanel panel = new JPanel(); contentPane.add(panel); panel.setLayout(new BorderLayout(0, 0)); JButton btnNewButton_2 = new JButton("New button"); panel.add(btnNewButton_2, BorderLayout.CENTER); } @Override public void run() { //TODO 自動生成されたメソッド・スタブ int i; while ( th != null ){ i = Integer.parseInt( textField.getText() ); try { Thread.sleep(10000); if ( th == null ) break; } catch ( InterruptedException e ){ break; } textField.setText( Integer.toString( i + 1 ) ); } } }

  • java swing での質問です。

    javaのプログラミングをeclipseでしているのですが swingで行き詰ってしまいました。 タブペインを使いタブパネルを作り、その中にボタンを配置したのですが、 ボタンの位置をsetBoundsで動かすことができませんでした。 他の命令を使わなければならないのでしょうか? プログラミング自体が初心者のため、説明に不備があると思いますが 助けていただけると幸いです。 ひどいプログラミングかと思いますが張らせていただきました package gui; import java.awt.*; import javax.swing.*; public class ReisyokuMenu extends JFrame{ /*serialVersionUID*/ private static final long serialVersionUID=1L; /*コンポーネント作成*/ JButton syokuzaiBtn = new JButton("食材一覧"); JButton syoumiBtn = new JButton("賞味期限順"); JButton bunruiBtn = new JButton("分類"); JButton returnBtn=new JButton("Topへ"); JPanel tabPanel1 = new JPanel(); JPanel tabPanel2 = new JPanel(); JTabbedPane tabbedpane = new JTabbedPane(); public ReisyokuMenu(){ /*Closeボタンでアプリケーションが終了しないように設定*/ setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); /*フレームサイズを変更できないように設定*/ setResizable(false); /*フレームコンテナのインスタンスを生成*/ Container cPane = getContentPane(); /*レイアウトマネジャを利用しない(座標を指定する)*/ cPane.setLayout(null); setLocationRelativeTo(null); setSize(400, 380);//setBoundsはy、x、幅、高さを指定するのでsetLocationRelativeToで位置指定をする為に使用。 setTitle("一人暮らし支援ツール");//アプリケーションタイトルを入れる tabbedpane.addTab("食材を見る", tabPanel1); tabbedpane.addTab("食材を探す", tabPanel2); tabPanel1.add(syokuzaiBtn); tabPanel1.add(syoumiBtn); tabPanel1.add(bunruiBtn); syokuzaiBtn.setLocation(50, 80);//「選択」ボタン syoumiBtn.setBounds(10,10,325,120); bunruiBtn.setBounds(10,270,90,40); tabPanel2.add(new JLabel("食材名:")); tabPanel2.add(new JTextField("", 10)); setContentPane(tabbedpane); } public void setVisible(boolean isVisible){ if(isVisible){ /*フレームの表示位置を指定(x,y)*/ setLocation(200,200); } /*フレームを表示*/ super.setVisible(isVisible); } }

  • javaアプリのswingに関する質問です

    始めて投稿させていただきます。 現在、javaアプリケーションのswingを利用し、ボタンを押したら画像が表示され、ウエイトの時間を過ぎると自動的に画像が消え、またボタンが表示され・・・を繰り返すプログラムを作っています。 ですが、色々なサイトを拝見させていただき、修正を加えたのですが思うように動いてくれません。 そこで、皆様のお知恵を拝借出来ればと思い投稿させていただきました。 下記にソースコードを記載しております。 すべてのソースコードを記載しておりますので長くなっております。 また最終的には、50個前後のボタン、画像の拡大等を行う予定です。 長文になりますがアドバイスをいただけましたら幸いです。 -----------以下ソースコード-------------------- import java.io.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.imageio.*; class Test extends JPanel implements ActionListener{ static JFrame frame = new JFrame(); JButton bt1; JButton bt2; JPanel pn1 = new JPanel(); Dimension dim = this.getToolkit().getScreenSize(); int eventNo = -1; public Test() { frame.setTitle("これ"); frame.setUndecorated(true); frame.setBounds(0, 0, 640, 480); btStart(); pn1.setLayout(new FlowLayout()); frame.add(pn1); frame.setVisible(true); } public void btStart(){ bt1 = new JButton("テスト"); bt2 = new JButton("終了"); pn1.add(bt1); pn1.add(bt2); bt1.addActionListener(this); bt2.addActionListener(this); } // ボタン消去メソッド public void btFormat(){ frame.remove(pn1); bt1 = null; bt2 = null; } public void actionPerformed(ActionEvent e){ if(e.getActionCommand() == "テスト") {eventNo = 1;} if(e.getActionCommand() == "終了") {eventNo = 46;} repaint(); } public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; if(eventNo == 46){ System.exit(0); }else if(eventNo == -1){ g2.clearRect(0, 0, 640, 480); }else if(eventNo >= 0){ eventNo = -1; btFormat(); try{ g2.drawImage(ImageIO.read(new File("./image/001.jpg")), 0, 0, this); frame.add(this); sleep(100); g2.clearRect(0, 0, 640, 480); btStart(); pn1.setLayout(new FlowLayout()); frame.add(pn1); }catch(Exception e){ System.out.println(e); } } } // ウェイトを掛けるメソッド public synchronized void sleep(long msec) { for(int i=0; i<=msec; i++){ try { wait(1); } catch(InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) { frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.getContentPane().add( new Test() ); } }

    • ベストアンサー
    • Java
  • JButtonの改行したラベルがリロードで消える

    JavaAppletでJbuttonに表示する文字列の改行を実現した サンプルページを参考にボタンを作成し、IE上で表示させたのですが 初期表示は問題なく動作するものの、表示したページを 再読込(リロード)すると、文字が消えてしまいます。 (再読込後の画面コピーを添付します) リロード時にもボタンに表示された文字を表示させるためには ブラウザの設定変更やコードの修正が必要なのでしょうか? 以下は、実行環境及びコードです。 環境 OS:WindowsXP ブラウザ:IE7 JRE:1.6.0_26 ※クラスファイル、HTMLファイルともにCドライブ直下に配置し実行。 ソース ○test.java import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import javax.swing.JApplet; import javax.swing.JButton; import javax.swing.JPanel; public class test extends JApplet { private static final long serialVersionUID = 1L; JButton button; public void init() { setBackground(Color.WHITE); setLayout(new BorderLayout()); button = new JButton("<html>改行<br />ボタン</html>"); button.setPreferredSize(new Dimension(120,80)); JPanel panel = new JPanel(); panel.setBackground(Color.WHITE); panel.add(button); add(panel, BorderLayout.CENTER); } } ○test.html <html> <head></head> <body> <applet code="test.class" WIDTH=120 HEIGHT=100> </applet> </body> </html>

    • ベストアンサー
    • Java
  • JavaのSwingのレイアウト

    Swingを学習中ですが、うまくレイアウトできません。 添付した画像のようなレイアウトにしたいです。 作ってみたものは以下です。 import java.awt.BorderLayout; import java.awt.Color; import javax.swing.*; public class LayoutTest { public static void main(String[] args) { JFrame frame = new JFrame(); JPanel panel = new JPanel(); JTextField searchFiled = new JTextField("テキスト"); String[] comboboxString = {"C", "C++", "Java"}; JComboBox comboBox = new JComboBox(comboboxString); JButton button = new JButton("ボタン"); panel.add(comboBox, BorderLayout.EAST); panel.add(searchFiled, BorderLayout.CENTER); panel.add(button, BorderLayout.WEST); frame.add(panel, BorderLayout.PAGE_START); JPanel redPanel = new JPanel(); redPanel.setBackground(Color.RED); frame.add(redPanel); frame.setSize(700, 500); frame.setLocationRelativeTo(null); frame.setVisible(true); } }

    • ベストアンサー
    • Java