Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JLabel不使用计时器更新_Java_Swing_Timer - Fatal编程技术网

Java JLabel不使用计时器更新

Java JLabel不使用计时器更新,java,swing,timer,Java,Swing,Timer,我在互联网上到处搜索,试图找到如何在没有运气的情况下制作一个自动更新时钟gui程序。我尝试了许多不同的方法,结果都是一样的。我正在使用swing定时器,正如我所读到的,这是处理gui的最好方法。我已尝试验证()、重新验证()、重新绘制()。 以下是代码的一部分: import javax.swing.*; //import java.awt.event.*; import java.util.*; import javax.swing.Timer; import java.awt.event.A

我在互联网上到处搜索,试图找到如何在没有运气的情况下制作一个自动更新时钟gui程序。我尝试了许多不同的方法,结果都是一样的。我正在使用swing定时器,正如我所读到的,这是处理gui的最好方法。我已尝试验证()、重新验证()、重新绘制()。 以下是代码的一部分:

import javax.swing.*;
//import java.awt.event.*;
import java.util.*;
import javax.swing.Timer;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class ClockPanel extends JPanel { 
    Calendar now = Calendar.getInstance();
    int hour = now.get(Calendar.HOUR_OF_DAY);
    int minute = now.get(Calendar.MINUTE); 
    int second = now.get(Calendar.SECOND);
    int month = now.get(Calendar.MONTH) + 1;
    int day = now.get(Calendar.DAY_OF_MONTH);
    int year = now.get(Calendar.YEAR);

    private String currentTime;
    private JLabel current;

    public ClockPanel() {
        super();
        currentTime = getTime();
        current = new JLabel(currentTime);
        add(current);

        ActionListener updater = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent event) {
                getTime();
                if(second == 60){
                    current.setText(currentTime);
                    revalidate();

                }
                getTime();
            }
        };
        Timer timer = new Timer(1000, updater);
        timer.start();
    }
这是我最终得到的代码;我知道这是错误的,但我已经改变了很多小时,我放弃了。谢谢

编辑:下面是代码的其余部分

public String getTime() {
        String time;
        String period = "AM";
        String monthName = "";
        switch(month) {
            case (1):
                monthName = "January";
                break;
            case (2):
                monthName = "February";
                break;
            case (3):
                monthName = "March";
                break;
            case (4):
                monthName = "April";
                break;
            case (5):
                monthName = "May";
                break;
            case (6):
                monthName = "June";
                break;
            case (7):
                monthName = "July";
                break;
            case (8):
                monthName = "August";
                break;
            case (9):
                monthName = "September";
                break;
            case (10):
                monthName = "October";
                break;
            case (11):
                monthName = "November";
                break;
            case (12):
                monthName = "December";
                break;
        }
        if(hour >= 12){
            period = "PM";
        }
        time = monthName + " " + day + ", " + year + " "
                + hourCheck(hour) + ":" + minuteCheck(minute) + period;
        return time;
    }

    private int hourCheck(int hour) {
        if(hour > 12){
            hour -= 12;
            return hour;
        }
       if(hour == 0) {
            hour += 12;
            return hour;
        }
       return hour;
    }

    private StringBuilder minuteCheck(int minute) { 
       StringBuilder time = new StringBuilder();

       if(minute < 10) {
           return time.append("0").append(minute);
       }
       else {
           time.append("").append(minute);
       }
       return time;
    }

}
公共字符串getTime(){
串时间;
字符串句点=“AM”;
字符串monthName=“”;
开关(月){
案例(1):
monthName=“一月”;
打破
案例(2):
monthName=“二月”;
打破
案例(3):
monthName=“三月”;
打破
案例(4):
monthName=“四月”;
打破
案例(5):
monthName=“May”;
打破
案例(6):
monthName=“June”;
打破
案例(7):
monthName=“七月”;
打破
案例(8):
monthName=“八月”;
打破
案件(9):
monthName=“九月”;
打破
案例(10):
monthName=“十月”;
打破
案件(11):
monthName=“11月”;
打破
案件(12):
monthName=“十二月”;
打破
}
如果(小时>=12){
period=“PM”;
}
时间=月名+“”+日+“”,“+年+“”
+hourCheck(小时)+“:“+分钟检查(分钟)+时段;
返回时间;
}
专用整数小时检查(整数小时){
如果(小时>12){
小时-=12;
返程时间;
}
如果(小时==0){
小时+=12;
返程时间;
}
返程时间;
}
私有StringBuilder minuteCheck(整数分钟){
StringBuilder时间=新建StringBuilder();
如果(分钟<10){
返回时间。追加(“0”)。追加(分钟);
}
否则{
时间。追加(“”)。追加(分钟);
}
返回时间;
}
}

您正在调用
getTime()
,但忽略它返回的内容。因此,当前时间与以前一样。将代码替换为:

    ActionListener updater = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent event) {
            String newTime = getTime();
            current.setText(newTime);
        }
    };
编辑:

您不仅会忽略
getTime()
返回的值,而且
getTime()
也会始终返回相同的值,因为在构建面板时,您总是重复使用仅初始化一次的月份、分钟、秒等。如果不使用标准的DateFormat类,您的生活也会变得非常困难

从面板中删除除JLabel之外的所有字段,并将
getTime()
方法更改为类似以下内容:

private String getTime() {
    // get the CURRENT date:
    Date currentDate = new Date();

    // format it and return it:
    return new SimpleDateFormat("MMMM dd, yyyy hh:mm a").format(currentDate);
}

您正在调用
getTime()
,但忽略它返回的内容。因此,当前时间与以前一样。将代码替换为:

    ActionListener updater = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent event) {
            String newTime = getTime();
            current.setText(newTime);
        }
    };
编辑:

您不仅会忽略
getTime()
返回的值,而且
getTime()
也会始终返回相同的值,因为在构建面板时,您总是重复使用仅初始化一次的月份、分钟、秒等。如果不使用标准的DateFormat类,您的生活也会变得非常困难

从面板中删除除JLabel之外的所有字段,并将
getTime()
方法更改为类似以下内容:

private String getTime() {
    // get the CURRENT date:
    Date currentDate = new Date();

    // format it and return it:
    return new SimpleDateFormat("MMMM dd, yyyy hh:mm a").format(currentDate);
}

您可以调整代码以适应此情况,它将起作用:

public class ClockPanel extends JPanel { 
    private final JLabel current;

    public ClockPanel() {
        current = new JLabel(now());
        add(current);

        new Timer (1000, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent event) {
                current.setText(now());
            }
        }).start();
    }

    private static String now() {
        // implement your own
        return new Date().toString();
    }

    public static void main(String[] args) {
        JFrame main = new JFrame("Simple Clock");
        main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        main.setSize(200, 200);
        main.setContentPane(new ClockPanel());
        main.setVisible(true);
    }
}

您可以调整代码以适应此情况,它将起作用:

public class ClockPanel extends JPanel { 
    private final JLabel current;

    public ClockPanel() {
        current = new JLabel(now());
        add(current);

        new Timer (1000, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent event) {
                current.setText(now());
            }
        }).start();
    }

    private static String now() {
        // implement your own
        return new Date().toString();
    }

    public static void main(String[] args) {
        JFrame main = new JFrame("Simple Clock");
        main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        main.setSize(200, 200);
        main.setContentPane(new ClockPanel());
        main.setVisible(true);
    }
}

您的代码中有编译器错误吗。。。?你可以发布方法
getTime()
的代码吗?我在编译器中没有任何错误。如果我认为可以用“SimpleDataFormat”实例替换getTime(),那么我正在使用netbeans。为您节省了很多麻烦,而且更加灵活。您的代码中有编译器错误吗。。。?你可以发布方法
getTime()
的代码吗?我在编译器中没有任何错误。如果我认为可以用“SimpleDataFormat”实例替换getTime(),那么我正在使用netbeans。省去了很多麻烦,而且更加灵活。我有一个返回时间的getTime()函数。如果你愿意,我可以发布整个代码。它可能会使它更容易,正如你所说的:它返回时间。因此,如果忽略它返回的内容,调用它不会改变任何事情。重新阅读我的答案,并尝试我发布的代码。另请参阅Genzer的示例,该示例已完成,并可执行您想要的操作。@TechnicalCustoms:阅读我编辑的答案。您的getTime()方法也是错误的。非常感谢。它起作用了。我已经找了好几个小时了,你5分钟后给我。谢谢+1我有一个返回时间的getTime()函数。如果你愿意,我可以发布整个代码。它可能会使它更容易,正如你所说的:它返回时间。因此,如果忽略它返回的内容,调用它不会改变任何事情。重新阅读我的答案,并尝试我发布的代码。另请参阅Genzer的示例,该示例已完成,并可执行您想要的操作。@TechnicalCustoms:阅读我编辑的答案。您的getTime()方法也是错误的。非常感谢。它起作用了。我已经找了好几个小时了,你5分钟后给我。感谢+1+1用于SSCCE,感谢您显示面板中的所有字段都是不必要的。+1用于SSCCE,感谢您显示面板中的所有字段都是不必要的。