我有一个学校作业,我必须创建一个简单的模拟和数字时钟,显示时间,如“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);
}
}
更新:我还是不太明白。我想我需要一个关于构造函数和方法如何工作的简单解释,因为我的书不是很具描述性。很抱歉打扰这些noob问题的人...
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);
}
}
答案 0 :(得分:3)
提示:
您需要声明一个Klok
构造函数来匹配:new Klok(hour, minutes)
angleHour
,angleMinutes
等等的计算取决于hour
和minutes
的值......但在您评估这些表达式时,你没有给这些变量赋值。
推测hour
的{{1}}和minute
值可能会改变......
虽然我引起了你的注意,当你用多个单词组成一个Java标识符时,你应该使用“camel case”;例如Klok
不是angleHour
。
匹配该签名的anglehour
构造函数如下所示:
Klok
但是,如果您还想使用 public Klok (int hours, int minutes) {
// ... you fill in the rest ...
}
中计算的内容初始化time
字段,则还需要传递该字段...
答案 1 :(得分:1)
在Klok
中,anglehour
到yendpointminutes
列出的变量正在使用所谓的initializer block。该块运行before your constructor,这意味着hour
和minutes
还没有值!
在draw方法的顶部定义这些变量可能更合适:
public void draw (Graphics g) {
Graphics2D g2 = (Graphics2D) g;
int anglehour = ...;
...
}
其次,您需要实际设置hour
,minutes
和time
的值。您在创建新实例时已经调用了构造函数:Klok k = new Klok(hour, minutes);
现在,您只需要在Klok
类中定义此构造函数。它将获取hour
和minutes
的值,并将它们存储在Klok
对象中的相应变量中。例如:
public Klok(double hour, double minutes){
...
}
答案 2 :(得分: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);
}
并且在为实例变量hour
和minutes
分配值之后正确使用...
答案 3 :(得分:0)
您的角度不正确,因为您使用的是整数运算。
我还建议将小时和分钟组合成小数时间,以便12:30变为12.5(12小时后半小时)。
这里有一些代码可以计算出时针的角度,让你开始吧。这假设顶部(12)处于角度0(或360)并以度为单位表示角度:
double time = (double)hour + ((double)minutes/60.0);
double anglehour = (360/12) * time;