- ベストアンサー
Javaで電卓を再現する方法
- Javaで電卓を再現する方法を教えてください。
- 質問文章で紹介されているコードには電卓のGUIを作成するための基本的な要素が含まれています。
- しかし、コメントアウトされた部分がきちんと動作しない理由を教えていただきたいです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#2です。 jp01.setPreferredSize( new Dimension( 364, 50 )); ↑で推奨サイズを設定されていますが、推奨サイズを使用するのは、レイアウトマネージャーだけなので、レイアウトマネージャーを使わない場合は、あまり意味がありません。 setLayout( null ); こうする場合は、レイアウトマネージャーが無効化されるので、 jp01.setSize(new Dimension(364, 50)); 直接、サイズを設定しないといけません。 あと、DrawPanel のコンストラクタ内で、repaint()されていますが、意味がないので、いりません。
その他の回答 (3)
- PecoPlus
- ベストアンサー率76% (144/188)
再び、#2です。 >表示部はDrawPanel の paintComponent で >その座標に たとえば g.fillRect などで描画し >さらに演算の経過、結果などを >g.drawString するほうがよいのでしょうか? 私だったら、表示部は簡単にJLabelを使いますね。 見た目がしょぼいと思われるかもしれませんが、バックグラウンドカラー、ボーダー、フォントを変更して、工夫するだけで、結構いい感じになると思います。
- PecoPlus
- ベストアンサー率76% (144/188)
こんにちは。 JFrameは、Swingのコンポーネントの中でもやや特殊なので、ここをいじらない方がいいと思います。 JPanelを継承して、Calculatorクラス的な物を作り、JFrameにaddすると言う形のほうがよいでしょう。 ただ、(2)ように、paintメソッドをオーバーライドすることには問題があります。 Swingでは、paintメソッド内で、 paintComponentメソッド(このコンポーネントの主な見た目の描画) paintBorderメソッド(ふちどりの描画) paintChildrenメソッド(子コンポーネントの描画) これらのメソッドの呼び出しが行われます。 paintメソッドをオーバーライドしてしまうと、これらの呼び出しがすべてキャンセルされてしまいます。 ここでは、paintComponentメソッドをオーバーライドするのが正解かと思います。
お礼
さっそく回答していただきありがとうございます。 JFrame のサブクラスに JPanel のサブクラスを add するコードを作ってみたのですが その JPanel のサブクラスに 表示部用の JPanel を add したいのですが、 意図した座標に表示されません。 補足入力のところにコードを示しますので どのようにすれば意図した座標に表示されるのか 教えていただけないでしょうか? よろしくお願いします。 とにかく、貴重な時間をさいての回答、ありがとうございました。
補足
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 を意図した座標に表示する方法を 教えてほしいのですが・・・ よろしくお願いします。 長文になってしまい、申しわけありません。
うまくいかないとは、どういう状態なのでしょうか。単にJPanelがウインドウ全体に広がって表示されてしまう、ということであれば、レイアウトマネージャをはずしていないからでしょう。 Javaでは、コンテナにはレイアウトを自動的に行うレイアウトマネージャが設定されており、それによってコンポーネントの配置は自動的に調整されます。ですから、 setLayout(null); というようにしてレイアウトマネージャをカラにしてからコンポーネントをaddし、位置や大きさを調整すれば、指定の場所に配置することができます。
お礼
さっそく回答していただきありがとうございます。 どういう状態になるのかと、質問していただけましたので、 補足入力の欄に説明させていただきます。 もしよければ、教えていただけないでしょうか? よろしくおねがいします。 貴重な時間をさいての回答、ありがとうございました。
補足
それでは説明させていただきます。 まず、コードを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 のサブクラスのインスタンスを 表示させたいのですが、 どのようにすればよいのか、 もしご存知であれば教えていただけないでしょうか? よろしくおねがいします。 長文になってしまい、申しわけありません。
お礼
さっそく回答していただきありがとうございます。 指摘していただいたとおりに訂正したところ、 意図した座標に表示することができました。 貴重な時間をさいての回答、ありがとうございました。 ベストアンサーにさせていただき、いったん質問を終了しますが、 ボタンの配置について、質問させていただくかもしれませんので、 また、質問をみかけたら、よろしくお願いします。