ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Javaの課題丸投げコミュの親windowのデータを子windowに反映させる。

  • mixiチェック
  • このエントリーをはてなブックマークに追加
こんにちは。このコミュにはとてもお世話になってますm(_ _)m
すいませんがまた詰まってしまったのでよろしくお願いします。

現在、以下のようなプログラムを書いています。

1.親windowでは"●"ボタンを押してから画面をクリックすると●が描画され、その下には座標が表示される。(●は複数表示可能)
 
2.親windowで右クリックすると子windowを表示するか閉じるかの選択ができ、表示するを選ぶと”座標計算表”というフレームが現れる。

3.親windowで表示したx座標、y座標を子windowの表に反映させる。※できれば親windowで●を描画したのと同時に子windowの表に反映させたい。


タイトルの通り3番がうまくいきません。
一応書いてはみたのですが、どうしても座標が子windowに反映されないので質問させていただきました。
どうかよろしくお願いします!



※以下が自分で書いたプログラムです。

/*************

/*************
の部分がうまくいっていない気がします・・・


import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Label;
import java.awt.MenuItem;
import java.awt.Point;
import java.awt.PopupMenu;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

/*
<applet code="JaMous2.class"width=500 height=500>
</applet>
*/

//子window
class MyFrame extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
private JTable table;
private JScrollPane pane;
private DefaultTableModel model;

JaMous2 parentObj; //このMyFrameを呼び出したオブジェクトを入れる

MyFrame(String title,JaMous2 obj){
super(title); //タイトル設定
parentObj=obj; //呼び出しオブジェクト設定


this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
model = new DefaultTableModel(100,4);


//*******************************************************
for(int i=0;i < parentObj.count;i++)
for(int j = 0;j < parentObj.count;j++)
model.setValueAt(parentObj.x+","+parentObj.y,i,j);
//********************************************************


table = new JTable(model);
table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); //windowのサイズを変えた(最大化等)時の対応

pane = new JScrollPane(table);
this.add(pane,BorderLayout.CENTER); //表の位置

this.setSize(new Dimension(210,720)); //windowのサイズ

addWindowListener(new WindowAdapter(){ @SuppressWarnings("deprecation")
public void windowClosing(WindowEvent we){
hide(); //窓を消す
}
});
}
}





//親window
public class JaMous2 extends Applet implements MouseListener,MouseMotionListener,ActionListener{
/**
*
*/
private static final long serialVersionUID = 1L;
int [] x = new int[1000];
int [] y = new int[1000];
int x1=-1;
int y1;
int count, i;
int f=0;
Label lb1=new Label("x");
Label lb2=new Label("y");
Button bt1=new Button("●");
Button bt2=new Button("Clear");
Button bt3=new Button("All Clear");

PopupMenu a_pup;
MenuItem a_itm1,a_itm2;

MyFrame sonObj;



//リスナの登録
public void init(){
addMouseListener(this);
addMouseMotionListener(this);

add(lb1);
add(lb2);
add(bt1);
add(bt2);
add(bt3);
count=0;
bt1.addActionListener(new ActionListener(){ // (1)
public void actionPerformed(ActionEvent e){ // (2)
f++;
}
});
bt2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
if(count!=0){
count--;
repaint();
}
repaint();
}
});
bt3.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
count=0;
repaint();
}
});

a_pup=new PopupMenu();

a_itm1=new MenuItem("フレームを表示");
a_pup.add(a_itm1);
a_itm1.addActionListener(this);

a_itm2=new MenuItem("フレームを閉じる");
a_pup.add(a_itm2);
a_itm2.addActionListener(this);

add(a_pup);


addMouseListener(this);

//自分の参照をthisで渡す
sonObj=new MyFrame("座標計算表",this);

this.setSize(new Dimension(800,640));

}

//●・軸の定義
public void paint(Graphics g){
for(i=0; i<count; i++){
g.fillArc(x[i]-14,y[i]-15, 30, 30, 0, 360);
drawPoint(g,x[i],y[i]);
}
if(x1!=-1){
g.fillArc(x1-14,y1-15,30,30,0,360);
drawPoint(g,x1,y1);
}
g.drawLine(0,325,1020,325); // 直線
g.drawLine(510,0,510,650); // 直線
g.drawRect(0,0,1020,650); // 枠
g.setColor(Color.black);

}

// 座標を描画する
private void drawPoint(Graphics g1, int x, int y) {
Dimension d = getSize();
FontMetrics fm = g1.getFontMetrics();
String xy = (x-510) + "," + (-(y-325));
// 描画する場所を特定
// x
int sx = x - (fm.stringWidth(xy)/2);
// 左端がはみ出た場合
if(sx <= 0) sx = 0;
// 右端がはみ出た場合
if(sx + fm.stringWidth(xy) >= d.width) sx = d.width - fm.stringWidth(xy);

// y
int moveY = ((fm.getAscent() + fm.getDescent()) *2) - fm.getDescent();
int sy = y + moveY;
// 上がはみ出た場合
if(sy - fm.getAscent() <= 0) sy = fm.getAscent();
// 下がはみ出た場合
if(sy >= d.height) sy = d.height - fm.getDescent();

g1.drawString(xy, sx, sy);
}

public void mouseEntered(MouseEvent me){
}
public void mouseExited(MouseEvent me){
}
public void mouseClicked(MouseEvent me){
}

//マウスを押すと●が出現
public void mousePressed(MouseEvent me){
if (f % 2 == 1){
x1 = me.getX();
y1 = me.getY();
repaint();
}
if(me.getModifiers()==InputEvent.BUTTON3_MASK){ //右ボタン押下
a_pup.show(this,me.getX(),me.getY()); //クリック位置に表示
}
}

//マウスを放した場所に●を記録
public void mouseReleased(MouseEvent me){
if (f % 2 == 1){
if(count < 1000){
x[count] = me.getX();
y[count] = me.getY();
count ++;
repaint();
}
}


//********************************************
sonObj.repaint();
//*********************************************


}

//マウスを押してる間●を動かせる
public void mouseDragged(MouseEvent me){
if (f % 2 == 1){
x1 = me.getX();
y1 = me.getY();
repaint();
}
}

// 座標表示
public void mouseMoved(MouseEvent me){
Point point=me.getPoint();
lb1.setText("x:" + (point.x-510));
lb2.setText("y:" + (-(point.y-325)));
}

//子windowの出し入れ
@SuppressWarnings("deprecation")
public void actionPerformed(ActionEvent e) {
MenuItem itm=(MenuItem)e.getSource();
if(itm==a_itm1)sonObj.show(); //フレームを表示
if(itm==a_itm2)sonObj.hide(); //フレームを消去
}
}

コメント(2)

いろいろ突っ込みをしたいけど、目をつぶることにする。

最低限機能を満たすための処理を実装しました。
全文は面倒なので差分を示します。

1.MyFrameのコンストラクタのDefaultTableModel初期化処理変更(抜粋)

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
model = new DefaultTableModel(0, 4);

// *******************************************************
for (int i = 0; i < parentObj.count; i++)
for (int j = 0; j < parentObj.count; j++)
model.addRow(new Object[]{parentObj.x[i], parentObj.y[j]});
// ********************************************************

2.MyFrameにメソッド追加
public DefaultTableModel getTableModel() {
return model;
}

3.JaMous2のボタンリリース時に行を追加する処理を追加
*少しコード削ってます

public void mouseReleased(MouseEvent me) {
if (f % 2 == 1) {
if (count < 1000) {
x[count] = me.getX();
y[count] = me.getY();
count++;

DefaultTableModel model = sonObj.getTableModel();
model.addRow(new Object[]{me.getX(), me.getY()});
repaint();
}
}
}


おまけ
JaMous2のinitメソッド内部で
addMouseListener(this);
を2回実行しているので、イベント発生時に2回自分自身が呼ばれます。
多分意図していないはずなので、1個削除してました。

>たもさん
ありがとうございます!
教えていただいた部分を追加したらうまくできました^^
本当に感謝です!


あと、教えてもらっといてあれなんですが…
色々とある突っ込み所を教えていただけないでしょうか。
独学でやっているのでなかなか要領がつかめなくて、もどかしい気持ちでいっぱいなんです。

厳しく言っていただいて構いません。
また、お時間あるときで構いませんので、
よろしければご指導お願いします。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Javaの課題丸投げ 更新情報

Javaの課題丸投げのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング