0

我有一个学校作业,我必须创建一个简单的模拟和数字时钟,显示像这样“XX:XX”这样的时间并绘制一个时钟。如本例所示:

简单的时钟

我用 Java 写了一些东西,但是我得到了各种各样的错误。这项任务的目标是学习实现类和定义方法等。如果有人能给我一些提示(不是实际的解决方案)关于什么是错误的或我可以改进的地方,我将非常感激。

主要代码

import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class ShowClock {

    public static void main (String[] args) {
        double hour = Double.parseDouble(JOptionPane.showInputDialog("What time is it (hours)?"));
        double minutes = Double.parseDouble(JOptionPane.showInputDialog("What time is it (minutes)?"));
        String time= String.valueOf(hour) + String.valueOf(minutes) ;

        JFrame frame = new JFrame("test app"); 
        frame.setSize(300,400); 
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        frame.setTitle("Hoe laat is het?");

        Klok k = new Klok(hour, minutes); 
        frame.add(k); 
        frame.setVisible(true);;
    }
}

类克洛克

import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JComponent;

class Klok extends JComponent {
    private double hour;
    private double minutes;
    private String time;

    int anglehour = (int)((90 - (hour + minutes / 60) * 30 ) * Math.PI / 180);
    int angleminutes = (int)((90 - minutes * 6.0) * Math.PI / 180);
    int xendpointhour = (int)(150+(75*Math.cos(anglehour)));
    int yendpointhour = (int)(150-(75*Math.sin(anglehour)));
    int xendpointminutes = (int)(150+(75*Math.cos(angleminutes)));
    int yendpointminutes = (int)(150-(75*Math.sin(angleminutes)));

    public void draw (Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
        g2.drawString(time, 0, 400);
        g2.drawOval(75,75, 150, 150);
        g2.drawLine(150,150, xendpointhour, yendpointhour);
        g2.drawLine(150, 150, xendpointminutes, yendpointminutes);
    }
}

更新:我还是不太明白。我想我需要一个关于构造函数和方法如何工作的简单解释,因为我的书不是很具描述性。很抱歉用这些菜鸟问题打扰任何人......

主班

import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class KlokTonen {

public static void main(String[] args) {
    double hour = Double.parseDouble(JOptionPane.showInputDialog("What time is it (hours)?"));
    double minutes = Double.parseDouble(JOptionPane.showInputDialog("What time is it (minutes)?"));
    String time= String.valueOf(hour) + String.valueOf(minutes) ;

    JFrame frame = new JFrame("test app"); frame.setSize(300,400); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setTitle("Hoe laat is het?");
    Klok k = new Klok(hour, minutes); 
    frame.add(k); 
    frame.setVisible(true);;
}
}

二等舱

import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JComponent;

public class Klok extends JComponent {
private double hour; 
private double minutes;
private String time;
public void draw (Graphics g) {
Graphics2D g2 = (Graphics2D) g;
int angleHour = (int)((90 - (hour + minutes / 60) * 30 ) * Math.PI / 180);
int angleMinutes = (int)((90 - minutes * 6.0) * Math.PI / 180);
int xEndPointHour = (int)(150+(75*Math.cos(angleHour)));
int yEndPointHour = (int)(150-(75*Math.sin(angleHour)));
int xEndPointMinutes = (int)(150+(75*Math.cos(angleMinutes)));
int yEndPointMinutes = (int)(150-(75*Math.sin(angleMinutes)));
g2.drawString(time, 0, 400);
g2.drawOval(75,75, 150, 150);
g2.drawLine(150,150, xEndPointHour, yEndPointHour);
g2.drawLine(150, 150, xEndPointMinutes, yEndPointMinutes);
}
}
4

4 回答 4

3

提示:

  1. 你需要声明一个Klok构造函数来匹配这个:new Klok(hour, minutes)

  2. angleHour等的计算angleMinutes取决于hourand minutes... 的值,但是在您评估这些表达式时,您还没有为这些变量提供值。

  3. 大概 a 的hourminuteKlok可以改变......


当我引起你的注意时,当你用多个单词组成一个 Java 标识符时,你应该使用“camel case”;例如angleHour不是anglehour


与该签名匹配的Klok构造函数如下所示:

    public Klok (int hours, int minutes) {
        // ... you fill in the rest ...
    }

但是,如果您还想time使用 in 计算的内容来初始化该字段main,您也需要传递它...

于 2013-10-14T15:49:37.473 回答
1

在中 , 从到Klok列出 的 变量正在 使用 所谓 的初始化 块. 此块在您的构造函数之前运行,这意味着它还没有值!anglehouryendpointminuteshourminutes

在 draw 方法的顶部定义这些变量可能更合适:

public void draw (Graphics g) {
    Graphics2D g2 = (Graphics2D) g;
    int anglehour = ...;
    ...
}

hour其次,您需要实际设置 和 的minutestime。创建新实例时,您已经调用了构造函数:Klok k = new Klok(hour, minutes);
现在你只需要在你的Klok类中定义这个构造函数。它将接受值hour并将minutes它们存储在Klok对象的适当变量中。例如:

public Klok(double hour, double minutes){
    ...
}
于 2013-10-14T15:48:24.923 回答
1

Java 不是一种声明性语言。这个

int anglehour = (int)((90 - (hour + minutes / 60) * 30 ) * Math.PI / 180);

表达式仅在 Klok 类的每个实例化时执行。它没有声明变量值之间的关系:它没有意义let the anglehour have the value that is calculated this way, for the current values fo the hour and minute variables。您总是必须执行计算

您应该省略anglehour, angleminutes...yendpointminutes变量,并创建如下方法:

public int getAngleHour() {
  return (int)((90 - (hour + minutes / 60) * 30 ) * Math.PI / 180);
}

并适当地使用,在为实例变量赋值之后hourminutes当然......

于 2013-10-14T15:54:14.697 回答
0

您的角度不正确,因为您使用的是整数算术。

我还建议将您的小时和分钟组合成十进制时间,以便 12:30 变为 12.5(12 后半小时)。

这里有一些代码可以计算出时针的角度,让你开始。这假设顶部 (12) 处于角度 0(或 360)并以度数表示角度:

double time = (double)hour + ((double)minutes/60.0);
double anglehour = (360/12) * time;
于 2013-10-14T15:56:25.133 回答