ショボ短歌会

Buttonを押すと画像が表示されるGUIを作ろうと思っています。ただ画像を表示させるとき、私が知りうる限りでは、ウィンドウのサイズを変えたり、他のウィンドウで覆ったりすると、その画像が消えてしまうのです。ですから、画像が消えないようにするにはどうすればいいのでしょうか?

上記に書いたことを、Applet上でよく見かけるのですが、今回アプリケーションで実現したいのです。

ぜひ宜しくお願いします。

A 回答 (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);
}
}
    • good
    • 0
この回答へのお礼

まさにこのとおりです!これを元に作っていきたいと思います。
何度も何度も丁寧に答えてくれてありがとうございました。助かりました。ご返答ありがとうございました。

お礼日時:2006/02/14 09:59

こんにちは、以下のようで、どうでしょう。


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;
// 変数宣言の終わり

}
    • good
    • 0
この回答へのお礼

ご返答ありがとうございます。
返答して頂いたプログラムを実行しますと、描画内容が消えることもなく、すばらしいプラグラムだと思います。

しかし、ボタンを押すと描画される、という質問なのですが、最初何も描画されていない状態から、ボタンを押すと描画される方法を知りたいのです。

そこで、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)の部分に何を入れれば、実現するのでしょうか?
度々質問してしまい申し訳ありません。
ぜひよろしくお願いします。

お礼日時:2006/02/13 17:20

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!