[java]paintメソッドをmain関数に書く方法
Re: [java]paintメソッドをmain関数に書く方法
mainメソッドから呼び出すと実行されるようにしつつ、mainメソッドから呼び出さないと実行されないようにするのは不可能だと思います。java君 さんが書きました:このpaintメソッドってメソッドとして宣言が必要でも、main関数から呼び出さなくても実行されますよね。
これが凄い気持ち悪いので、mainメソッドから呼び出さないと実行しないようにしたいんですが、それは可能ですか?
例えば、paintメソッドを呼び出すクラスを継承するのをやめ、privateにしても、mainメソッド以外の同じクラスのメソッドから呼び出せば実行されてしまいます。
そのような呼び出すメソッドを作らなかったとしても、リフレクションで実行されてしまうかもしれません。
(参考:Junitでprivateメソッドのテスト方法 - Qiita)
というわけで、mainメソッドから呼び出さないと実行しないようにするには、このメソッドを削除(コメントアウト)してしまうのがいいでしょう。
そうすれば実行しないので、「mainメソッドから呼び出さないならば実行しない」という条件を満たすことができます。
なぜそのようなことがしたいのでしょうか?java君 さんが書きました:後このpaintメソッドの所属クラスを調べたい場合どうすればいいでしょう?上手くいきません。
java君さんのいう「所属クラス」とは何でしょうか?
その答えによっては、「我慢する、諦める」というのがいいかもしれません。
java.awt.Graphicsクラスにも、それが継承しているjava.lang.Objectクラスにも、paintメソッドはありません。java君 さんが書きました:Graphicsクラスのメソッドであることは分かるのですが
どうしてそう分かる(と思う)のですか?
オフトピック
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: [java]paintメソッドをmain関数に書く方法
自分で呼び出す方が大変気持ち悪いです。画面の描画は1度呼べばいいというものではありません。このpaintメソッドってメソッドとして宣言が必要でも、main関数から呼び出さなくても実行されますよね。
これが凄い気持ち悪いので、mainメソッドから呼び出さないと実行しないようにしたいんですが、
Component#paintは描画が必要になるたびに何度も呼び出されているはずです。
これを使わないとなると、
・最小化など方法で画面が見えなくなった場合に表示されなくても諦める。
・ご自身で再描画が必要なタイミングを計算して頑張る。
のようなことになるでしょう。
自分でタイミングを考えるのが大変だから継承するのです。
Re: [java]paintメソッドをmain関数に書く方法
確かに再描画の必要はしょっちゅうだからmainに書くなんて無理ですよね。
ちなみにこのpaintメソッドを実行制御してるメソッドを見てみたいんですがありますか?
どんな中身かきになります。
ちなみにこのpaintメソッドを実行制御してるメソッドを見てみたいんですがありますか?
どんな中身かきになります。
Re: [java]paintメソッドをmain関数に書く方法
http://csi.nisinippon.com/ecl.png描画処理の再定義
AWT コンポーネントに何らかの図やイメージを描画するには paint() メソッドをオーバーライドしました
しかし、JComponent を継承する Swing コンポーネントの場合、paint() メソッドはコンポーネント全体
の描画を総括するトップメソッドとして定義されています。
Swing コンポーネントは、コンポーネントの描画以外に、子コンポーネントの描画やコンポーネントの
境界線となる枠を部品化しています。子コンポーネントの描画は paintChildren() メソッドで、境界線は
paintBorder() メソッドで行われます。paint() メソッドはこれらのメソッドを呼び出して、
コンポーネントの外観を整える役割を持っているため、サブクラスでこれをオーバーライドしてしまうと
、このルールが破綻してしまう可能性があるため、推奨できません。
paint() メソッドをオーバーライドする場合は、Swing コンポーネントの内部動作を理解したうえで行う
必要があります。
このような事情があるため、Swing コンポーネントの描画処理を再定義する場合は paintComponent()
メソッドをオーバーライドします。
--まだまだDeepな話が続くのですがeclipseでJavaの実例を勉強中なのでサンプルが出来ました。。
AWT コンポーネントに何らかの図やイメージを描画するには paint() メソッドをオーバーライドしました
しかし、JComponent を継承する Swing コンポーネントの場合、paint() メソッドはコンポーネント全体
の描画を総括するトップメソッドとして定義されています。
Swing コンポーネントは、コンポーネントの描画以外に、子コンポーネントの描画やコンポーネントの
境界線となる枠を部品化しています。子コンポーネントの描画は paintChildren() メソッドで、境界線は
paintBorder() メソッドで行われます。paint() メソッドはこれらのメソッドを呼び出して、
コンポーネントの外観を整える役割を持っているため、サブクラスでこれをオーバーライドしてしまうと
、このルールが破綻してしまう可能性があるため、推奨できません。
paint() メソッドをオーバーライドする場合は、Swing コンポーネントの内部動作を理解したうえで行う
必要があります。
このような事情があるため、Swing コンポーネントの描画処理を再定義する場合は paintComponent()
メソッドをオーバーライドします。
--まだまだDeepな話が続くのですがeclipseでJavaの実例を勉強中なのでサンプルが出来ました。。
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class paintSmp extends JFrame implements Runnable {
private JComponent label;
public static void main(String args[]) {
JFrame win = new paintSmp();
win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
win.setBounds(10 , 10 , 400 , 300);
win.setVisible(true);
}
public paintSmp() {
label = new LabelEx("Sample Program");
getContentPane().add(label);
new Thread(this).start();
}
private int color = 0;
private boolean increase = true;
public void run() {
while(true) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
label.setFont(new Font("Serif" , Font.PLAIN , 20));
label.setForeground(new Color(color));
label.repaint();
}
});
if (increase) color++;
else color--;
if (color == 255) increase = false;
else if (color == 0) increase = true;
try { Thread.sleep(10); }
catch(InterruptedException err) {
//例外処理をここに記述します。
}
}
}
}
class LabelEx extends JComponent {
private String label;
public LabelEx(String label) { this.label = label; }
public void paintComponent(Graphics g) {
if (label != null) {
FontMetrics fm = getFontMetrics(getFont());
g.drawString(label ,
getWidth() / 2 - fm.stringWidth(this.label) / 2 ,
getHeight() / 2 + fm.getDescent()
);
}
}
}
Re: [java]paintメソッドをmain関数に書く方法
難しいことは考えずにとりあえずpaint()の恩恵を授かろうってことですねw
詳しいご説明ありがとうございます。
詳しいご説明ありがとうございます。