- ベストアンサー
javaのプログラムについてです。(Swingを使っています)
javaのプログラムについてです。(Swingを使っています) 円の描写は成功しました。ですが、実行して縮小したら消えてしまいます。 どうしてでしょうか? 私の予想ですが、このプログラム自体(円自体)が中心に表示されてないとおもいます。 円を中心に表示するやり方を教えていただけないでしょうか?(TextFieldの中に円は表示させています) そしてその円を縮小、拡大したら大きさが変わらず画面の中心に表示されることのできるプログラムを作りたいとおもっています。 みなさん助言をお待ちしています。
- みんなの回答 (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(); } } }
その他の回答 (3)
- Hardking
- ベストアンサー率45% (73/160)
main の上にpaintComponentメソッドをオーバーライド して描画処理を記述してください。 public void paintComponent(Graphics g) { ・ ・ ・ } public static void main(String[] args) { ・ ・ ・ }
お礼
回答ありがとうございます。 早速やってみますね。
- Hardking
- ベストアンサー率45% (73/160)
TextFieldコントロール中に円を描画する必要性がわかんないけど 後、Swingを使っているならTextFieldではなく、JTextFieldでは 要するに、画面(ブラウザーorフレームorダイアログ)のサイズ変更で円が消えた ということは再描画処理がちゃんと出来ていないようです。 画面中心に円を描きたいなら、 //描画イベント通知時処理 public void paintComponent(Graphics g) { super.paintComponent(g); //画面の幅、高さを取得し、中心座標を算出する。 //円を描くdrawOval or fillOval revalidate(); }
補足
回答ありがとうございます。こういったプログラムを作成しているのですが。 どこに、どのようにしたらいいのかわかりますか? 質問ばかりで申し訳ありません。 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)
あなたがどんなプログラムを書いたかわからない以上, 原因などわかるはずもないです.
お礼
このプログラムを実行してみた結果ですが、円が表示されなかったのですが。 私の間違いですか??