[java]paintメソッドをmain関数に書く方法
Posted: 2017年1月08日(日) 11:20
mainメソッドから呼び出すと実行されるようにしつつ、mainメソッドから呼び出さないと実行されないようにするのは不可能だと思います。java君 さんが書きました:このpaintメソッドってメソッドとして宣言が必要でも、main関数から呼び出さなくても実行されますよね。
これが凄い気持ち悪いので、mainメソッドから呼び出さないと実行しないようにしたいんですが、それは可能ですか?
なぜそのようなことがしたいのでしょうか?java君 さんが書きました:後このpaintメソッドの所属クラスを調べたい場合どうすればいいでしょう?上手くいきません。
java.awt.Graphicsクラスにも、それが継承しているjava.lang.Objectクラスにも、paintメソッドはありません。java君 さんが書きました:Graphicsクラスのメソッドであることは分かるのですが
自分で呼び出す方が大変気持ち悪いです。画面の描画は1度呼べばいいというものではありません。このpaintメソッドってメソッドとして宣言が必要でも、main関数から呼び出さなくても実行されますよね。
これが凄い気持ち悪いので、mainメソッドから呼び出さないと実行しないようにしたいんですが、
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()
);
}
}
}