Java_大风车(误

用java写一个看起来在转的东西

其实这些看起来在转的东西都可以用填充的扇形加其他的形状覆盖来实现

要求

(1) 编程实现一个旋转的风车程序,具体细节请自由发挥设计。

(2) 功能扩展:从文本框输入风车半径和叶片数等参数,通过单选框选择叶片数目等参数,按照设置的参数实现风车旋转。

参考

代码

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class test3_6 {
  public static void main(String[] args) {
    new MainWindow("O");
  }
}

class MainWindow extends JFrame implements ActionListener {
  private static final long serialVersionUID = 1L;

  MyPanel panel;// 当作画板
  JPanel inputJPanel;// 用来存放输入框和按键
  JTextField fanNum, fanSize;// 输入框
  JButton oK;// 确认键
  int size = 300, num = 3;// 默认扇叶尺寸和数目

  MainWindow(String name) {
    // 布局
    super(name);
    setLocationRelativeTo(null);
    setSize(600, 700);
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setResizable(false);
    panel = new MyPanel(this);
    this.add(panel, BorderLayout.CENTER);
    new Thread(panel).start();

    fanNum = new JTextField("3");// 扇叶
    fanSize = new JTextField("300");// 大小
    oK = new JButton("OK");
    oK.addActionListener(this);
    inputJPanel = new JPanel();
    inputJPanel.add(fanNum);
    inputJPanel.add(fanSize);
    inputJPanel.add(oK);
    this.add(inputJPanel, BorderLayout.SOUTH);
    validate();
  }

  @Override
  public void actionPerformed(ActionEvent e) {
    // 确认键的事件
    int tmpNum = Integer.parseInt(fanNum.getText());
    if (tmpNum > 10 || tmpNum <= 1) {
      fanNum.setText("?");
    } else {
      num = tmpNum;
    }
    int tmpSize = Integer.parseInt(fanSize.getText());
    if (tmpSize > 300 || tmpSize <= 0) {
      fanSize.setText("???");
    } else {
      size = tmpSize;
    }
  }
}

class MyPanel extends JPanel implements Runnable {
  private static final long serialVersionUID = 1L;

  int startAngle = 0, arcAngle = 30, width, height;
  int r = 60;
  int num, size;
  MainWindow frame;

  MyPanel(MainWindow frame) {
    this.frame = frame;
    setBackground(Color.yellow);
  }

  @Override
  public void paint(Graphics g) {
    // 画图
    super.paint(g);
    for (int i = 0; i < frame.num; ++i) {
      width = frame.getWidth();
      height = frame.getHeight();
      num = frame.num;
      size = frame.size;
      g.fillArc((int) ((width - 2 * size) / 2), (int) ((height - 100 - 2 * size) / 2), 2 * size, 2 * size,
          (int) (startAngle + i * (360 / num)), arcAngle);
      // 这里有点复杂,因为是一体的,所以如果展开写很没有必要
      // 大致就是定位扇形的中心点和根据填写的扇叶数目和尺寸决定每片扇叶的位置
    }
    g.fillOval(frame.getWidth() / 2 - r / 2, (frame.getHeight() - 100) / 2 - r / 2, r, r);
    // 这里画出中心的圆
  }

  @Override
  public void run() {
    // 线程操作
    while (true) {
      if (startAngle < 360) {
        startAngle++;
      } else {
        startAngle = 0;
      }
      try {
        Thread.sleep(30);
        repaint();
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }
}

One Comment

  • 大风车那个滋溜滋溜转,这里的博客真好看~~~

回复 RIV3R1AND 取消回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注