JShellを使ってJava2Dであそぶ

JShellを使ってJava2Dであそんでみました。楽しい。


Javaが初めての人はこちらもどうぞ。
JShellで始めるJava - Javaの世界を覗いてみる - Qiita


ということで、まずjavax.swing.*をimport

jshell> import javax.swing.*


JFrameを用意

jshell> var f=new JFrame("guruguru")
f ==> javax.swing.JFrame[frame0,0,0,0x0,invalid,hidden, ... tPaneCheckingEnabled=true]


そして、画像を表示するためのJLabelを用意

jshell> var label=new JLabel()
label ==> javax.swing.JLabel[,0,0,0x0,invalid,alignmentX=0. ... rticalTextPosition=CENTER]


画像としてBufferedImageを用意してますが、BufferedImageまで入力して[Shift]+[Tab]からの[i]を押すとimportのおすすめが出るので[1]を押してimportします。

jshell> var image=new BufferedImage
0: 何もしない
1: import: java.awt.image.BufferedImage
選択:
Imported: java.awt.image.BufferedImage


で、こんな感じでBufferedImageを用意

jshell> var image=new BufferedImage(400,300,BufferedImage.TYPE_INT_RGB)
image ==> BufferedImage@5ccddd20: type = 1 DirectColorModel ... 0 yOff = 0 dataOffset[0] 0


画像はImageIconを介してIconとしてJLabelに追加します。

jshell> label.setIcon(new ImageIcon(image))


labelをJFrameに追加したら、show()で表示

jshell> f.add(label)
$7 ==> javax.swing.JLabel[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,bo...sition=CENTER]

jshell> f.show()


録画領域からはみでていたので移動

jshell> f.setLocation(20,40)


packすると画面サイズが調整されます。

jshell> f.pack()


描画を行うためにGraphics2Dを取得

jshell> var g=image.createGraphics()
g ==> sun.java2d.SunGraphics2D[font=java.awt.Font[famil ... .Color[r=255,g=255,b=255]]


描画色を設定するのだけど、Colorはjava.awt.Colorなので、また[Shift]+[Tab]して[i]を押してimportを補完

jshell> g.setColor(Color
0: 何もしない
1: import: java.awt.Color
選択:
Imported: java.awt.Color


ここでは赤に設定します。

jshell> g.setColor(Color.RED)


線を引いてみる

jshell> g.drawLine(20,20,300,200)


labelをrepaintすると表示されます

jshell> label.repaint()


青で四角を描く

jshell> g.setColor(Color.BLUE)

jshell> g.fillRect(50,40,200,100)

jshell> label.repaint()


crearRectで一旦消去

jshell> g.clearRect(0,0,400,300)

jshell> label.repaint()


モアレを表示してみる。

jshell> IntStream.range(0,30).map(y->y*10).forEach(y->g.drawLine(0,y,400,300-y))

jshell> label.repaint()


画面消去

jshell> g.clearRect(0,0,400,300)

jshell> label.repaint()


ここもAffineTransformで[Shift]+[Tab]を押したあと[i]を押してjava.awt.geom.AffineTransformをimportしています。
{〜}の中は;(セミコロン)で行を終わらせる必要があるので注意。
で、最後の[}]を入力したら、ぐるぐる。

jshell> for(int i=0; i< 100;++i){
   ...> g.clearRect(0,0,400,300);

   ...> g.setTransform(AffineTransform.getRotateInstance(Math.PI*i/100,200,150));
   ...> g.fillRect(0,0,400,300);
   ...> label.repaint();
   ...> Thread.sleep(30);
   ...> }


最後に/listをしてぐるぐるに26というidが振られているのを確認して/26としてもう一度ぐるぐる。


Graphics2Dの使い方は、ドキュメント見て
https://docs.oracle.com/javase/jp/9/docs/api/java/awt/Graphics2D.html