首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java中的数字时钟

Java中的数字时钟
EN

Code Review用户
提问于 2016-12-09 16:59:20
回答 1查看 3.7K关注 0票数 2

我只是在寻求一些反馈:

代码语言:javascript
复制
import javax.swing.JFrame;
import java.awt.Color;
import javax.swing.JComboBox;
import javax.swing.JPanel;

public class Clock extends JFrame {


    public Clock () {
        setContentPane(new ScreenSaver());
    }

    public static void main(String[] args) {

        Clock clock = new Clock();

        clock.setSize(685, 80);
        clock.setUndecorated(true);
        clock.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        clock.setBackground(Color.BLACK);
        clock.setResizable(false);
        clock.setVisible(true);
        clock.toFront();

    }
}

二等舱:

代码语言:javascript
复制
public class ScreenSaver extends JPanel implements ActionListener {

    public String stringDate;
    public JComboBox colorList;
    public Color userColor = Color.RED;
    public JPanel panel = new JPanel();
    public JButton button = new JButton("Alarm Clock");
    public static String time = "";
    public static Date date;
    public static DateFormat df;

    public ScreenSaver () {
        date();
        setLayout(new BorderLayout());
        Timer timer = new Timer(1000, this); 
        timer.start();


        panel.setBackground(new Color(0,0,0,0));
        panel.setLayout(new BorderLayout());

        add(panel, BorderLayout.PAGE_START);

        String [] colorName = {"Red", "Blue", "Yellow", "Green", "Pink", "Grey"}; 
        colorList = new JComboBox(colorName);
        colorList.setBackground(Color.BLACK);
        panel.add(colorList, BorderLayout.LINE_START);

    }

    public void date() {
        df = new SimpleDateFormat("EEE,MMM d yyyy - h:mm:ss a");
        date = new Date();
        stringDate = df.format(date);

    }


    public void actionPerformed(ActionEvent e) {
        if (colorList.getSelectedItem().equals("Red"))
        userColor = Color.RED;
        else if (colorList.getSelectedItem().equals("Blue"))
        userColor = Color.BLUE;
        else if (colorList.getSelectedItem().equals("Yellow"))
        userColor = Color.YELLOW;
        else if (colorList.getSelectedItem().equals("Green"))
        userColor = new Color(5, 200, 51);
        else if (colorList.getSelectedItem().equals("Pink"))
        userColor = new Color(249, 100, 178);
        else if (colorList.getSelectedItem().equals("Grey"))
        userColor = Color.GRAY;

        colorList.setForeground(userColor);

    }

    public void paintComponent(Graphics g) { 
       date();
       super.paintComponent(g);
       g.setColor(Color.BLACK);
       g.fillRect(0, 0, 685, 100);

        Font font = null;
        try {
            font = Font.createFont(Font.TRUETYPE_FONT, getClass().getResource("/DIGITALDREAMFAT.ttf").openStream());
        } catch(FontFormatException e) {
            e.printStackTrace();
        } catch(IOException e) {
            e.printStackTrace();
        }

        GraphicsEnvironment gen = GraphicsEnvironment.getLocalGraphicsEnvironment();
        gen.registerFont(font);
        font = font.deriveFont(30f);
        g.setFont(font);

       g.setColor(userColor);
       g.drawString(stringDate, 10, 60);
       repaint();

    }
}
EN

回答 1

Code Review用户

发布于 2016-12-10 06:19:48

我猜您发布的ScreenSaver.java代码缺少一些导入,所以我建议将它们添加进来,这样我们就可以看到它们了。我也不知道"DIGITALDREAMFAT.ttf“是什么,但是我不得不把整个部分删掉,这样代码才能正常工作,所以我想我错过了一些很酷的字体。然后是声明和初始化但不再使用的JButton按钮。不确定这是否只是一个你还没有添加的特性,或者只是在里面,而被遗忘了。您还可以在时钟类中导入JComboBox和JPanel,但是由于该类不使用它们,但ScreenSaver使用它们,所以我建议将这两行移到该类中。

关于这个程序,我注意到的第一件事是,既然你把你的画框设置为未装饰的,它会使你更难关闭,而且我还没有找到移动它的方法。我不确定你是否只打算在左上角关闭它,但如果不是,或者如果你打算让其他人使用它,我建议编辑它。

Eclipse正在用您的代码大喊大叫的一件事是使用JComboBox。您的编译器应该给您一个警告或错误,因为您不使用任何参数。你可以读到它,这里。我建议你这么做:

代码语言:javascript
复制
public JComboBox<String> colorList;

代码语言:javascript
复制
colorList = new JComboBox<>(colorName);

您还应该限制DateFormat和Date的范围。现在,它们是整个类的静态变量,但您只在一个函数中使用它们。我建议只在public ()函数中声明您的DateFormat和Date,而不是整个类。这仍然适用于您的paintComponent(),因为整个类仍然可以使用stringDate。

您可以做的另一件事是将时钟从一个时钟对象更改为一个JFrame,这将减少在线开销而不会影响性能。

而不是这样:

代码语言:javascript
复制
public class Clock extends JFrame {

    public Clock () {
        setContentPane(new ScreenSaver());
    }

    public static void main(String[] args) {

        Clock clock = new Clock();
        //the rest of your code

你只需要这样:

代码语言:javascript
复制
public class Clock{

    public static void main(String[] args) {

        JFrame clock = new JFrame();
        clock.getContentPane().add(new ScreenSaver());
        //the rest of your code

两者都有相同的效果,做你想做的事。

仅仅是乱搞一下,就好像你不需要在你的时钟类中使用这一行:

代码语言:javascript
复制
clock.setBackground(Color.BLACK);

我用和不带那条线来测试它,它看起来并没有什么不同。我猜,与您在ScreenSaver中拥有的所有其他ScreenSaver一样,它是不必要的。

这只是一件挑剔的事情,但几乎每次设置某物的背景色时,都使用setBackground(Color.BLACK),除了一次设置面板的背景时。只是为了一致性(除非(0,0,0,0)与Color.BLACK不同,而且我没有看到差别),我每次都会使用相同的。

票数 0
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/149430

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档