Я новичок в кодировании, и сейчас я просто делаю это как хобби. Я создал аналоговые часы, и у меня есть jlabel, чтобы рассказать мне, сколько минут прошло. Тем не менее, я не могу понять, что я делаю неправильно с setText ("...."), чтобы обновить Jlabel. Короче говоря, он просто не обновляет ярлык, он застрял в оригинальную минуту.JLabel и setText Недоразумение
Stackverflow был необходим для меня, насколько мне известно, и я немного смущен. Мне даже приходится задавать эти вопросы, но я не могу найти решение.
Прошу прощения, если ответ где-то, и я его еще не нашел. То, что я думаю, что, вероятно, соответствующий бит кода здесь ...
//Minute Counter
JLabel label = new JLabel();
System.out.println(getMinuteCount(secondAngle));
label.setText(String.valueOf(getMinuteCount(secondAngle))+" minutes have passed.");
add(label);
... и ...
public void rotate()
{
double time = .01;
minuteAngle = minuteAngle-time;
hourAngle = hourAngle-time/12;
secondAngle = secondAngle-time*60;
}
public int getMinuteCount(double secondAngle)
{
int secondAngleInt = (int) secondAngle;
if (secondAngleInt==91)
{
minuteCount = minuteCount + 1;
}
return minuteCount;
}
Однако здесь весь мой код для справки. (Пожалуйста, извините непрофессиональный макет. Я все еще учусь :))
Любая помощь была бы весьма признательна. Хорошего дня!
public class Clock extends JPanel{
double hour = Double.parseDouble(JOptionPane.showInputDialog(null, "What hour is it?", "I need the time.", JOptionPane.PLAIN_MESSAGE));
double minutes = Double.parseDouble(JOptionPane.showInputDialog(null, "How many minutes have passed in this hour?", "I need the time.", JOptionPane.PLAIN_MESSAGE));
double Area = 400;
int minuteCount = 0;
int x0 = 300;
int y0 = 300;
double a = Math.sqrt(4*Area/Math.sqrt(3));
double h = a*Math.sqrt(3)/2;
double minuteAngle = 90-(360*minutes/60);
double hourAngle = 90-(360*hour/12);
double secondAngle = 90;
@Override
public void paint(Graphics g)
{
super.paint(g);
if (minuteAngle<0)
{
minuteAngle = 360 + minuteAngle;
}
if (hourAngle<0)
{
hourAngle = 360 + hourAngle;
}
if (secondAngle<0)
{
secondAngle = 360 + secondAngle;
}
//Draws the Second Hand Line
Graphics2D secondLine = (Graphics2D) g;
double[] secondEndpoints = getEndPoints(220+h, secondAngle);
Shape secondl = new Line2D.Double(x0, y0, secondEndpoints[0], secondEndpoints[1]);
secondLine.setColor(Color.red);
secondLine.setStroke(new BasicStroke(2));
secondLine.draw(secondl);
//Draws the Minaute Hand Line
Graphics2D minuteLine = (Graphics2D) g;
double[] minuteEndpoints = getEndPoints(220, minuteAngle);
Shape minutel = new Line2D.Double(x0, y0, minuteEndpoints[0], minuteEndpoints[1]);
minuteLine.setColor(Color.black);
minuteLine.setStroke(new BasicStroke(5));
minuteLine.draw(minutel);
//Draws the Minuate Hand Head
Graphics2D minuteHead = (Graphics2D) g;
Path2D.Double minutePath = new Path2D.Double();
double[][] minuteHeadPoints = new double[3][2];
minuteHeadPoints=getTriPoints(220, minuteAngle);
minutePath.moveTo(minuteHeadPoints[0][0], minuteHeadPoints[0][1]);
minutePath.lineTo(minuteHeadPoints[1][0], minuteHeadPoints[1][1]);
minutePath.lineTo(minuteHeadPoints[2][0], minuteHeadPoints[2][1]);
minutePath.lineTo(minuteHeadPoints[0][0], minuteHeadPoints[0][1]);
minuteHead.setColor(Color.black);
minuteHead.fill(minutePath);
//Draws the Hour Hand Line
Graphics2D line = (Graphics2D) g;
double[] endpoints = getEndPoints(120, hourAngle);
Shape l = new Line2D.Double(x0, y0, endpoints[0], endpoints[1]);
line.setColor(Color.black);
line.setStroke(new BasicStroke(5));
line.draw(l);
//Draws the Hour Hand Head
Graphics2D tri = (Graphics2D) g;
Path2D.Double path = new Path2D.Double();
double[][] tripoints = new double[3][2];
tripoints=getTriPoints(120, hourAngle);
path.moveTo(tripoints[0][0], tripoints[0][1]);
path.lineTo(tripoints[1][0], tripoints[1][1]);
path.lineTo(tripoints[2][0], tripoints[2][1]);
path.lineTo(tripoints[0][0], tripoints[0][1]);
tri.setColor(Color.black);
tri.fill(path);
//Draws the Clock
Graphics2D object = (Graphics2D) g;
object.setColor(Color.black);
object.fillOval(x0-10,y0-10,20,20);
Graphics2D clockedge = (Graphics2D) g;
clockedge.setColor(Color.black);
clockedge.setStroke(new BasicStroke(2));
clockedge.drawOval(x0-230,y0-230,460,460);
//Minute Counter
JLabel label = new JLabel();
System.out.println(getMinuteCount(secondAngle));
label.setText(String.valueOf(getMinuteCount(secondAngle))+" minutes have passed.");
add(label);
}
public static void main(String[] args)throws InterruptedException
{
JFrame frame = new JFrame("Some Shapes");
Clock clock = new Clock();
frame.add(clock);
frame.setSize(600, 600);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
int j=0;
while (true)
{
clock.rotate();
clock.repaint();
Thread.sleep(1);
}
}
public double[] getEndPoints(double radius, double angle)
{
double[] endpoints = new double[2];
double a = Math.sqrt(4*Area/Math.sqrt(3));
double h = a*Math.sqrt(3)/2;
if (angle%360==0)
{
endpoints[0]=x0+radius-h;
endpoints[1]=y0;
}
if (0<angle%360 && angle%360<90)
{
endpoints[0]=x0+(radius-h)*Math.cos(Math.toRadians(angle));
endpoints[1]=y0-(radius-h)*Math.sin(Math.toRadians(angle));
}
if (angle%360==90)
{
endpoints[0]=x0;
endpoints[1]=y0-radius+h;
}
if (90<angle%360 && angle%360<180)
{
double phi = 180-angle;
endpoints[0]=x0-(radius-h)*Math.cos(Math.toRadians(phi));
endpoints[1]=y0-(radius-h)*Math.sin(Math.toRadians(phi));
}
if (angle%360==180)
{
endpoints[0]=x0-radius+h;
endpoints[1]=y0;
}
if (180<angle%360 && angle%360<270)
{
double phi = angle-180;
endpoints[0]=x0-(radius-h)*Math.cos(Math.toRadians(phi));
endpoints[1]=y0+(radius-h)*Math.sin(Math.toRadians(phi));
}
if (angle%360==270)
{
endpoints[0]=x0;
endpoints[1]=y0+radius-h;
}
if (270<angle%360 && angle%360<360)
{
double phi = 360-angle;
endpoints[0]=x0+(radius-h)*Math.cos(Math.toRadians(phi));
endpoints[1]=y0+(radius-h)*Math.sin(Math.toRadians(phi));
}
return endpoints;
}
public double[][] getTriPoints(double radius, double angle)
{
double a = Math.sqrt(4*Area/Math.sqrt(3));
double[][] tripoints = new double[3][2];
double h = a*Math.sqrt(3)/2;
if (angle%360==0)
{
tripoints[0][0]=x0+radius;
tripoints[0][1]=y0;
tripoints[1][0]=x0+radius-h;
tripoints[1][1]=y0+a/2;
tripoints[2][0]=x0+radius-h;
tripoints[2][1]=y0-a/2;
}
if (0<angle%360 && angle%360<90)
{
tripoints[0][0]=x0+radius*Math.cos(Math.toRadians(angle));
tripoints[0][1]=y0-radius*Math.sin(Math.toRadians(angle));
tripoints[1][0]=x0+radius*Math.cos(Math.toRadians(angle))-a*Math.cos(Math.toRadians(30+angle));
tripoints[1][1]=y0-radius*Math.sin(Math.toRadians(angle))+a*Math.sin(Math.toRadians(30+angle));
tripoints[2][0]=x0+radius*Math.cos(Math.toRadians(angle))-a*Math.cos(Math.toRadians(angle-30));
tripoints[2][1]=y0-radius*Math.sin(Math.toRadians(angle))+a*Math.sin(Math.toRadians(angle-30));
}
if (angle%360==90)
{
tripoints[0][0]=x0;
tripoints[0][1]=y0-radius;
tripoints[1][0]=x0+a/2;
tripoints[1][1]=y0-radius+h;
tripoints[2][0]=x0-a/2;
tripoints[2][1]=y0-radius+h;
}
if (90<angle%360 && angle%360<180)
{
double phi = 180-angle;
tripoints[0][0]=x0-radius*Math.cos(Math.toRadians(phi));
tripoints[0][1]=y0-radius*Math.sin(Math.toRadians(phi));
tripoints[1][0]=x0-radius*Math.cos(Math.toRadians(phi))+a*Math.cos(Math.toRadians(30+phi));
tripoints[1][1]=y0-radius*Math.sin(Math.toRadians(phi))+a*Math.sin(Math.toRadians(30+phi));
tripoints[2][0]=x0-radius*Math.cos(Math.toRadians(phi))+a*Math.cos(Math.toRadians(phi-30));
tripoints[2][1]=y0-radius*Math.sin(Math.toRadians(phi))+a*Math.sin(Math.toRadians(phi-30));
}
if (angle%360==180)
{
tripoints[0][0]=x0-radius;
tripoints[0][1]=y0;
tripoints[1][0]=x0-radius+h;
tripoints[1][1]=y0-a/2;
tripoints[2][0]=x0-radius+h;
tripoints[2][1]=y0+a/2;
}
if (180<angle%360 && angle%360<270)
{
double phi = angle-180;
tripoints[0][0]=x0-radius*Math.cos(Math.toRadians(phi));
tripoints[0][1]=y0+radius*Math.sin(Math.toRadians(phi));
tripoints[1][0]=x0-radius*Math.cos(Math.toRadians(phi))+a*Math.cos(Math.toRadians(30+phi));
tripoints[1][1]=y0+radius*Math.sin(Math.toRadians(phi))-a*Math.sin(Math.toRadians(30+phi));
tripoints[2][0]=x0-radius*Math.cos(Math.toRadians(phi))+a*Math.cos(Math.toRadians(phi-30));
tripoints[2][1]=y0+radius*Math.sin(Math.toRadians(phi))-a*Math.sin(Math.toRadians(phi-30));
}
if (angle%360==270)
{
tripoints[0][0]=x0;
tripoints[0][1]=y0+radius;
tripoints[1][0]=x0-a/2;
tripoints[1][1]=y0+radius-h;
tripoints[2][0]=x0+a/2;
tripoints[2][1]=y0+radius-h;
}
if (270<angle%360 && angle%360<360)
{
double phi = 360-angle;
tripoints[0][0]=x0+radius*Math.cos(Math.toRadians(phi));
tripoints[0][1]=y0+radius*Math.sin(Math.toRadians(phi));
tripoints[1][0]=x0+radius*Math.cos(Math.toRadians(phi))-a*Math.cos(Math.toRadians(30+phi));
tripoints[1][1]=y0+radius*Math.sin(Math.toRadians(phi))-a*Math.sin(Math.toRadians(30+phi));
tripoints[2][0]=x0+radius*Math.cos(Math.toRadians(phi))-a*Math.cos(Math.toRadians(phi-30));
tripoints[2][1]=y0+radius*Math.sin(Math.toRadians(phi))-a*Math.sin(Math.toRadians(phi-30));
}
return tripoints;
}
public void rotate()
{
double time = .01;
minuteAngle = minuteAngle-time;
hourAngle = hourAngle-time/12;
secondAngle = secondAngle-time*60;
}
public int getMinuteCount(double secondAngle)
{
int secondAngleInt = (int) secondAngle;
if (secondAngleInt==91)
{
minuteCount = minuteCount + 1;
}
return minuteCount;
}
}
Я вижу, где вы устанавливаете исходный текст этикетки при ее создании. Я не вижу, где вы используете setText, чтобы обновлять текст каждый раз, когда проходит вторая секунда. – nhouser9
Итак, я думаю, это то, где ложь. Я подумал, что когда я прошу перекрасить Clock, который снова проходит через все в методе paint, то есть он обновляет метод setText с помощью нового getMinuteCount ... Я думаю, что это не то, что происходит, хотя haha –
Прежде всего, вы должны переопределить paintComponent, а не рисовать. Во-вторых, подумайте об этом на секунду - вы добавляете новую метку «КАЖДОЕ ВРЕМЯ». Это будет происходить как 60 раз в секунду. Это кажется очень плохим. Вместо этого добавьте одну метку, а затем сохраните ссылку на нее. Вызовите setText по ссылке из метода paintComponent. – nhouser9