2012-12-03 25 views
2

解決: 感謝@MadProgrammer翻轉形狀(不是圖像)

我通過g2.scale(1, -1);感謝^^


我寫的程序,以顯示與鏡(垂直翻轉)數字時鐘

更換 g2.rotate(Math.toRadians(180.0));

這是我的代碼

import java.awt.*; 
    import java.awt.font.GlyphVector; 
    import javax.swing.*; 
    import java.util.*; 

    public class DigitalClock extends JFrame implements Runnable { 
     /** 
     * @author HASSAN 
     */ 
     Thread runner; // declare global objects 
     Font clockFont; 
     Shape mirror; 

     public DigitalClock() { 
      super("Digital Clock - Hassan Sharaf 12MCMB33"); 
      setSize(600, 500); 
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      setVisible(true); 
      setResizable(false); // create window 
      setLocationRelativeTo(null); 
      clockFont = new Font("digifacewide", Font.BOLD, 100); // create font 

      Container contentArea = getContentPane(); 
      ClockPanel timeDisplay = new ClockPanel(); 
      contentArea.add(timeDisplay); // add components 
      setContentPane(contentArea); 
      start(); // start thread running 
     } 

     public class ClockPanel extends JPanel { 

      public void paintComponent(Graphics painter) { 
       // super.paintComponent(painter); 
       Graphics2D g2 = (Graphics2D) painter; 
       g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
       g2.setFont(clockFont); // create clock components 
       g2.setColor(Color.black); 
       g2.drawString(timeNow(), 20, 140); 
       GlyphVector v = clockFont.createGlyphVector(getFontMetrics(clockFont).getFontRenderContext(), timeNow()); 
       mirror = v.getOutline(); 
       g2.translate(553, 160); 
       g2.rotate(Math.toRadians(180.0)); 
       g2.fill(mirror); 
         g2.draw(mirror); 

      } 
     } 

     // get current time 
     public String timeNow() { 
      Calendar now = Calendar.getInstance(); 
      int hrs = now.get(Calendar.HOUR_OF_DAY); 
      int min = now.get(Calendar.MINUTE); 
      int sec = now.get(Calendar.SECOND); 
      String time = zero(hrs) + ":" + zero(min) + ":" + zero(sec); 
      return time; 
     } 

     public String zero(int num) { 
      String number = (num < 10) ? ("0" + num) : ("" + num); 
      return number; // Add leading zero if needed 
     } 

     public void start() { 
      if (runner == null) { 
       runner = new Thread(this); 
      } 
      runner.start(); 
      // method to start thread 
     } 

     public void run() { 
      while (runner == Thread.currentThread()) { 
       repaint(); 
       // define thread task 
       try { 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        System.out.println("Thread failed"); 
       } 
      } 
     } 

     // create main method 
     public static void main(String[] args) { 
      DigitalClock clock = new DigitalClock(); 
     } 
    } 

問題:我用rotate()方法,但實際上我不想旋轉我想要的時鐘翻轉,垂直 問:我如何翻轉形狀(不是圖像)

回答

3

你有這取決於你想要達到什麼樣的地段-O-選擇...

你可以...

  • 創建從外形對象PathIterator,用AffineTransform符合旋轉要求。這將需要您創建一個新路徑,將PathIterator添加到它以便您可以繪製它...或
  • 創建一個新的Path2D使用形狀作爲新路徑的基礎旋轉並將AffineTransform傳遞給它。這是幾乎一樣的第一選擇,但需要較少的代碼...

下面是一個例子....

public class SpinningTriangle { 

    public static void main(String[] args) { 
     new SpinningTriangle(); 
    } 

    public SpinningTriangle() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new SpinPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class SpinPane extends JPanel { 

     private Triangle triangle; 
     private float angle = 0; 

     public SpinPane() { 
      triangle = new Triangle(50, 100); 
      Timer timer = new Timer(40, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        angle += 2; 
        repaint(); 
       } 
      }); 
      timer.setRepeats(true); 
      timer.setCoalesce(true); 
      timer.start(); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(110, 110); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      Rectangle bounds = triangle.getBounds(); 
//   PathIterator pi = triangle.getPathIterator(AffineTransform.getRotateInstance(Math.toRadians(angle), bounds.width/2, bounds.height/2)); 
//   Path2D path = new Path2D.Float(); 
//   path.append(pi, true); 
      Path2D path = new Path2D.Float(triangle, AffineTransform.getRotateInstance(Math.toRadians(angle), bounds.width/2, bounds.height/2)); 
      int x = (getWidth() - bounds.width)/2; 
      int y = (getHeight() - bounds.height)/2; 
      g2d.translate(x, y); 
      g2d.setColor(Color.RED); 
      g2d.fill(path); 
      g2d.setColor(Color.YELLOW); 
      g2d.draw(path); 
      g2d.dispose(); 
     } 

    } 

    public class Triangle extends Path2D.Float { 

     public Triangle(int width, int height) { 

      moveTo(width/2f, 0); 
      lineTo(width, height); 
      lineTo(0, height); 
      closePath(); 

     } 

    } 

} 

修訂

如果你想do是「鏡像」形狀,可以通過-1來縮放軸...

public class SpinningTriangle { 

    public static void main(String[] args) { 
     new SpinningTriangle(); 
    } 

    public SpinningTriangle() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new FlipPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class FlipPane extends JPanel { 

     private Triangle triangle; 
     private boolean flip; 

     public FlipPane() { 
      triangle = new Triangle(50, 100); 
      Timer timer = new Timer(500, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        flip = !flip; 
        repaint(); 
       } 
      }); 
      timer.setRepeats(true); 
      timer.setCoalesce(true); 
      timer.start(); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(110, 110); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      Rectangle bounds = triangle.getBounds(); 

      double scale = 1 * (flip ? -1 : 1); 

      Path2D path = new Path2D.Float(triangle, AffineTransform.getScaleInstance(scale, scale)); 
      int x = (getWidth() - bounds.width)/2; 
      int y = (getHeight() - bounds.height)/2; 
      if (flip) { 

       y += bounds.height; 
       x += bounds.width; 

      } 
      g2d.translate(x, y); 
      g2d.setColor(Color.RED); 
      g2d.fill(path); 
      g2d.setColor(Color.YELLOW); 
      g2d.draw(path); 
      g2d.dispose(); 
     } 

    } 

    public class Triangle extends Path2D.Float { 

     public Triangle(int width, int height) { 

      moveTo(width/2f, 0); 
      lineTo(width, height); 
      lineTo(0, height); 
      closePath(); 

     } 

    } 

} 
+2

類似的方法用於繪製笛卡兒座標[這裏](http://stackoverflow.com/a/9373195/230513)。 – trashgod