• ベストアンサー

javaのプログラムについてです。(Swingを使っています)

javaのプログラムについてです。(Swingを使っています) 円の描写は成功しました。ですが、実行して縮小したら消えてしまいます。 どうしてでしょうか? 私の予想ですが、このプログラム自体(円自体)が中心に表示されてないとおもいます。 円を中心に表示するやり方を教えていただけないでしょうか?(TextFieldの中に円は表示させています) そしてその円を縮小、拡大したら大きさが変わらず画面の中心に表示されることのできるプログラムを作りたいとおもっています。 みなさん助言をお待ちしています。

  • Java
  • 回答数4
  • ありがとう数5

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

  • ベストアンサー
  • ontojava
  • ベストアンサー率61% (8/13)
回答No.4

ご参考になれば幸いです。 import java.awt.*; import java.awt.event.*; import javax.swing.*; //import java.net.*; public class le extends JPanel implements ActionListener { private JLabel lb; private JTextField lc; private JButton bt; private JPanel pn1,pn2; private int x, y, w, h, R; private DrawOvalPane dop; public static void main(String args[]) { JFrame frame = new JFrame("サンプル"); frame.setContentPane(new le()); frame.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.pack(); frame.setVisible(true); } public le() { dop = new DrawOvalPane(); //ラベルとテキストフィールドの作成 lb = new JLabel("半径を入力してください : " , JLabel.RIGHT); lc = new JTextField(); lc.addActionListener(this); bt = new JButton("決定"); pn1 = new JPanel(); pn2 = new JPanel(); //pn1パネルはGridLayoutで1行2列 pn1.setLayout(new GridLayout(1,2)); //pn1パネルへラベルとテキストフィールドの追加 pn1.add( lb); pn1.add( lc); //pn2パネルへボタンの追加 pn2.add( bt); setLayout(new BorderLayout()); add("North", pn1); add("Center", dop); add("South", pn2); //リスナの登録 bt.addActionListener(new SampleActionListener()); } // 半径を入力し、エンターキーを押したときに実行される public void actionPerformed(ActionEvent bt){ dop.repaint(); } // 円を描くクラス class DrawOvalPane extends JPanel { public void paintComponent(Graphics g){ super.paintComponent(g); if( lc.getText() .equals ("") || lc.getText() .equals( null) ) { return; } try{ R = Integer.parseInt(lc.getText()); } catch (NumberFormatException nfe){ System.out.println(nfe); } Dimension d = dop.getSize(); x = (d.width - R*2) / 2; y = (d.height - R*2) / 2; h = w = 2 * R; g.drawOval(x, y, w, h); } } public Dimension getMinimumSize() { return new Dimension(700,700); } public Dimension getPreferredSize() { return getMinimumSize(); } //決定ボタンをクリックした時のアクション class SampleActionListener implements ActionListener { public void actionPerformed(ActionEvent e) { //lc.setText("終了"); dop.repaint(); } } }

sbarukamyu
質問者

お礼

このプログラムを実行してみた結果ですが、円が表示されなかったのですが。 私の間違いですか??

その他の回答 (3)

  • Hardking
  • ベストアンサー率45% (73/160)
回答No.3

main の上にpaintComponentメソッドをオーバーライド して描画処理を記述してください。 public void paintComponent(Graphics g) { ・ ・ ・ } public static void main(String[] args) { ・ ・ ・ }

sbarukamyu
質問者

お礼

回答ありがとうございます。 早速やってみますね。

  • Hardking
  • ベストアンサー率45% (73/160)
回答No.2

TextFieldコントロール中に円を描画する必要性がわかんないけど 後、Swingを使っているならTextFieldではなく、JTextFieldでは 要するに、画面(ブラウザーorフレームorダイアログ)のサイズ変更で円が消えた ということは再描画処理がちゃんと出来ていないようです。 画面中心に円を描きたいなら、 //描画イベント通知時処理 public void paintComponent(Graphics g) {   super.paintComponent(g); //画面の幅、高さを取得し、中心座標を算出する。   //円を描くdrawOval or fillOval revalidate(); }

sbarukamyu
質問者

補足

回答ありがとうございます。こういったプログラムを作成しているのですが。 どこに、どのようにしたらいいのかわかりますか? 質問ばかりで申し訳ありません。 import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.net.*; public class le extends JFrame implements ActionListener { private JLabel lb; private JTextField lc, lf; private JButton bt; private JPanel pn1; private int x, y, w, h, R; public static void main(String args[]) { le sm = new le(); } public le() { //タイトルの設定 super("サンプル"); //コンテンツペインの取得 Container cnt = getContentPane(); //コンポーネントの作成 lb = new JLabel("半径を入力してください。"); lc = new JTextField(); lc.addActionListener(this); lf = new JTextField(); bt = new JButton("決定"); pn1 = new JPanel(); //コンテナの設定 pn1.setLayout(new GridLayout(2,2)); //コンテナへの追加 pn1.add(lb); pn1.add(lc); cnt.add(pn1, BorderLayout.NORTH); cnt.add(lf, BorderLayout.CENTER); //cnt.add(bt, BorderLayout.SOUTH); //リスナの登録 bt.addActionListener(new SampleActionListener()); setSize(800, 800); setVisible(true); } // 色を入力し、エンターキーを押したときに実行される public void actionPerformed(ActionEvent bt){ R = Integer.parseInt(lc.getText()); x = 550; y = 550; h = w = 2 * R; repaint(); // 再描画 } public void paint(Graphics g){ g.drawOval(x, y, w, h); } //リスナクラス class SampleActionListener implements ActionListener { public void actionPerformed(ActionEvent e) { lf.setText("終了"); } } class SampleWindowListener extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } } }

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

あなたがどんなプログラムを書いたかわからない以上, 原因などわかるはずもないです.

関連するQ&A

  • javaのswingコンポーネントについて質問です。

    javaのswingコンポーネントについて質問です。 javaをやり始めて2ヶ月ぐらいたちました。 今までアプレットとアプリケーションの両方をやりこちらはできたのですが 「swing」を使用したアプレット(JApplet)だけがアプレットビューアやhtmlで開いても実行できません。 わかるかたできれば教えていただければ幸いです。 追記 実行できないのはソースファイルにJAppletで組んだプログラムだけです。 本に記載されたソースプログラムやインターネットに上がっているソースプログラムを実行してみましたが これらもJAppletを使用したものだけができませんでした。

  • swingについて。

    今JDBCとJAVAを利用してswingからMySQLへの接続と検索を独学でやろうと思っているのですが。 まず最初にswing画面でユーザとパスを入れてログインできるようにしたいのですがどうしてもできないのでアドバイスお願いします。 class Swing{ swingについて色々ユーザ&パス入力画面&ボタン } class MySQLconn{   MySQL接続   ユーザ名&パス&urlをmainから受け取って   接続を試みてDriverManager.getConnection   をmainに返す class MySQLselect{ 検索内容    mainから受け取り検索&表示 class Main{ それぞれのメソッドを利用する   例外が出たとき用にtry-catchがある    こんな感じなのですがMainでBufferedReaderでやっていたときはちゃんとできたのですがswingを使うと ユーザ名&パスが最初は何も入っていない状態になってしまいMainで例外が出て終わってしまいます。 なんとかswingでユーザ名&パスを入力してからその後 実行をさせる事はできないでしょうか。 アドバイスお願いします。   

    • ベストアンサー
    • Java
  • 実行結果をSwingで表示

    http://godwood.allnet.ne.jp/vioret/j2seobex.htmlでDLできるOBEXライブラリに付属しているコマンドベースでファイルを転送することができるサンプルプログラム(obex.java)の実行結果などをSwing上(JTextAreaなどに)で表示させたいと考えているのですが、そのような事は可能でしょうか?? ご教授お願いします。

    • ベストアンサー
    • Java
  • プログラムを補って下さい(swing)

    下記のプログラムで実装できない所がありますので補える方は教えてください 1.チェックボックスで削除を選択した、行番号をコンソールに表示したい。 2.コンボボックスで選択されたコンボボックスの文字列と選択されたコンボボックス   のインデックス番号が知りたい 以上です。 import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.lang.Class; import javax.swing.DefaultCellEditor; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellEditor; import javax.swing.table.TableModel; public class JTableSample1 implements ActionListener{ JComboBox comboBox; public static void main(String[] args) { new JTableSample1().init(); } public void init() { String[] title = { "削除", "String", "Integer", "JComboBox" }; String prompt = "選んで下さい"; Object[][] records = { { Boolean.FALSE, "Rachel Green", new Integer(1970), prompt }, { Boolean.FALSE, "Monica Geller", new Integer(1969), prompt }, { Boolean.FALSE, "Phoebe Buffay", new Integer(1967), prompt }, { Boolean.FALSE, "Joey Tribbiani", new Integer(1967), prompt }, { Boolean.FALSE, "Chandler Bing", new Integer(1968), prompt }, { Boolean.FALSE, "Ross Geller", new Integer(1967), prompt } }; TableModel model = new DefaultTableModel(records, title) { public Class<?> getColumnClass(int column) { return getValueAt(0, column).getClass(); } }; JTable table = new JTable(model); comboBox = new JComboBox(); comboBox.addItem("ごはん食べてる"); comboBox.addItem("テレビみてる"); comboBox.addItem("仕事してる"); comboBox.addItem("寝てる"); TableCellEditor editor = new DefaultCellEditor(comboBox); table.getColumnModel().getColumn(3).setCellEditor(editor); JFrame frame = new JFrame("Joey Table"); frame.getContentPane().add(new JScrollPane(table)); frame.setSize(640, 240); frame.setVisible(true); } public void actionPerformed(ActionEvent e) { System.out.println("選択されたコンボボックス:"+(String)comboBox.getSelectedItem()); System.out.println("選択されたコンボボックスのインデックス番号:"+comboBox.getSelectedIndex()); } }

    • ベストアンサー
    • Java
  • JavaのJFrameについて

    いまJavaでパソコンに表示する時計を作っています。 JFrameを使っているのですが、ダブルバッファリングで描写しながらSwingのJButtonを使いたいのですが、今自分の知ってる方法だとうまく行きません。 ひとつは、 repaint()関数とpaint()関数を使う方法です。 この方法だとダブルバッファリングのままJButtonと同梱させることができるのらしいですが、表示が滑らかじゃありません。自分的にはFPSが60はほしいです。 もう一つの方法は、graphicsクラスを使って描写する方法です。 こちらはFPS的に問題はないのですがJButtonが置けません。 要点をまとめると、 Graphicsによる描写とSwingのJButtonを同時に一つのwindowでつかいたい、 描写速度をFPS 60程度にしたい です。 書き方が雑なので質問の意図が伝わりにくいかと思いますが、回答よろしくお願いします

  • Java GUIについて質問です

    Javaの初心者でswingを用いたプログラムの書き方を勉強中です。今、ボタンを何回クリックしたかを表示させるプログラムを書こうと思っているのですが、actionPerformedの中で++を用いようとしてもうまくいかず、詰まってしまっています。どうしたらいいのか教えていただきたいです。

    • ベストアンサー
    • Java
  • Javaプログラムからファイル操作

    教えてください。 Javaプログラムであるシェルのスクリプトファイルを呼び出します。 そのスクリプトファイルが他のサーバからファイルを取得してくるなどの操作をします。 SSHでLinuxにログインし、スクリプト自体を手動で実行したら問題無いのですが プログラムから実行する時に”許可がありません”などのエラーが表示され、失敗します。 chownやchmod、もしくは何か特定のユーザ(例:rootユーザ)をプログラムの中で指定して 実行する必要があるのでしょうか? もしくは何かLinux上で設定変更する必要があったりするのでしょうか? よろしくお願い致します。

    • ベストアンサー
    • Java
  • Java Program を実行する方法

    Java Applet のProgram を実行すると、以前は問題なく表示された画像が、最近では表示され無くなりました。以前のように表示させる方法をできるだけ具体的に詳しく教えてください。よろしくお願いします。

    • ベストアンサー
    • Java
  • SWTとSwingの違い

    Java初心者ですが、質問させてください。 SWTとSwingという二つのGUIを作るための手法(?)があるのを学習しました。そこで「SWTがOSネイティブのAPIを呼び出す」「Eclipse自体がSWTで組まれてる」「Swingより高速」「でも、SwingもPC環境の向上などで早い」などとどこかに書いてあった気がするのですが、疑問があります。 ・SwingでのGUIというのは、なんていうか、何年ぐらい前と具体的には言えないのですが、昔のJavaアプリっぽい、『浮いた感じ』のGUIになるのでしょうか。「Cabos」のGUIがちょうど、その「浮いた感じ」に相当するんですか? ・逆に、Eclipseで見られるように、Windows付属ソフトのようなメニューバーを持つ(マウスカーソルを合わせたときの色の変化や、選択したときのポップアップの仕方なども含め)ソフトで、Javaで作成されたものというのが、SWTで作られたソフトということでしょうか? ・Javaの特性と、SWTの特性を合わせて、「OSネイティブのAPIを呼び出すのにもかかわらず、同じ実行ファイルで、Windows・Mac両方ともで実行できるソフト」というのを作れるということでしょうか? ・Swing=「Cabosのような、あの浮いた感じ」ではあるのもの、高速化が十分なされているということですが、実際のところどうなのでしょうか。何か速度差の具体例があれば教えていただきたいのですが・・。何か「たとえ話」でもかまいません。 以上駄文で読みにくいかと思いますが、回答の程よろしくお願いします。

    • ベストアンサー
    • 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

専門家に質問してみよう