- PR -

メニュやツールバーが表示されません

1
投稿者投稿内容
snow
会議室デビュー日: 2004/08/29
投稿数: 6
投稿日時: 2004-08-29 13:13
現在UCDを書けるアプリを作成中なんですがGUI初心者で初めはpaintを
使っていたのですがこれだとメニューやツールバーがアプリを実行
した時に見えなくなってしまいSwingを使用しているからpaintConponent
に変更したら絵を書けなくなってしまいました。なにがいけないのでしょうか?

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;

public class APRI extends JFrame implements MouseListener, MouseMotionListener{

Button btn1, btn2,btn3,btn4,btn5,btn6;
boolean linekaku,enkaku,mojikaku,include,extend;
final int DRAWPOINT = 0;
final int DRAWLINE = 1;
final int DRAWARC = 2;
final int DRAWACTOR = 3;
final int DRAWARROW = 4;
final int DRAWSTR = 5;
final int DRAWSTR2 = 6;
// コマンドを保持する変数
int command = DRAWPOINT;
Point pt = new Point(0, 0);
Point pt2 = new Point(0, 0);

// オフスクリーンイメージ
Image offimage = null;
//オフスクリーン用グラフィックス
Graphics offg = null;
boolean bfirst = true;
boolean bclear = false;



public static void main(String[] args) {

APRI window = new APRI();
window.setSize(800,500);//ウィンドウのサイズ指定
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//デフォルトの終了処理の設定
window.setVisible(true);//ウィンドウの表示



}

APRI(){
super("UCD要求獲得アプリケーション");

JMenuBar mbar = new JMenuBar();//メニューバー作成
JMenu mfile = new JMenu("File");//Fileメニュ作成
JMenuItem msave = new JMenuItem("Save");//Saveメニュ作成
JMenuItem mopen = new JMenuItem("Open");//Openメニュ作成
mbar.add(mfile);
mfile.add(msave);
mfile.add(mopen);

JMenu yobi1 = new JMenu("予備メニュ1");
mbar.add(yobi1);

JMenu mhelp = new JMenu("help");//helpメニュ作成
JMenuItem mversion = new JMenuItem("Version");
mbar.add(mhelp);
mhelp.add(mversion);
mversion.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e){
Container versioncont = getContentPane();//コンテントペイン取得
JOptionPane.showMessageDialog(versioncont,"UCD要求獲得アプリケーション 2004/08/16 小澤 大伍 \n " +
"未だ製作中(汗)");//version情報の表示
}
}
);

Container cont = getContentPane();//コンテントペイン取得
cont.add(mbar,"North");

JPanel panel = new JPanel(new BorderLayout());
JToolBar tbar = new JToolBar("UCD Write Bar"); //ツールバー作成

///////////////////////////////////////////////////////////////////

// ボタンを作成する
// 線を描くボタン
JButton btn1 = new JButton("LINE");
// btn2ボタンのアクションリスナを登録する
btn1.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
// 線を描く
command = DRAWLINE;
}
}
);
tbar.add(btn1);

// 円を描くボタン
JButton btn2 = new JButton("Use case");
// btn3ボタンのアクションリスナを登録する
btn2.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
// 楕円を描く
command = DRAWARC;
}
}
);
tbar.add(btn2);

//Actorを描くボタン
JButton btn3 = new JButton("Actor");
// btn3ボタンのアクションリスナを登録する
btn3.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
// Actorを描く
command = DRAWACTOR;
}
}
);
tbar.add(btn3);

//arrowを描くボタン
JButton btn4 = new JButton("Arrow");
// btn4ボタンのアクションリスナを登録する
btn4.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
// Actorを描く
command = DRAWARROW;
}
}
);
tbar.add(btn4);

//<<include>>を描くボタン
JButton btn5 = new JButton("include");
// btn5ボタンのアクションリスナを登録する
btn5.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
// includeを描く
command = DRAWSTR;
}
}
);
tbar.add(btn5);
// <<extend>>を描くボタン
JButton btn6 = new JButton("extend");
// btn5ボタンのアクションリスナを登録する
btn6.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
// extemdを描く
command = DRAWSTR2;
}
}
);
tbar.add(btn6);

//マウスの2種類のリスナを登録する
addMouseListener(this);
addMouseMotionListener(this);

panel.add(tbar,"North");
// パネルをコンテナの中央に追加する
cont.add(panel, "Center");

}
// MouseEventに関する7つのメソッドを実装する
////////////////////////////////////////////
public void mouseClicked(MouseEvent e) {
pt = e.getPoint();
// 更新再描画を要求する
repaint();
linekaku = false;
enkaku = true;
mojikaku = true;
}
public void mouseEntered(MouseEvent e) {
// カーソルをハンドカーソルに変更する
setCursor(new Cursor(Cursor.HAND_CURSOR));
}
public void mouseExited(MouseEvent e) {
// カーソルをポインタカーソルに変更する
setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
}
public void mousePressed(MouseEvent e) {
pt = e.getPoint();
// 更新再描画を要求する
repaint();
}
public void mouseReleased(MouseEvent e) {
pt2 = e.getPoint();
// 更新再描画を要求する
repaint();
linekaku = true;
}


public void mouseDragged(MouseEvent e) {}

public void mouseMoved(MouseEvent e) {}

public void update(Graphics g) {
paint(g);//背景消去を行わない
}



public void paintComponent(Graphics g) {
//初回のみの特別な処理
////////////////////////////////////
if (bfirst) {
// ダブルバッファリングの準備を行う
offimage = createImage(800, 500);
// オフスクリーンイメージのグラフィックスを作成する
offg = offimage.getGraphics();
// オフスクリーンの背景を初期化する
offg.setColor(Color.white);
offg.fillRect(0, 0, 800, 500);

// 初回フラグを解除する
bfirst = false;
return;
}
////////////////////////////////////

// 画面を消去する
else if (bclear) {
// オフスクリーンの背景を再度初期化する
offg.setColor(Color.white);
offg.fillRect(0, 0, 800, 500);
// オフスクリーンイメージを画面にコピーする
g.drawImage(offimage, 0, getInsets().top + 60, this);
// クリアーフラグを解除する
bclear = false;
return;
}

// 描画境界を設定する
g.setClip(getInsets().left, getInsets().top + 60,
getWidth() - getInsets().left - getInsets().right,
getHeight() - getInsets().top - getInsets().bottom - 40);

// オフスクリーンに描画を行う
////////////////////////////////////////////////////
offg.setColor(Color.red);
Font fnt = new Font("Serif",Font.PLAIN,20);
offg.setFont(fnt);
FontMetrics fm = getFontMetrics(g.getFont());
String str = "<<include>>";
String str2 = "<<extend>>";

if (command == DRAWLINE && linekaku == true) {
// 線を描画する
offg.drawLine(pt.x, pt.y, pt2.x, pt2.y);
linekaku = false;

}//矢印を描く
else if (command == DRAWARROW && linekaku == true){
offg.drawLine(pt.x, pt.y, pt2.x, pt2.y);
if(pt.y > pt2.y){
int[] x={ pt2.x - 10,pt2.x +10,pt2.x };
int[] y={ pt2.y,pt2.y,pt2.y-10 };
offg.drawPolygon(x,y,3);
} else {
int[] x={ pt2.x - 10,pt2.x +10,pt2.x };
int[] y={ pt2.y,pt2.y,pt2.y+10 };
offg.drawPolygon(x,y,3);
}
linekaku = false;

}
else if (command == DRAWARC && enkaku == true) {
// 楕円を描く
offg.drawOval(pt.x, pt.y, 180, 80);
enkaku = false;
}
else if (command == DRAWSTR && mojikaku == true){
//inclueを書く
offg.setColor(Color.blue);
offg.drawString(str,pt.x,pt.y + fm.getAscent());
offg.setColor(Color.red);
mojikaku = false;
}
else if (command == DRAWSTR2 && mojikaku == true){
//extendを書く
offg.setColor(Color.blue);
offg.drawString(str2,pt.x,pt.y + fm.getAscent());
offg.setColor(Color.red);
mojikaku = false;
}
else if (command == DRAWACTOR && enkaku == true) {
// 楕円を描く
offg.drawArc(pt.x, pt.y, 20, 20 , 0 ,360);
offg.drawLine(pt.x,pt.y +25, pt.x + 20,pt.y + 25);
offg.drawLine(pt.x +10 ,pt.y +20, pt.x + 10,pt.y + 40);
offg.drawLine(pt.x +10,pt.y +40, pt.x +20,pt.y + 60);
offg.drawLine(pt.x +10,pt.y +40, pt.x ,pt.y + 60);
enkaku = false;
}


//////////////////////////////////////////////////
// オフスクリーンイメージを画面にコピーする
g.drawImage(offimage, 0, 0, this);


}
}
いっきゅう
大ベテラン
会議室デビュー日: 2004/04/04
投稿数: 153
お住まい・勤務地: 兵庫
投稿日時: 2004-08-30 17:22
どうもいっきゅうです。

この場合だったらpaintを使えばいいのですが
メニューやツールバーが消えるのはメニューやツールバーがあるパネル部分に対して
paintしているからだと思います。
(全部thisを使って処理しているようですからそうだと思います。)

お絵かき用のCanvasとかクラスを用意してそれをこのソースですとpanelの中央に配置してCanvasクラスでpaint処理すればメニューやツールバーが消えることはないはずです。


Origin
会議室デビュー日: 2004/08/30
投稿数: 1
投稿日時: 2004-08-30 17:26
おそらく,paintComponents(Graphics g)の間違いだと思われます。
後ろの's'が抜けてます。
私は,このメソッドを使ったことがないので確実な問題解決方法とはいかないかも
知れませんが

後, paint使用時にメニューやツールバーが消えるのは
おそらくスーパークラスのpaintを呼んでないからだと思われます。
JFrameのpaintメソッドは,まず初めにスーパークラスのpaintを呼んでないと
ほとんどSwingのコンポーネント(JButtonなど)は見えなくなります。
使用方法の例として
public void paint(Graphics g) {
super.paint(g);
//...
}
snow
会議室デビュー日: 2004/08/29
投稿数: 6
投稿日時: 2004-09-04 18:35
数々のご指摘ありがとうございました。コレらを元に
修正していきたいと思います。他の話題になってしまいますが、
プログラミングしていくうちに「MVCになってない」との
指摘を受けて直したいと考えたのですが自分の持っている書物
やネット上ではMVCの概念的なものしか書いてなくどこをどう直して
行けばよいのかわかりません…これからデータの読み込み&書き込み
機能やカスケード表示可能など付け加えなくてはいけないので
MVC化しないと大変との事なんですが「このプログラミングがMVCだっ」
て言うものを知らないので困っています。質問ばかりですがどうか
ご教授ください。

1

スキルアップ/キャリアアップ(JOB@IT)