ベクター図のボタンを作りたい
javax.swing.JButtonでボタンを作って、そこにベクター図を埋め込みたいです。ドーすれば良いですか?サンプルプログラムを書いてくださったり、参考になりそうなホームページを紹介してくださると幸いです。
ボタンに文字(text)を埋め込む方法なら知ってます。ビットマップ図(.pngファイルなど)のアイコンを埋め込む方法も知ってます(ググればサンプルコードが沢山ヒットします)。しかし、ベクトルグラフィックスを埋め込むとなると、ハイレベルでしょうか?
javax.swing.JButton maru=new JButton();//ボタンのインスタンス生成
void paint(java.awt.Graphics g){g.fillOval(100,100,100,100);}//位置のxyも短径長径も100ピクセルの楕円黒丸
maruボタンにsetText("●");とするのは簡単なのですが、やりたい事と少し違います。"●"は文字ですし、これだと半径の設定が厳しいです(フォントサイズを変えれば良いのでしょうが)。
やりたい事は、
maru.setIcon(java.awt.Graphics g.fillOval(100,100,100,100));//半径100ピクセルの円をjava.awtで描いて、それをボタンに埋め込みたい
↑
このコードはエラーになるんです。悲しいです。何とかして、エラーを回避して、maruボタンにfillOval(100,100,100,100)を埋め込みたいです。
ボタンに埋め込む図がベクター図なら、java.awt.Graphics以外の方法でも良いです。だけど、JavaのJButtonを使いますし、javaでベクトルグラフィックスの絵を描くとなるとjava.awt.Graphicsを使うでしょうし、
maru.setIcon(java.awt.Graphics g.fillOval(100,100,100,100));みたいなプログラムが自然かなって思いました。
*****
(以下参考)試しにちょっと作ってみました。
class VectorButtonShitsumon extends java.awt.Frame{
public VectorButtonShitsumon(){setSize(500,500);setVisible(true);}
public void paint(java.awt.Graphics g){g.fillOval(100,100,100,100);}
public static void main(String[] args){
javax.swing.JFrame fr=new javax.swing.JFrame();
fr.setBounds(200,200,200,200);
javax.swing.JButton maru=new javax.swing.JButton();
//maru.setIcon(java.awt.Graphics g.fillOval(100,100,100,100));//←エラーコード
maru.setText("●");//setTextは嫌!
fr.getContentPane().add(maru,java.awt.BorderLayout.CENTER);
new VectorButtonShitsumon();
fr.setVisible(true);
}//end main
}//end class VectorButtonShitsumon
ここまで
コメントを外したときのエラーメッセージ
Exception in thread "main" java.lang.Error: Unresolved compilation problems:
型 AbstractButton のメソッド setIcon(Icon) は引数 (void) に適用できません
型 Graphics の非 static メソッド fillOval(int, int, int, int) を static 参照することはできません
トークン "g" に構文エラーがあります。このトークンを削除してください
補足
解答、ありがとうございます。 >お使いのWindowsマシンのCRTの調整(画面の縦横サイズ)が合っていない それは、ありません。マックで描画したものをGIFファイルにして、アプレットの下に貼り付けてみましたが、GIFファイルは正常に表示されています。また、質問のところにも書きましたが、 void paint(Graphics g) { で描画したものは歪んでいません。 実験に使ったものは下記のものです。 /* * circles.java 2001/12/26 */ import java.awt.*; public class circles extends java.applet.Applet { Image offscr; Graphics offG; public void init() { } public void paint(Graphics g) { update(g); g.setColor(Color.red); for(int i = 0; i < 20; i++){ g.fillOval(i*25, 40, i, i); } } public void update(Graphics g) { offscr = createImage(500, 100); offG = offscr.getGraphics(); offG.setColor(Color.white); //make background offG.fillRect(0, 0, 500, 100); offG.setColor(Color.blue); for(int i = 0; i < 20; i++){ offG.fillOval(i*25, 20, i, i); } g.drawImage(offscr, 0, 0, this); offG.dispose(); } }