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

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

Javaの課題丸投げコミュのappletからapplicationへの変換について

  • mixiチェック
  • このエントリーをはてなブックマークに追加
現在javaのサンプルプログラムの中のGraphLayout をいじっているのですがappletのコードからapplicationのコードに変換したいと考えてるのですがうまくいかないので質問させてもらいました。
環境はjava5.0を利用しています。
変換する際にSWINGを使ってボタン等の記述を変えたいのですが教えてください。
(サンプルのソースから少しいじってあります)

import java.util.*;
import java.awt.*;
import java.applet.Applet;
import java.awt.event.*;


class Node {
double x; //nodeのx座標
double y; //nodeのy座標

double dx;
double dy;

boolean fixed;

String lbl;
}

class Edge {
int from;
int to;

double len;
}

class GraphPanel extends Panel
implements Runnable, MouseListener, MouseMotionListener {
/**
*
*/
private static final long serialVersionUID = 1L;
Graph graph;
int nnodes;
Node nodes[] = new Node[1000];

int nedges;
Edge edges[] = new Edge[1000];

Thread relaxer;
boolean stress;

int numMouseButtonsDown = 0;

GraphPanel(Graph graph) {
this.graph = graph;
addMouseListener(this);
}

int findNode(String lbl) {
for (int i = 0 ; i < nnodes ; i++) {
if (nodes[i].lbl.equals(lbl)) {
return i;
}
}
return addNode(lbl);
}

int addNode(String lbl) {
Node n = new Node();
n.x = 10 + 380*Math.random();
n.y = 10 + 380*Math.random();
n.lbl = lbl;
nodes[nnodes] = n;
return nnodes++;
}
void addEdge(String from, String to, int len) {
Edge e = new Edge();
e.from = findNode(from);
e.to = findNode(to);
e.len = len;
edges[nedges++] = e;
}

public void run() {
Thread me = Thread.currentThread();
while (relaxer == me) {
relax();
if (random && (Math.random() < 0.03)) {
Node n = nodes[(int)(Math.random() * nnodes)];
if (!n.fixed) {
n.x += 100*Math.random() - 50;
n.y += 100*Math.random() - 50;
}
graph.play(graph.getCodeBase(), "audio/drip.au");
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
break;
}
}
}

synchronized void relax() {
for (int i = 0 ; i < nedges ; i++) {
Edge e = edges[i];
double vx = nodes[e.to].x - nodes[e.from].x;
double vy = nodes[e.to].y - nodes[e.from].y;
double len = Math.sqrt(vx * vx + vy * vy);
len = (len == 0) ? .0001 : len;
double f = (edges[i].len - len) / (len * 3);
double dx = f * vx;
double dy = f * vy;

nodes[e.to].dx += dx;
nodes[e.to].dy += dy;
nodes[e.from].dx += -dx;
nodes[e.from].dy += -dy;
}

for (int i = 0 ; i < nnodes ; i++) {
Node n1 = nodes[i];
double dx = 0;
double dy = 0;

for (int j = 0 ; j < nnodes ; j++) {
if (i == j) {
continue;
}
Node n2 = nodes[j];
double vx = n1.x - n2.x;
double vy = n1.y - n2.y;
double len = vx * vx + vy * vy;
if (len == 0) {
dx += Math.random(); //random=0.0~1.0
dy += Math.random();
} else if (len < 100*100) {
dx += vx / len;
dy += vy / len;
}
}
double dlen = dx * dx + dy * dy;
if (dlen > 0) {
dlen = Math.sqrt(dlen) / 2;
n1.dx += dx / dlen;
n1.dy += dy / dlen;
}
}

Dimension d = getSize();
for (int i = 0 ; i < nnodes ; i++) {
Node n = nodes[i];
if (!n.fixed) {
n.x += Math.max(-5, Math.min(5, n.dx));
n.y += Math.max(-5, Math.min(5, n.dy));
}
if (n.x < 0) {
n.x = 0;
} else if (n.x > d.width) {
n.x = d.width;
}
if (n.y < 0) {
n.y = 0;
} else if (n.y > d.height) {
n.y = d.height;
}
n.dx /= 2;
n.dy /= 2;
}
repaint();
}

Node pick;
boolean pickfixed;
Image offscreen;
Dimension offscreensize;
Graphics offgraphics;

//rootノードの色設定
final Color fixedColor = Color.red;
//マウスで選択したときの色
final Color selectColor = Color.pink;
//
final Color edgeColor = Color.black;
//nodeの色設定
//final Color nodeColor = new Color(250, 220, 100);
final Color nodeColor1 = Color.green;
final Color nodeColor2 = Color.blue;
final Color nodeColor3 = Color.gray;
final Color nodeColor4 = Color.magenta;
final Color nodeColor5 = Color.orange;
final Color nodeColor6 = Color.yellow;
final Color nodeColor7 = Color.cyan;
final Color nodeColor8 = Color.red;

//node間の線の色の設定
final Color stressColor = Color.darkGray;
final Color arcColor1 = Color.black;
final Color arcColor2 = Color.pink;
final Color arcColor3 = Color.red;

public void paintNode(Graphics g, Node n, FontMetrics fm) {
int x = (int)n.x;
int y = (int)n.y;

//nodeの色設定
//nodeColorに条件分岐で色を指定

g.setColor((n == pick) ? selectColor : (n.fixed ? fixedColor : nodeColor1));


int w = 15;
int h = 15;

g.fillOval(x - w/2, y - h / 2, w, h);



g.setColor(Color.black);

g.drawOval(x - w/2, y - h / 2, w-1, h-1);

//idの表示(選択したもの)
if(n == pick){
g.drawString(n.lbl, x - (w-10)/2, (y - (h-4)/2) + fm.getAscent() - 15);
}

}

public synchronized void update(Graphics g) {
Dimension d = getSize();
if ((offscreen == null) || (d.width != offscreensize.width) || (d.height != offscreensize.height)) {
offscreen = createImage(d.width, d.height);
offscreensize = d;
if (offgraphics != null) {
offgraphics.dispose();
}
offgraphics = offscreen.getGraphics();
offgraphics.setFont(getFont());
}

offgraphics.setColor(getBackground());
offgraphics.fillRect(0, 0, d.width, d.height);
for (int i = 0 ; i < nedges ; i++) {
Edge e = edges[i];
int x1 = (int)nodes[e.from].x;
int y1 = (int)nodes[e.from].y;
int x2 = (int)nodes[e.to].x;
int y2 = (int)nodes[e.to].y;
int len = (int)Math.abs(Math.sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)) - e.len);

offgraphics.setColor((len < 10) ? arcColor1 : (len < 20 ? arcColor2 : arcColor3)) ;


//offgraphics.drawLine(x1, y1, x2, y2);

if (stress) {

String lbl = String.valueOf(len);
offgraphics.setColor(stressColor);
offgraphics.drawString(lbl, x1 + (x2-x1)/2, y1 + (y2-y1)/2);
offgraphics.setColor(edgeColor);
}
}

FontMetrics fm = offgraphics.getFontMetrics();
for (int i = 0 ; i < nnodes ; i++) {
paintNode(offgraphics, nodes[i], fm);
}
g.drawImage(offscreen, 0, 0, null);
}

//1.1 event handling
public void mouseClicked(MouseEvent e) {
}

public void mousePressed(MouseEvent e) {
numMouseButtonsDown++;
addMouseMotionListener(this);
double bestdist = Double.MAX_VALUE;

int x = e.getX();
int y = e.getY();
for (int i = 0 ; i < nnodes ; i++) {
Node n = nodes[i];
double dist = (n.x - x) * (n.x - x) + (n.y - y) * (n.y - y);
if (dist < bestdist) {
pick = n;
bestdist = dist;
}
}
pickfixed = pick.fixed;
pick.fixed = true;
pick.x = x;
pick.y = y;

repaint();
e.consume();
}

public void mouseReleased(MouseEvent e) {
numMouseButtonsDown--;
removeMouseMotionListener(this);

pick.fixed = pickfixed;
pick.x = e.getX();
pick.y = e.getY();
if (numMouseButtonsDown == 0) {
pick = null;
}

repaint();
e.consume();
}

public void mouseEntered(MouseEvent e) {
}

public void mouseExited(MouseEvent e) {
}

public void mouseDragged(MouseEvent e) {
pick.x = e.getX();
pick.y = e.getY();
repaint();
e.consume();
}

public void mouseMoved(MouseEvent e) {
}

public void start() {
relaxer = new Thread(this);
relaxer.start();
}

public void stop() {
relaxer = null;
}

}


public class Graph extends Applet implements ActionListener, ItemListener {

/**
*
*/
private static final long serialVersionUID = 1L;
GraphPanel panel;
Panel controlPanel;

Button scramble = new Button("Scramble");
Button shake = new Button("Shake");
Checkbox stress = new Checkbox("Stress");

public void init() {
setLayout(new BorderLayout());

panel = new GraphPanel(this);
add("Center", panel);
controlPanel = new Panel();
add("South", controlPanel);

controlPanel.add(scramble); scramble.addActionListener(this);
controlPanel.add(shake); shake.addActionListener(this);
controlPanel.add(stress); stress.addItemListener(this);

//パラメータの取得
String edges = getParameter("edges");
for (StringTokenizer t = new StringTokenizer(edges, ",") ; t.hasMoreTokens() ; ) {
String str = t.nextToken();
int i = str.indexOf('-');
if (i > 0) {
int len = 50;
int j = str.indexOf('/');
if (j > 0) {
len = Integer.valueOf(str.substring(j+1)).intValue();
str = str.substring(0, j);
}
panel.addEdge(str.substring(0,i), str.substring(i+1), len);
}
}

//rootの配置
Dimension d = getSize();
String center = getParameter("center");
if (center != null){
Node n = panel.nodes[panel.findNode(center)];
n.x = d.width / 2;
n.y = d.height / 2;
n.fixed = true;
}
}

public void destroy() {
remove(panel);
remove(controlPanel);
}

public void start() {
panel.start();
}

public void stop() {
panel.stop();
}

public void actionPerformed(ActionEvent e) {
Object src = e.getSource();

if (src == scramble) {
//play(getCodeBase(), "audio/computer.au");
Dimension d = getSize();
for (int i = 0 ; i < panel.nnodes ; i++) {
Node n = panel.nodes[i];
if (!n.fixed) {
n.x = 10 + (d.width-20)*Math.random();
n.y = 10 + (d.height-20)*Math.random();
}
}
return;
}

if (src == shake) {
//play(getCodeBase(), "audio/gong.au");
Dimension d = getSize();
for (int i = 0 ; i < panel.nnodes ; i++) {
Node n = panel.nodes[i];
if (!n.fixed) {
n.x += 80*Math.random() - 40;
n.y += 80*Math.random() - 40;
}
}
}

}

public void itemStateChanged(ItemEvent e) {
Object src = e.getSource();
boolean on = e.getStateChange() == ItemEvent.SELECTED;
if (src == stress) panel.stress = on;
}

public String getAppletInfo() {
return "Title: GraphLayout \nAuthor: <unknown>";
}

public String[][] getParameterInfo() {
String[][] info = {
{"edges", "delimited string", "A comma-delimited list of all the edges. It takes the form of 'C-N1,C-N2,C-N3,C-NX,N1-N2/M12,N2-N3/M23,N3-NX/M3X,...' where C is the name of center node (see 'center' parameter) and NX is a node attached to the center node. For the edges connecting nodes to each other (and not to the center node) you may (optionally) specify a length MXY separated from the edge name by a forward slash."},
{"center", "string", "The name of the center node."}
};
return info;
}

}

コメント(27)

どううまく行かないのでしょう?

私は大抵、AppletでもSwingでもどっちでも動くようにしてます。
>Cappuccinoさん
eclipseでVisualEditerを使いながらやっていたのですがどのように書き換えたらいいのかわからなくなってしまいました。
アプリケーションをPanelで取り出し、それを載せるためのAppletとSwingを作ってみたらどうでしょう。
>Cappuccinoさん
できればAppletを使わないでやりたいと考えていましたがAppletのほうがいいのでしょうか?
Appletを使わない、Appletの方がいいとはどういうことでしょう。
シンプルなサンプル。

package sample;

import java.applet.Applet;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowListener;
import java.awt.event.WindowEvent;
import javax.swing.*;

public class GUI extends Applet{
public static void main(String[] args){
GUI app = new GUI();
app.showFrame(GUI.class.getName());
}
public void showFrame(String title){
Frame f = new Frame(title);
WindowListener l = new WindowAdapter(){
public void windowClosing(WindowEvent e){
stop();
destroy();
int NORMAL_STATUS = 0;
System.exit(NORMAL_STATUS);
}
};
f.addWindowListener(l);
init();
start();
f.add("Center",this);
f.pack();
f.setSize(200,200);
f.setVisible(true);
}
public void init()
{
add(getContainer());
}

public void start()
{

}
public Container getContainer()
{
JPanel panel = new JPanel();
panel.add(new JLabel("Hello World."));
return panel;
}
}
>もけさん
>Cappuccino
ありがとうございます。
早速試してみたいと思います。

>もけさん
パラメータの取得についてはどのようにするか悩みどころです。
今現在はhtmlのほうで大量のデータを記述しているのですがエクセルとかから読み込むこともできるのでしょうか?
DOMでxhtmlを走査するとか、
propertiesファイルからhtmlを作るとか。

DRY原則に従うとこういう方法がいいかと。
>Cappuccino
DOMはよく理解していないので使いこなせるかわかりません。
htmlで記述する手間を省くためにエクセルから読み込みたいと思ったのですが大変でしょうか?
>もけさん
apachを使わないではできませんか?
Appletの時はhtmlから読み込まなきゃいけないでしょう。
リソースから読み込んでもいいけど。
私にとってはエクセルが最も大変。
16 もけさん

トピ主に言っただけなので関係ありません。

1でも書いてますが、アプリケーションにしたとしてもAppletでも使えるように私はしたいので。
appletの時htmlに記述しなきゃいけないと言ったのは、配置する人が簡単に編集できるようにするためです。絶対じゃないですが、今まではその方法だったようなので。

Excelで元データを作ったなら、どんな風に書いてるかにもよりますが、csvで保存しといて読んだ方がPOIより安全かも知れませんね。
>もけさん
ApacheなしでできるのならPOIもみてみます。
それとプロパティファイルとはどのようにすればいいのでしょうか?

>Cappuccinoさん
今まではとりあえず使ってみるという形だったのでそのままhtmlのほうに記述していました。
できればhtmlではなくexcel等でデータを与えられるようにしたいと思っています。
CSVのほうが簡単にできるのでしょうか?
18 CPUさん

Excelは互換性に問題があるし、いつまであるかわからないし、編集したい時にそこにあるとは限りません。
16でもけさんもおっしゃってますが、textであることが重要です。

>CSVのほうが簡単にできるのでしょうか?

利用時のことでしょうか、保存時のことでしょうか。利用時はデータと利用方法を見ないとなんとも言えません。
xhtmlはDOMという標準パーサがあり、propertiesはjavaのResourceBundleで読めるので簡単かも知れません。csvはjakarta-commonsにパーサがあったような。

何を重視するかで何がベストかは変わって来るかと。絶対的なものはありません。
>Cappuccino
利用時です。
データの方は今回使っているものは名前とその名前同士の距離をつかいます。
例 id01-id02/100 (今のプログラムでのhtmlでの指定の方法)
先のidと後ろのidを”-”でつなぐことで線をつないでいます。”/”のあとに数字を入れることでその間の距離を指定しています。

これを指定した数すべてについて関係性を記述したいのでexcelでできればと考えていました。
20 CPUさん

>これを指定した数すべてについて関係性を記述したいのでexcelでできればと考えていました。

意味がよくわかりませんので、私は判断をパスします。

htmlですでに書かれているなら、awkとか使って簡単に他のtextファイルにできそう。
>Cappuccinoさん
例えば10個のidがあったとしてその各id同士に距離(数値)をもたせます。
この場合(10×10−重複分)の記述をしたいということです。

id01-id02/100
id01-id03/90



id10-id09/200
このような感じです。
excelだと何かいいことがあるのでしょうか。
>Cappuccinoさん
もともとのデータをエクセルでもっているので変換の手間を省ければとおもってエクセルを使いたいです
24 CPUさん

>もともとのデータをエクセルでもっているので変換の手間を省ければとおもってエクセルを使いたいです
excelを使うのと、excel専用のデータ形式であることは違うと思うのですが。
>もけさん
>Cappuccinoさん
コメント6・7のものはどうつかったらいいのでしょうか?

ログインすると、残り5件のコメントが見れるよ

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

Javaの課題丸投げ 更新情報

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

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

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