反映java

时间:2015-06-03 14:57:11

标签: java graphics

我正在尝试以这种方式制作数字时钟:

如图1所示,我希望时钟反映

enter image description here

我尝试过: 我通过旋转字符串和使用子字符串尝试使用java(Graphics2D)g,但我遇到了这个问题:

enter image description here

我的代码:

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实现这一点吗?是否有一种方法可以垂直再次旋转字符串,所以我没有这个问题,谢谢..

3 个答案:

答案 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));