プログラマメモ2

2008-12-29

[java]扇形っぽいのを描く


Javaです。ふと扇形っぽいのを描きたくなりました。



java.awt.geom.GeneralPathを使用してます。
あとArc2Dを使っています。パスを閉じる場合に起点と終点を意識しないといけないので、この辺で頭をひねりました。。。


package ggg;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.geom.Arc2D;
import java.awt.geom.GeneralPath;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class TestA1 {

/**
* 中心座標から、指定された半径の円を描くx, y, w, hを求める。
*/
static Rectangle a(int cx, int cy, int r) {

int x = cx - r;
int y = cy - r;
int w = r + r;
int h = r + r;

return new Rectangle(x, y, w, h);
}

static GeneralPath b(int r, int degree) {
// Rectangle rec1 = a(0 + r, 0 + r, r);
Rectangle rec2 = a(0 + r, 0 + r, (int) (r * 0.5));
int x = 0, y = 0, w = r + r, h = w;

int x2 = rec2.x, y2 = rec2.y;
int w2 = rec2.width, h2 = rec2.height;

Arc2D.Double arc1 = new Arc2D.Double(x, y, w, h, 0, degree, Arc2D.OPEN);
Arc2D.Double arc2 = new Arc2D.Double(x2, y2, w2, h2, degree, degree
* -1, Arc2D.OPEN);

GeneralPath path = new GeneralPath();

path.append(arc1, true);
path.lineTo(arc2.getStartPoint().getX(), arc2.getStartPoint().getY());
path.append(arc2, true);
path.lineTo(arc1.getStartPoint().getX(), arc1.getStartPoint().getY());

return path;
}

static class MyFrame extends JFrame {
{
getContentPane().add(new JPanel() {

public void paint(Graphics g) {

Graphics2D g2d = (Graphics2D) g;

GeneralPath path = b(/* 半径 */100, /* 角度 */120);

g2d.fill(path);
g2d.setColor(Color.RED);
g2d.draw(path);

}

});
}

}

public static void main(String[] args) {

MyFrame frame = new MyFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 400);
frame.setLocation(300, 700);
frame.setVisible(true);

}

}




2008-12-22

[java]JFrameにむだに動きをつけてみる - timingframeworkで。


Javaです。timingframeworkです。
JFrameに無駄な動きをつけてみます。

timingframework: Timing is Everything

PropertySetterを使ってsize,locationを利用して簡単動きをつけてみます。
timingframeworkを使うとアニメーションをつけるのが簡単になりますね。
swingのイベントの仕組みにのっかてる感じがして副作用がでなさそうです。

以下コード

package tf;

import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

import org.jdesktop.animation.timing.Animator;
import org.jdesktop.animation.timing.interpolation.PropertySetter;
import org.jdesktop.animation.timing.triggers.ActionTrigger;

public class TestFrameMain {

public static void main(String[] args) {

final JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 300);
frame.setVisible(true);

JFrame frame2 = new JFrame();
frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame2.setSize(300, 300);

frame2.getContentPane().add(new JPanel() {
{
add(new JButton("GO") {

{
final Animator animator = PropertySetter
.createAnimator(600, frame, "size",
new Dimension(10, 10), new Dimension(
500, 300), new Dimension(600,
400), new Dimension(500, 300));

ActionTrigger.addTrigger(this, animator);

addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {

// Point now_p = frame.getLocation();
Point now_p = new Point(300, 500);
PropertySetter
.createAnimator(
600,
frame,
"location",
new Point(now_p.x + 250,
now_p.y + 150),
now_p,
new Point(now_p.x - 50,
now_p.y - 50), now_p)
.start();

}
});
}
});
}

});
frame2.setVisible(true);
}
}




2008-12-19

JPanelからドラッグアンドドロップで背景の色移動させたい


Javaです。JPanelからドラッグアンドドロップで背景の色移動させたいと思いました。
たとえば、JTextFieldとかには、setDragEnabledメソッドがあったりするのですが、JPanelにはないわけで。
それで、うーんとなやんだわけです。

参考



それで、MouseAdapterを使ってmousePressedの時にTransferHandlerのexportAsDragを使って何とか実現。

以下コード
package dnd;

import java.awt.Color;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.TransferHandler;

public class TestA {

public static void main(String[] args) {
createFrame(Color.BLUE);
createFrame(Color.RED);
}

static JFrame createFrame(final Color c) {
JFrame frame = new JFrame();

frame.setSize(300, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new JPanel() {
{
add(new JTextField() {
private static final long serialVersionUID = 1L;
{
setDragEnabled(true);
setText("aaaaaaaaaaaaaaaaa");
setTransferHandler(new TransferHandler("background") {
});
}
}
);

setBackground(c);
setTransferHandler(new TransferHandler("background") {
});

addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
JComponent component = (JComponent) e.getSource();
TransferHandler handler = component
.getTransferHandler();
handler
.exportAsDrag(component, e,
TransferHandler.COPY);
}
});
}
} // panel ... end

);
frame.setVisible(true);
return frame;
}

}




nimbusを使っていこう!!


Javaです。
そろそろnimbusを使っていこうと思います。

Nimbus, Java SE 6 Update 10 Beta


try {
UIManager.setLookAndFeel(
"com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
} catch (UnsupportedLookAndFeelException e) {
} catch (ClassNotFoundException e) {
} catch (InstantiationException e) {
} catch (IllegalAccessException e) {
}




2008-12-14

501を6ラウンド(18ダーツ)以内におわらせるっていうのは?


ダーツです。この半年ソフトダーツにはまってます。インターネット時代ですので、ネットワークで対戦できて非常に燃えます。
サーバーに記録されるので、自分の成長具合が確認できて、おもしろいです。

ちなみに、ソフトダーツの世界にもプロ制度がありました。

まずプロになるためには実技試験を受けないといけないようです。

ゼロワンというゲームの501を6ラウンド(18投)で終了させないといけません(もちろんマスターアウトで)。

501を18ダーツで終わらせるにはどれぐらいの実力が必要なのか疑問に思ったので、簡単に計算してみました。

一投げあたりの値は最高で60(20のトリプル)以上はありえないので、PPDが60以下実際の有効値になると思います。
最低でも平均して、一投げあたりの値が27以上ないといけない感じです。
クラス分けですとA10(PPD:28)ぐらいないとプロ試験はむずかしそうな気がします。

ROUND1(throw:1) PPD:501 501
ROUND1(throw:2) PPD:250 500
ROUND1(throw:3) PPD:167 501
ROUND2(throw:4) PPD:125 500
ROUND2(throw:5) PPD:100 500
ROUND2(throw:6) PPD:83 498
ROUND3(throw:7) PPD:71 497
ROUND3(throw:8) PPD:62 496
ROUND3(throw:9) PPD:55 495
ROUND4(throw:10) PPD:50 500
ROUND4(throw:11) PPD:45 495
ROUND4(throw:12) PPD:41 492
ROUND5(throw:13) PPD:38 494
ROUND5(throw:14) PPD:35 490
ROUND5(throw:15) PPD:33 495
ROUND6(throw:16) PPD:31 496
ROUND6(throw:17) PPD:29 493
ROUND6(throw:18) PPD:27 486
ROUND7(throw:19) PPD:26 494


public class Test501_finish {

public static void main(String[] args) {

final int i501 = 501;
for(int i=1;i<=19;i++){
int d = (i501 / i);
System.out.printf("ROUND%d(throw:%d) PPD:%d %d %n", (Math.round((i / 3d)+0.4d)), i, d, d*i);
}

}

}




2008-12-12

警告ダイアログについて思うこと。


雑記です。
インターフェイス、対話式インターフェイスについて思う事などなどです。

たとえば、《何か》を入力をして《送信》ボタンを押すインターフェイスがあるとします。
その《何か》は入力が必須な項目です。そいう仕様です。

ユーザーは何も入力しないで、《送信》ボタンを押しました。
システムは《何か》を入力してくださいと警告ダイアログをだします。
ダイアログの真ん中には《OK》とだけあるだけです。

このダイアログの役割は、ユーザーに《送信》できるのは、「《何か》を入力しないと、いけないよ」と促すことなのでしょう。
ここではじめて、ユーザーは《送信》できるためには、《何か》を入力しないといけないのだなと、気づくかもしれません。

最近の僕はこの警告ダイアログが鬱陶しくて仕方がありません。
《OK》を押さないと次にすすめないのが腹立たしい(笑)

じゃ、かわりにどういうふうにユーザーに警告すればいいのか?

(ア)
《何か》を入力しないと《送信》ボタンが押せないようにしとくという方法もあります。

(イ)
《何か》を入力しないといけない項目を色を変えたり点滅させたりして際立たせるというものありだと思います。

(ウ)
警告ダイアログのかわりに、フェードアウトしていくメッセージを前面に表示するというのありだと思います。

アプリケーションを開発する側の立場だと、警告ダイアログを使うのは至極簡単なことなわけです。
javascriptだったらalertですんじゃうわけで....

警告ダイアログの《OK》は面倒だなぁと思う訳なのでした。




2008-12-09

JLayeredPaneについてメモ


Javaです。
swingです。
使えたらすごくいろいろなことができそうだなぁと思っているJLayeredPaneについてです。

JFrameに他のコンポーネントにぺたぺたaddしたい場合は、getContentPane()してaddします。
JWindowでもいいのですが、JFrameは、getLayeredPane()、getRootPane()、getGlassPane()とかあります。

で、getLayeredPane()がいまいちよくわからない。
getLayeredPane()で取得できるJLayeredPaneには、getContentPane()があることがわかってますます頭が混乱してます。

じゃ、どのレイヤーにコンテントペインはあるのさ?
JLayeredPane.FRAME_CONTENT_LAYERに設定されています。

import java.awt.Component;

import javax.swing.JFrame;
import javax.swing.JPanel;


public class TestJLayeredPane {


public static void main(String[] args) {

JFrame frame = new JFrame();
JPanel panel1 = new JPanel();
JPanel panel2 = new JPanel();
JPanel panel3 = new JPanel();

panel1.setName("panel1");
panel2.setName("panel2");
panel3.setName("panel3");

frame.getContentPane().add(panel1);
frame.getLayeredPane().add(panel2);
frame.getLayeredPane().add(panel3);

System.out.println(frame.getLayeredPane().getComponentCount());

for (Component component : frame.getLayeredPane().getComponents()) {
System.out.println("*** " + component.getName());
}
}

}




2008-12-01

[java]リフレクションでstaticメソッドの起動は?


Javaです。
リフレクションでstaticメソッドの起動は?

java.lang.reflect.Method

呼び出したいメソッドを特定できたなら、


method.invoke(null, new Object[]{});

渡すインスタンスをnullでオッケー。

難しく考える必要がなかったです。




 

プログラマの本棚