Javaで電卓を再現する方法

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

Java JFrameにJPanelを・・・

こんにちは。趣味でプログラミングをしているものです。 さっそくですが、質問させていただきます。 Java で電卓を作っているのですが、 文具店で1000円くらいで販売している電卓を再現したいのですが、 いろいろなボタンの操作はなんとなくわかってきたのですが、 電卓のGUIについて質問させていただきます。 JFrame を継承したクラスに背景の画像を描画し その上に、計算の経過、結果を表示するJPanelを 継承したクラスのインスタンスを 特定の座標に配置したいのですが、 うまくいきません。 以下に自分の作ったコードを載せますので、 どこが悪いのか、教えていただけないでしょうか。 よろしくお願いします。 package test01_frame; import java.awt.*; import javax.swing.*; public class TestFrame extends JFrame { Image bgimage; JPanel jp01; TestFrame() { super(); setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); setSize( 384, 576 ); setLocationRelativeTo( null ); bgimage = new ImageIcon( "images/image01.jpg").getImage(); repaint(); //コメントアウトした部分がわからない箇所です。 //jp01 = new JPanel(); //jp01.setPreferredSize( new Dimension( 360, 50 )); //jp01.setBackground(Color.RED); //add( jp01 ); //jp01.setLocation( new Point( 10, 30 )); 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(); } }

noname#173931
noname#173931
  • Java
  • 回答数4
  • ありがとう数3

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

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

  • JPanelで宣言したメソッドについて

    JPanelを継承したクラスで、引数をもらってその引数を表示するメソッドを作成します。そして別のJFrameを継承したクラスの中で、さきほど作成したメソッドを利用したいのですが、どうすればできるのでしょうか?そもそもこのやり方できちんと表示されるのでしょうか? ぜひともご教授のほど宜しくお願いします。 以下はプログラムになります。 import java.awt.*; import java.awt.event.*; import javax.swing.*; class Ptest extends JPanel { public void paintComponent(Graphics g) { super.paintComponent(g); g.drawString("よろしく", 50, 50); } public void draw(String s) { Graphics g = getGraphics(); g.drawString(s, 100, 100); } } class Ftest extends JFrame { JLabel jlb; public Ftest() { setSize(350, 300); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); Container c = getContentPane(); Ptest p = new Ptest(); p.draw("yoroshiku"); c.add(p); p.setLayout(null); jlb = new JLabel("frame"); p.add(jlb); jlb.setBounds(70, 70, 50, 50); } } public class Test1 { public static void main(String[] args) { JFrame w = new Ftest(); w.show(); } }

    • ベストアンサー
    • Java
  • 「継承されたメソッドの可視性を下げることは出来ません。」というエラーの

    「継承されたメソッドの可視性を下げることは出来ません。」というエラーの意味がわかりません。  JAVA初心者です、宜しくお願いします。  下のようなコードを書きましたが、"void paint(Graphics g)"の箇所で 「Canvasから継承されたメソッドの可視性を下げることは出来ません。」 とのエラーメッセジが出ました。  "public void paint(Graphics g)"とかくと、エラーは消えました。  何故"public"をつける必要があるのでしょうか。  また、クラス自身には、publicをつけない場合には、publicと見なされると本で読みましたが  メッソドにはこのようなルールはないのでしょうか。 ======================================= public class Canvas_test extends Canvas { public static void main(String[] args) { JFrame frame = new JFrame(); frame.setTitle("Canvas_test"); frame.setBounds(0,0,480,380); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setResizable(false); frame.setLayout(null); JPanel cp = new JPanel(); cp.setLayout(null); frame.add(cp); cp.setBounds(38,20,400,300); Canvas canvas = new Canvas_test(); cp.add(canvas); canvas.setBounds(0,0,400,300); frame.setVisible(true); } void paint(Graphics g) { g.drawString("aaaa",40,40); } } ========================================

    • ベストアンサー
    • Java
  • 上に色をつけるJPanelを作りたい

    つい先日も質問させていただきましたが、また分からないことがでてきたのでお聞きします。 JPanelのなかにOverlayLayoutで2枚のJPanel(上にglassPane、下にcontentPane)を配置し、overがtrueになったらglassPaneに色を書くようにしたいと思っています。 ですが、下のcontentPane部分にボタンなどがあると、その部分にうまく色がつきません。 どうすればいいのでしょうか。よろしくお願いします。 自分で組んでみたコードを示します。 ****** import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Test extends JLabel{ private JPanel glassPane; private JPanel contentPane = new JPanel(); private JButton button1 = new JButton("OverlayTest"); private boolean over = false; public Test(){ glassPane = new JPanel(){ @Override protected void paintComponent(final Graphics g) { super.paintComponent(g); if(!over)return; Graphics2D g2 = (Graphics2D) g; g2.setColor(new Color(Color.MAGENTA.getRed(), Color.MAGENTA.getGreen(), Color.MAGENTA.getBlue(), 150)); g2.fillRect(0, 0, this.getWidth(), this.getHeight()); } }; button1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { setOver(!over); glassPane.repaint(); //glassPane.revalidate(); } }); contentPane.setLayout(new GridBagLayout()); contentPane.add(button1); glassPane.setOpaque(false); setLayout(new OverlayLayout(this)); add(glassPane); add(contentPane); } public void setOver(boolean over){ this.over = over; } public static void main(String[] args) { JFrame frame = new JFrame(); frame.add(new Test()); frame.setSize(500,400); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } }

    • ベストアンサー
    • Java
  • JComboとJCheckとJPanelについて

    勉強しているのですが、書き方が全くわからないので、質問します。 この3つを使って図のようなプログラムをつくりたいのですが、どのように書いたらいいのでしょうか? ご教授お願いいたします。 中身をどのように書いたらいいのかまったくわからないんです・・・。 import java.awt.*; import javax.swing.*; public class HaitiRensyu extends JPanel{ public HaitiRensyu(){ setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); addCheckBox(); addComboBox(); addButtons(); } private void addCheckBox(){ JPanel cboxPanel = new JPanel(); add(cboxPanel); } private void addButtons() { JPanel btnPanel = new JPanel(); add(btnPanel); } private void addComboBox() { JPanel comboPanel = new JPanel(); add(comboPanel); } public static void main(String[] args){ JFrame frame = new JFrame("JPanel"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); HaitiRensyu h = new HaitiRensyu(); frame.add(h, BorderLayout.CENTER); frame.pack(); frame.setVisible(true); } }

  • 簡単なこーどですが、エラーの原因が分かりません

    今晩は、JAVAの初心者です、宜しくお願いします。 下のコードでエラーがでます、いくら考えても原因がさっぱり分かりません。 一体何処が悪いのでしょうか、宜しくお願いします。 また、最後の「j.show();」では警告が出ています。 何が原因でしょう?? ============================================================ import java.awt.Graphics; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import javax.swing.JFrame; class JFrame_Ohayou extends JFrame implements WindowListener{ /*********** コンストラクタ ********************/ public JFrame_Ohayou(){ setSize(400,300); setTitle("JFrameのテスト"); addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); } /******************* paint ***********************/ public void paint(Graphics g){ super.paint(g); g.drawString("おはよう",20,40); } } /******************* main ***********************/ public class JFrameTest{ public static void main(String[] args){ JFrame_Ohayou j = new JFrame_Ohayou(); j.show(); } } =============================================================

    • ベストアンサー
    • Java
  • Jpanelへの描画について(初心者です)

    質問1 実行した時に内容が表示されたりされなかったりします、どうしてでしょうか? いろいろ試してみましたが分かりませんでした。 質問2 JPanelではダブルバッファリング機能が備わっているみたいですが、 という事はこのソースでもそれは行なわれているのでしょうか? 以上2点と質問が多いですがよろしくお願いします。 import java.awt.*; import javax.swing.*; public class JFrameTest extends JFrame{  JPanelTest panel;  Container ct;  public static void main(String[] args){   new JFrameTest();  }  public JFrameTest(){   super("JFrameTest");   panel = new JPanelTest();   ct = getContentPane();   setSize(480,480);   setResizable(false);   setVisible(true);   setDefaultCloseOperation(EXIT_ON_CLOSE);   ct.add(panel);  } } class JPanelTest extends JPanel{  public JPanelTest(){   setSize(480,480);  }  public void draw(Graphics g){   g.drawString("Test",240,240);  }  public void paintComponent(Graphics g){   super.paintComponent(g);   draw(g);  } }

    • ベストアンサー
    • Java
  • javaについて質問

    import javax.swing.*; import java.awt.Color; import java.awt.Graphics; import java.awt.event.*; public class tt extends JFrame { public tt(){ setTitle("hogehoge"); setBounds( 10, 10, 300, 200); JButton btn1 = new JButton("続ける"); final JPanel p = new JPanel(); p.setBackground(Color.white); btn1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event){ } } ); p.add(btn1); getContentPane().add(p); } public static void main(String[] args){ tt test = new tt(); test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); test.setVisible(true); /* 実際に表示する */ } } Graphics g; g.drawString("ほげさんじょう",130,120);を追加しても コンパイルが通りません。 どうすれば画面に文字列を表示するんですか? あとテキストフィールドを追加するさいに、座標していとかして追加できないんですか?

  • javaの画像の表示のプログラムとmouselistenerのプログラ

    javaの画像の表示のプログラムとmouselistenerのプログラム(それぞれ↓にあります)をひとつに合わせたいのですがどうすればいいでしょうか? import java.awt.event.*; import javax.swing.*; class MyPanel extends JPanel implements MouseListener{ public MyPanel() { addMouseListener(this); } public void mouseClicked(MouseEvent e) { int x=e.getX(); int y=e.getY(); System.out.println("マウスがクリックされました (" + e.getX() + ", " + e.getY() + ")"); if((x<100&&x>40)&&(y<100&&y>40)){ System.out.println("範囲内"); }else{ System.out.println("aaa"); } } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } } public class MouseEventExample extends JFrame { public static void main(String[] args) { new MouseEventExample(); } MouseEventExample() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); getContentPane().add(new MyPanel()); setSize(300, 200); setVisible(true); } } ======↑のプログラムと↓のプログラムを合わせたいのです package novel; import java.awt.*; import java.awt.geom.*; import java.awt.event.*; import javax.swing.*; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import java.io.IOException; public class Java2dTest extends JFrame{ public static void main(String[] args){ Java2dTest test = new Java2dTest(); test.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){System.exit(0);} }); test.setBounds( 0, 0, 200, 200); test.setVisible(true); } public void paint(Graphics g){ Graphics2D g2 = (Graphics2D)g; BufferedImage readImage = null; try { readImage = ImageIO.read(new File("sample.png")); } catch (Exception e) { e.printStackTrace(); readImage = null; } if (readImage != null){ g2.drawImage(readImage, 0, 0, this); } } }

  • 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
  •  static 参照するには??

     static 参照するには??  Java初心者です、宜しくお願いします。  下のようなプログラムを書きましたが、「Container gc = getContentPane();」 の箇所で、「型 JFrame の非 static メソッド getContentPane() を static 参照することはできません」とエラーが出ます。 意味がわかりません、またどのように変更してやればよいのでしょうか。 宜しくお願いします。  ======================================================================= class Canvas1 extends JFrame { public void paint(Graphics g) { g.drawRect(150, 150, 50, 50); } } public class SimpleDraw extends JFrame { public static void main(String[] args) { JFrame jf = new JFrame(); JPanel jp = new JPanel(); Container gc = getContentPane(); gc.add(jp); Canvas1 c = new Canvas1; jp.add(c); jf.add(jp); jf.setVisible(true); } }

    • ベストアンサー
    • Java

専門家に質問してみよう