- ベストアンサー
Buttonを押すと画像が表示されるには?
Buttonを押すと画像が表示されるGUIを作ろうと思っています。ただ画像を表示させるとき、私が知りうる限りでは、ウィンドウのサイズを変えたり、他のウィンドウで覆ったりすると、その画像が消えてしまうのです。ですから、画像が消えないようにするにはどうすればいいのでしょうか? 上記に書いたことを、Applet上でよく見かけるのですが、今回アプリケーションで実現したいのです。 ぜひ宜しくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
コードを三箇所追加しました。 コード追加1 何を描画するかの判定、変数。 コード追加2 判定変数の条件文で、何を描画するか、 0で、何も描画しない。 他の数値では、線を描画する。 コード追加3 ボタンのイベント処理で、 変数に1を、入れて、再描画、直線を描く package pane1; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class p extends JFrame { private JPanel jp1, jp2; private JComboBox jcb; private JButton jb; //コードの追加1 int gc =0; public p() { setSize(500, 500); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); getContentPane().setLayout(new BorderLayout()); jp1 = new JPanel(); getContentPane().add(jp1, "North"); jp1.setLayout(new FlowLayout()); String[] str = {"a", "b", "c"}; DefaultComboBoxModel combomodel = new DefaultComboBoxModel(str); jcb = new JComboBox(combomodel); jcb.setPreferredSize(new Dimension(75, 21)); jp1.add(jcb); jb = new JButton("ボタン"); jp1.add(jb); jb.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { jbevent(e); } }); jp2 = new JPanel() { public void paintComponent(Graphics g) { super.paintComponent(g); //コードの追加2 if (gc == 0){ }else { g.drawLine(150, 150, 250, 250); } } }; getContentPane().add(jp2, "Center"); } private void jbevent(ActionEvent e) { //コードの追加3 gc =1; repaint(); //(1) } public static void main(String args[]) { p s3 = new p(); s3.setVisible(true); } }
その他の回答 (1)
- tom11
- ベストアンサー率53% (134/251)
こんにちは、以下のようで、どうでしょう。 JFramにJPanelを貼り付け、 JPanelのpaintComponent内に 描画するものを書きます。 今回は、便宜的に、drawRectを利用しましたが、 画像にしたいなら、drawImageにすれば 良いと思います。 画像を変えたいなら、 ボタンで、drawImageのImageを いろいろ変えてみればいいと思います。 また、実行してみると、ウィンドのサイズを 変えたり、サイズを変えても、画像が 消えることは、無いです。 package kienai; import java.awt.Graphics; import javax.swing.JPanel; /** * * @author */ public class kienai extends javax.swing.JFrame { int x = 0,y = 0; /** Creates new form kienai */ public kienai() { initComponents(); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ // <editor-fold defaultstate="collapsed" desc=" 生成されたコード"> private void initComponents() { jPanel1 = new JPanel(){ public void paintComponent(Graphics g){ super.paintComponent(g); g.drawRect(x, y, 100, 100); } }; jButton1 = new javax.swing.JButton(); jButton2 = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); jPanel1.setLayout(null); jButton1.setText("jButton1"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton1ActionPerformed(evt); } }); jPanel1.add(jButton1); jButton1.setBounds(200, 280, 75, 21); jButton2.setText("jButton2"); jButton2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton2ActionPerformed(evt); } }); jPanel1.add(jButton2); jButton2.setBounds(320, 280, 75, 21); getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER); java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); setBounds((screenSize.width-425)/2, (screenSize.height-349)/2, 425, 349); } // </editor-fold> private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { x=100;y=100; repaint(); // ここに処理コードを追加: } private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { x=10;y=10; repaint(); // ここに処理コードを追加: } /** * @param args the command line arguments */ public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new kienai().setVisible(true); } }); } // 変数宣言 - 編集不可 private javax.swing.JButton jButton1; private javax.swing.JButton jButton2; private javax.swing.JPanel jPanel1; // 変数宣言の終わり }
お礼
ご返答ありがとうございます。 返答して頂いたプログラムを実行しますと、描画内容が消えることもなく、すばらしいプラグラムだと思います。 しかし、ボタンを押すと描画される、という質問なのですが、最初何も描画されていない状態から、ボタンを押すと描画される方法を知りたいのです。 そこで、tom11さんのを参考にプログラムしてみました。 package test20060207; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class sample3 extends JFrame { private JPanel jp1, jp2; private JComboBox jcb; private JButton jb; public sample3() { setSize(500, 500); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); getContentPane().setLayout(new BorderLayout()); jp1 = new JPanel(); getContentPane().add(jp1, "North"); jp1.setLayout(new FlowLayout()); String[] str = {"a", "b", "c"}; DefaultComboBoxModel combomodel = new DefaultComboBoxModel(str); jcb = new JComboBox(combomodel); jcb.setPreferredSize(new Dimension(75, 21)); jp1.add(jcb); jb = new JButton("ボタン"); jp1.add(jb); jb.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { jbevent(e); } }); jp2 = new JPanel() { public void paintComponent(Graphics g) { super.paintComponent(g); g.drawLine(150, 150, 250, 250); } }; getContentPane().add(jp2, "Center"); } private void jbevent(ActionEvent e) { //(1) } public static void main(String args[]) { sample3 s3 = new sample3(); s3.setVisible(true); } } (1)の部分に何を入れれば、実現するのでしょうか? 度々質問してしまい申し訳ありません。 ぜひよろしくお願いします。
お礼
まさにこのとおりです!これを元に作っていきたいと思います。 何度も何度も丁寧に答えてくれてありがとうございました。助かりました。ご返答ありがとうございました。