import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.plaf.SliderUI;
public class RoseJFrame extends JFrame implements ActionListener {
private RoseCanvas rose;
private JButton button_color;
public RoseJFrame()
{
super("四葉玫瑰線"); //設置框架標題
Dimension dim=getToolkit().getScreenSize(); //獲取屏幕分辨率
this.setBounds(dim.width/4, dim.height/4, dim.width/2, dim.height/2); //設置框架顯示位置
this.setDefaultCloseOperation(3); //設置關閉按鈕功能爲關閉
JPanel jpanel=new JPanel(); //定義一個面板對象
this.getContentPane().add(jpanel, "North"); //將面板對象加入到當前窗口的北方,默認佈局管理器爲BorderLayout
button_color=new JButton("選擇顏色"); //實例化按鈕對象,並設置按鈕標籤文字
jpanel.add(button_color); //向面板容器中添加按鈕 面板默認佈局管理器爲FlowLayout
button_color.addActionListener(this); //對按鈕設置事件監聽器響應單機事件
rose=new RoseCanvas(Color.red);
this.getContentPane().add(rose, "Center"); //將畫布加入到框架的中間位置
this.setVisible(true); //設置框架容器的可見性,true爲可見 注意:此行命令應寫在框架構造函數的最後,這樣才能保證容器中的所有組件可見
}
public void actionPerformed(ActionEvent e) {
Color c=JColorChooser.showDialog(this, "選擇顏色", Color.blue); //單擊按鈕觸發的事件,顯示顏色對話框,可以具體指定顏色
rose.setColor(c); //調用構造法方法設置顏色
rose.repaint(); //每選擇新的顏色,重畫一次
}
public static void main(String[] args) {
new RoseJFrame();
}
}
class RoseCanvas extends Canvas implements ComponentListener,Runnable
{
private Color color;
public RoseCanvas(Color color) //帶參數的構造方法,構造方法必須和類名稱一致
{
this.setColor(color); //設置框架的顏色
this.addComponentListener(this); //添加組件事件監聽器
}
public void setColor(Color color)
{
this.color=color;
}
public void paint(Graphics g)
{
int x0=this.getWidth()/2; //設置初始值
int y0=this.getHeight()/2;
g.setColor(color);
g.drawLine(x0,0,x0,y0*2); //畫水平直線
g.drawLine(0, y0, x0*2, y0); //畫垂直直線
int j=40;
while(j<200)
{
for(int i=0;i<=1023;i++)
{
double angle=i*Math.PI/512; //角度值
double radius=j*Math.sin(2*angle); //設置半徑的值 根據公式 r=a*sinb
int x=(int)Math.round(radius*Math.cos(angle)*2); //設置曲線上的座標值
int y=(int)Math.round(radius*Math.sin(angle));
g.fillOval(x0+x, y0+y, 1, 1); //畫橢圓
}
j+=20; //j的值每循環遞增20,畫一次四葉玫瑰線
}
}
public void componentResized(ComponentEvent e) {
this.repaint(); //重畫
}
public void componentMoved(ComponentEvent e) {}
public void componentShown(ComponentEvent e) {}
public void componentHidden(ComponentEvent e) {}
public void run() {
}
}
日常練習隨筆
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.