我正在尝试以这种方式制作数字时钟:
如图1所示,我希望时钟反映。
我尝试过: 我通过旋转字符串和使用子字符串尝试使用java(Graphics2D)g,但我遇到了这个问题:
我的代码:
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.Calendar;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class DigitalClock extends JPanel {
JLabel label = new JLabel();
int c = 0;
Font font = null;
JFrame frame = new JFrame();
//Constructor
public DigitalClock(){
frame.setSize(700,500);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(this);
frame.setVisible(true);
DigitalThread();
}
//Paint Method
public void paintComponent(Graphics g){
Graphics2D g2d = (Graphics2D)g;
//The background
g2d.setColor(Color.BLACK);
g2d.fillRect(0,0,500,100);
//Show Time
g2d.setColor(Color.WHITE);
g2d.setFont(new Font(g.getFont().toString(),10,15));
g2d.drawString(timeNow(),100, 25);
//Show time Reflected
g2d.rotate(Math.PI,100,25);
g2d.drawString(timeNowRot(timeNow()),45, 20);
}
//Change time Value with this Thread
public void DigitalThread(){
new Thread(new Runnable(){
public void run(){
boolean flag=true;
while(flag==true){
try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}
repaint();
}
}}).start();
}
//Return time
public String timeNow(){
return zero(Calendar.getInstance().get(Calendar.HOUR_OF_DAY))+":"+
zero(Calendar.getInstance().get(Calendar.MINUTE))+":"+zero(Calendar.getInstance().get(Calendar.SECOND));
}
//Return time reflected
public String timeNowRot(String time){
return time.substring(time.length()-1,time.length())+time.substring(time.length()-2,time.length()-1)+":";
}
//Add Zero if value<10
public String zero(int num){
if(num<10) return "0"+num;
else return ""+num;
}
}
我可以通过使用java 2d实现这一点吗?是否有一种方法可以垂直再次旋转字符串,所以我没有这个问题,谢谢..
答案 0 :(得分:1)
使用乘以x和y坐标的scale(x, y)。
g2d.scale(1.0, -1.0);
g2.drawString(....);
g2d.scale(1.0, -1.0); // Undo
这会进行y轴反转的变换。
您还可以使用shear
进行并列外观。
g2d.scale(-1.0, 1.0);
会向后绘制字符串。可与旋转结合使用。
这完全取决于任何轮换和顺序的使用,如何缩放。没有旋转:将y缩放-1:
good
ƃooq
答案 1 :(得分:0)
您的链接显示钟面及其反射。如果这就是你想要做的事情那么就是这样。
将钟面绘制到图像中,而不是直接指向Component。然后使用drawImage将结果图像渲染到组件中两次 - 一次是正常方式,一旦变换,它就会反射出来。
这会占用更多的内存,但只能暂时使用,这样可以省去两次涂装的时间。
如果您只想绘制反射的钟面,请在图形中设置图像转换属性以获得反射。
我会将细节作为练习留给读者。
答案 2 :(得分:0)
实际上,基于所有人的回答,我找到了答案:
这很有讽刺意味但是在问题之后的第二天我在大学上了一堂课......
有关扩展的信息:
g2d.scale(1,-1); /*scale by y axes(Flipping vertical
|
flip here (scale(-1,1) ) | here it was
_ _ _ _ _|_ _ _ _ _
|
flip here (scale(-1,-1) ) | fliped here( scale(1,-1) )
|
*/
g2d.drawString(timeNow(),10,-27);
我还添加了更多效果,因此时钟更加逼真,如:
g2d.setPaint(new GradientPaint(0,-15,color,0,-50,Color.BLACK));