如何使用挥杆制作更好更快的挂钟?

时间:2012-03-14 14:11:54

标签: java swing

我已经开始了它,但我不知道如何在时钟上放一些数字。估计线是一种痛苦。 = /任何想法如何更容易和更快地做到这一点? x-x这是我的代码。

import java.awt.*;
import javax.swing.*;

public class DrawingProject extends JFrame
{
    public static void main(String[] args)
{
        DrawingProject frame = new DrawingProject();
        frame.setSize(750, 750);
        frame.setVisible(true);
}

public void paint(Graphics g)
{
    g.drawOval(170, 170, 300, 300);
    g.drawLine(235, 235, 330, 330);
    g.drawLine(235, 235, 237, 257);
    g.drawLine(235, 235, 257, 237);
    g.drawLine(330, 255, 330, 330);
    g.drawLine(330, 255, 345, 270);
    g.drawLine(330, 255, 313, 270);


}
}

3 个答案:

答案 0 :(得分:3)

考虑使用polar coordinates。有了它,你可以将每个点作为距离中心(总是相同的)和旋转角度(每个数字都增加)。

答案 1 :(得分:2)

使用polar coordinates来确定数字的位置。一个完整的圆圈有360度。有12个小时,这意味着每隔30度从角度0开始,必须放置一个数字。

Here's a full example

答案 2 :(得分:2)

首先,使用hard coded坐标绘制线条的不良做法。特别是如果可以使用一些平凡的几何计算这些坐标。点击提供给您的第一个链接,我们会看到以下公式:

// polar to Cartesian
double x = Math.cos( angleInRadians ) * radius;
double y = Math.sin( angleInRadians ) * radius;

// Cartesian to polar.
double radius = Math.sqrt( x * x + y * y );
double angleInRadians = Math.acos( x / radius );

来源:mindprod.com

前两行完全符合您的要求!它们计算在某个角度上在轴上行进的距离。我们可以使用这些公式来计算线的目标点。对于起点,我们将使用框架的中心。

现在让我们将这些公式放入一些方法中:

private int calculateHorizontalOffset(int angle, int radius) {
    return (int) Math.round(Math.cos(Math.toRadians(angle)) * radius);
}

private int calculateVerticalOffset(int angle, int radius) {
    return (int) Math.round(Math.sin(Math.toRadians(angle)) * radius);
}

现在很容易计算线条的坐标,这是最终的结果:

import java.awt.*;
import javax.swing.*;

public class DrawingProject extends JFrame {

    /**
     * This is the size of our clock
     */
    int radius = 300;

    public static void main(String[] args) {
        DrawingProject frame = new DrawingProject();
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setSize(750, 750);
        frame.setVisible(true);
    }

    private int calculateHorizontalOffset(int angle, int radius) {
        return (int) Math.round(Math.cos(Math.toRadians(angle)) * radius);
    }

    private int calculateVerticalOffset(int angle, int radius) {
        return (int) Math.round(Math.sin(Math.toRadians(angle)) * radius);
    }

    public void paint(Graphics g) {

        int offsetX, offsetY;
        //here we calculate the center of our drawing pane
        int centerX = getWidth() / 2;
        int centerY = getHeight() / 2;

        //then we draw a circle using the data we have so far
        g.drawOval(centerX - radius / 2, centerY - radius / 2, radius, radius);

        //then, with our formulas, we create a line to the left (angle = 0)
        offsetX = calculateHorizontalOffset(0, radius / 2 - 50);
        offsetY = calculateVerticalOffset(0, radius / 2 - 50);
        g.drawLine(centerX, centerY, centerX + offsetX, centerY + offsetY);

        //and a second line to the top (angle = 270)
        offsetX = calculateHorizontalOffset(270, radius / 2 - 10);
        offsetY = calculateVerticalOffset(270, radius / 2 - 10);
        g.drawLine(centerX, centerY, centerX + offsetX, centerY + offsetY);
    }
}

另一个提示是,JFrame的默认关闭操作是HIDE_ON_CLOSE。只是隐藏框架通常是不够的。我们希望在窗口关闭后立即关闭应用程序。我为此使用了EXIT_ON_CLOSE。