我只是在寻求一些反馈:
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();
}
}二等舱:
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();
}
}发布于 2016-12-10 06:19:48
我猜您发布的ScreenSaver.java代码缺少一些导入,所以我建议将它们添加进来,这样我们就可以看到它们了。我也不知道"DIGITALDREAMFAT.ttf“是什么,但是我不得不把整个部分删掉,这样代码才能正常工作,所以我想我错过了一些很酷的字体。然后是声明和初始化但不再使用的JButton按钮。不确定这是否只是一个你还没有添加的特性,或者只是在里面,而被遗忘了。您还可以在时钟类中导入JComboBox和JPanel,但是由于该类不使用它们,但ScreenSaver使用它们,所以我建议将这两行移到该类中。
关于这个程序,我注意到的第一件事是,既然你把你的画框设置为未装饰的,它会使你更难关闭,而且我还没有找到移动它的方法。我不确定你是否只打算在左上角关闭它,但如果不是,或者如果你打算让其他人使用它,我建议编辑它。
Eclipse正在用您的代码大喊大叫的一件事是使用JComboBox。您的编译器应该给您一个警告或错误,因为您不使用任何参数。你可以读到它,这里。我建议你这么做:
public JComboBox<String> colorList;和
colorList = new JComboBox<>(colorName);您还应该限制DateFormat和Date的范围。现在,它们是整个类的静态变量,但您只在一个函数中使用它们。我建议只在public ()函数中声明您的DateFormat和Date,而不是整个类。这仍然适用于您的paintComponent(),因为整个类仍然可以使用stringDate。
您可以做的另一件事是将时钟从一个时钟对象更改为一个JFrame,这将减少在线开销而不会影响性能。
而不是这样:
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你只需要这样:
public class Clock{
public static void main(String[] args) {
JFrame clock = new JFrame();
clock.getContentPane().add(new ScreenSaver());
//the rest of your code两者都有相同的效果,做你想做的事。
仅仅是乱搞一下,就好像你不需要在你的时钟类中使用这一行:
clock.setBackground(Color.BLACK);我用和不带那条线来测试它,它看起来并没有什么不同。我猜,与您在ScreenSaver中拥有的所有其他ScreenSaver一样,它是不必要的。
这只是一件挑剔的事情,但几乎每次设置某物的背景色时,都使用setBackground(Color.BLACK),除了一次设置面板的背景时。只是为了一致性(除非(0,0,0,0)与Color.BLACK不同,而且我没有看到差别),我每次都会使用相同的。
https://codereview.stackexchange.com/questions/149430
复制相似问题