• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Java JFrameにJPanelを・・・)

Javaで電卓を再現する方法

このQ&Aのポイント
  • Javaで電卓を再現する方法を教えてください。
  • 質問文章で紹介されているコードには電卓のGUIを作成するための基本的な要素が含まれています。
  • しかし、コメントアウトされた部分がきちんと動作しない理由を教えていただきたいです。

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

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

 #2です。 jp01.setPreferredSize( new Dimension( 364, 50 ));  ↑で推奨サイズを設定されていますが、推奨サイズを使用するのは、レイアウトマネージャーだけなので、レイアウトマネージャーを使わない場合は、あまり意味がありません。 setLayout( null );  こうする場合は、レイアウトマネージャーが無効化されるので、 jp01.setSize(new Dimension(364, 50));  直接、サイズを設定しないといけません。  あと、DrawPanel のコンストラクタ内で、repaint()されていますが、意味がないので、いりません。

noname#173931
質問者

お礼

さっそく回答していただきありがとうございます。 指摘していただいたとおりに訂正したところ、 意図した座標に表示することができました。 貴重な時間をさいての回答、ありがとうございました。 ベストアンサーにさせていただき、いったん質問を終了しますが、 ボタンの配置について、質問させていただくかもしれませんので、 また、質問をみかけたら、よろしくお願いします。

その他の回答 (3)

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

 再び、#2です。 >表示部はDrawPanel の paintComponent で >その座標に たとえば g.fillRect などで描画し >さらに演算の経過、結果などを >g.drawString するほうがよいのでしょうか?  私だったら、表示部は簡単にJLabelを使いますね。  見た目がしょぼいと思われるかもしれませんが、バックグラウンドカラー、ボーダー、フォントを変更して、工夫するだけで、結構いい感じになると思います。

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

 こんにちは。  JFrameは、Swingのコンポーネントの中でもやや特殊なので、ここをいじらない方がいいと思います。  JPanelを継承して、Calculatorクラス的な物を作り、JFrameにaddすると言う形のほうがよいでしょう。  ただ、(2)ように、paintメソッドをオーバーライドすることには問題があります。    Swingでは、paintメソッド内で、 paintComponentメソッド(このコンポーネントの主な見た目の描画) paintBorderメソッド(ふちどりの描画) paintChildrenメソッド(子コンポーネントの描画)  これらのメソッドの呼び出しが行われます。  paintメソッドをオーバーライドしてしまうと、これらの呼び出しがすべてキャンセルされてしまいます。  ここでは、paintComponentメソッドをオーバーライドするのが正解かと思います。

noname#173931
質問者

お礼

さっそく回答していただきありがとうございます。 JFrame のサブクラスに JPanel のサブクラスを add するコードを作ってみたのですが その JPanel のサブクラスに 表示部用の JPanel を add したいのですが、 意図した座標に表示されません。 補足入力のところにコードを示しますので どのようにすれば意図した座標に表示されるのか 教えていただけないでしょうか? よろしくお願いします。 とにかく、貴重な時間をさいての回答、ありがとうございました。

noname#173931
質問者

補足

JFrame のサブクラスに JPanel のサブクラスを add するコードを作ってみたので もしよろしければ、見ていただきたいのですが、 ----------------------------------------- 電卓を描画する JPanel のサブクラスです public class DrawPanel extends JPanel { Image bgimage; JPanel jp01; DrawPanel() { super(); setPreferredSize( new Dimension( 384, 576 )); // setLayout をコメントアウトすると // JPanel も表示されるが // 座標が意図したところには表示されません。 // コメントアウトしなければ、 // jp01 が表示されません。 //setLayout( null ); bgimage = new ImageIcon( "images/image01.jpg").getImage(); jp01 = new JPanel(); jp01.setPreferredSize( new Dimension( 364, 50 )); jp01.setBackground(Color.LIGHT_GRAY); jp01.setLocation( new Point( 10, 100 )); add( jp01 ); repaint(); } public void paintComponent( Graphics g ) { super.paintComponent(g); g.drawImage( bgimage, 0, 0, null ); } } --------------------------------------------- DrawPanel を add する JFrame のサブクラスです。 public class TestFrame02 extends JFrame { DrawPanel dp; TestFrame02() { super( "TestFrame02"); setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); dp = new DrawPanel(); add( dp ); setResizable( false ); pack(); } public static void main( String[] args ) { TestFrame02 tf02 = new TestFrame02(); tf02.setVisible( true ); } } 表示部はDrawPanel の paintComponent で その座標に たとえば g.fillRect などで描画し さらに演算の経過、結果などを g.drawString するほうがよいのでしょうか? DrawPanel のインスタンス上に JPanel を意図した座標に表示する方法を 教えてほしいのですが・・・ よろしくお願いします。 長文になってしまい、申しわけありません。

noname#177743
noname#177743
回答No.1

うまくいかないとは、どういう状態なのでしょうか。単にJPanelがウインドウ全体に広がって表示されてしまう、ということであれば、レイアウトマネージャをはずしていないからでしょう。 Javaでは、コンテナにはレイアウトを自動的に行うレイアウトマネージャが設定されており、それによってコンポーネントの配置は自動的に調整されます。ですから、 setLayout(null); というようにしてレイアウトマネージャをカラにしてからコンポーネントをaddし、位置や大きさを調整すれば、指定の場所に配置することができます。

noname#173931
質問者

お礼

さっそく回答していただきありがとうございます。 どういう状態になるのかと、質問していただけましたので、 補足入力の欄に説明させていただきます。 もしよければ、教えていただけないでしょうか? よろしくおねがいします。 貴重な時間をさいての回答、ありがとうございました。

noname#173931
質問者

補足

それでは説明させていただきます。 まず、コードを2つ示します。 (1) public class TestFrame extends JFrame { Image bgimage; JPanel jp01; TestFrame() { super(); setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); setLayout( null ); setSize( 384, 576 ); setLocationRelativeTo( null ); bgimage = new ImageIcon("images/image01.jpg").getImage(); jp01 = new JPanel(); jp01.setBackground(Color.RED); jp01.setBounds( 10,40, 564, 50 ); add( jp01 ); setVisible( true ); } /** * @param args */ public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ new TestFrame(); } } ---------------------------------------------- (2) public class TestFrame extends JFrame { Image bgimage; JPanel jp01; TestFrame() { super(); setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); setLayout( null ); setSize( 384, 576 ); setLocationRelativeTo( null ); bgimage = new ImageIcon("images/image01.jpg").getImage(); jp01 = new JPanel(); jp01.setBackground(Color.RED); jp01.setBounds( 10,40, 364, 50 ); add( jp01 ); setVisible( true ); } public void update( Graphics g ) { paint( g ); } public void paint( Graphics g ) { g.drawImage( bgimage, 0, 0, null ); } /** * @param args */ public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ new TestFrame(); } } ------------------------------ (1)では背景の画像を表示せず 演算の経過、結果を表示するJPanel 実際には、JPanelのサブクラスになるでしょうが、 をaddしています。 これはJPanel を表示させることができました。 指摘していただいた setLayout( null ) を追加しました。 (2)だと、JPanel が表示されずに 背景画像のみが表示されてしまいます。 背景画像の上にJPanel あるいは JPanel のサブクラスのインスタンスを 表示させたいのですが、 どのようにすればよいのか、 もしご存知であれば教えていただけないでしょうか? よろしくおねがいします。 長文になってしまい、申しわけありません。

関連するQ&A