2017-03-25 28 views
0

JPanelpaintComponentメソッドでは、Graphicsを使用してイメージを描画していますが、水平方向に反転する必要があり、その方法で反転を行う必要があります。これどうやってするの?paintComponentで水平方向にフリップする方法は? java

RoosterBは、Roosterの子であり、JPanelの子です。

public class RoosterB extends Rooster 
{ 
    public RoosterB() 
    { 

    } 

    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 

     // Red stuff 
     g.setColor(new Color(56, 118, 29)); 
     g.drawLine(6, 0, 11, 0); 
     g.drawLine(9, 1, 13, 1); 
     g.drawLine(8, 2, 9, 2); 
     g.drawLine(12, 2, 13, 2); 
     g.drawLine(12, 5, 12, 7); 
     g.drawLine(13, 5, 13, 9); 
     g.drawLine(14, 4, 14, 8); 

     g.drawLine(5, 23, 5, 23); 
     g.drawLine(8, 24, 8, 24); 

     // Beak 
     g.setColor(new Color(241, 194, 50)); 
     g.drawLine(13, 5, 14, 5); 
     g.drawLine(13, 7, 15, 7); 

     // Eye 
     g.setColor(Color.BLACK); 
     g.drawLine(10, 3, 10, 4); 
     g.setColor(new Color(147,196,125)); 
     g.drawLine(11, 3, 11, 4); 

     // Wing 
     g.setColor(new Color(102, 102, 102)); 
     g.drawLine(0, 12, 0, 13); 
     g.drawLine(1, 12, 1, 15); 
     g.drawLine(2, 13, 2, 16); 
     g.drawLine(3, 13, 9, 13); 
     g.drawLine(3, 14, 8, 14); 
     g.drawLine(3, 15, 7, 15); 
     g.drawLine(7, 12, 8, 12); 
     g.drawLine(8, 11, 8, 11); 
     g.drawLine(10, 11, 10, 12); 
     g.setColor(Color.BLACK); 
     g.drawLine(3, 16, 6, 16); 
     g.drawLine(8, 15, 8, 15); 
     g.drawLine(9, 14, 9, 14); 
     g.drawLine(10, 13, 10, 13); 

     // Feet 
     g.setColor(new Color(147,196,125)); 
     g.drawLine(5, 24, 5, 25); 
     g.drawLine(8, 25, 8, 25); 
     g.setColor(new Color(56, 118, 29)); 
     g.drawLine(4, 26, 6, 26); 
     g.drawLine(5, 27, 5, 27); 
     g.drawLine(8, 26, 8, 28); 
     g.drawLine(7, 27, 9, 27); 
    } 
} 
+0

あなたはあなたが持っている 'paintComponent'で[MCVE]を投稿できますか? – c0der

+0

gimpなどのプログラムを使用して画像を反転し、どちらか一方を読み込みます。 – maraca

+0

これは@ c0derにとってより役に立ちますか? – Lowenstein

答えて

0

私は、これはMCVEに近いと思う:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.geom.Line2D; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.WindowConstants; 

public class APanel extends JPanel{ 

    private Line2D line; 

    APanel(){ 

     setPreferredSize(new Dimension(600,400)); 
     line = new Line2D.Double(50,100, 500,250); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 

     super.paintComponent(g); 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.setPaint(Color.BLACK); 
     g2d.draw(line); 
    } 

    public static void main(String[] args){ 

     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); 

     JPanel panel = new APanel(); 
     frame.getContentPane().add(panel); 

     frame.pack(); 
     frame.setVisible(true); 
    } 
} 

はありませんか?

public class APanel extends JPanel{ 

    double x1 = 50, y1 = 100, x2 = 500, y2 = 250; //line ends 
    double fx1, fx2, fy1, fy2; // fliped line ends 
    boolean flip = false; 

    APanel(){ 
     setPreferredSize(new Dimension(600,400)); 
     JButton flipBtn = new JButton("Flip"); 
     flipBtn.setPreferredSize(new Dimension(100,30)); 
     flipBtn.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       flip = ! flip; 
       repaint(); 
      } 
     }); 
     add(flipBtn); 
     calculteFlipedLine(); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 

     super.paintComponent(g); 

     Graphics2D g2d = (Graphics2D) g; 
     g2d.setPaint(Color.BLACK); 

     if(flip) { 
      g2d.draw(new Line2D.Double(x1, y1, x2, y2)); 
     } else { 
      g2d.draw(new Line2D.Double(fx1, fy1, fx2, fy2)); 
     } 
    } 

    public static void main(String[] args){ 

     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); 

     JPanel panel = new APanel(); 
     frame.getContentPane().add(panel); 

     frame.pack(); 
     frame.setVisible(true); 
    } 

    private void calculteFlipedLine() { 
     //the calculation here is for simplified 
     //horizontal flip. It may vary according to how you 
     //define flip 
     fx1 = x2; fy1 = y1; 
     fx2 = x1; fy2 = y2; 
    } 
} 
0
左右反転のために

left <-> right、あなたはx座標を変更している:それを使用して
は、質問と回答を簡素化します。一般的な方法は、ここx_axis

x_new = 2 * x_axis - x_old 

ある「フリップ」であることをx座標である「周り」。たとえば、互いに向き合う2つの鏡像を描画する場合は、x_axisを左または右に選択し、反転させてからもう一度2回描きます。

これをJavaで実行するには、すべての座標を配列に配置する必要があります。これは表示リストと呼ばれます。そして、ループでそれらを描く:

static struct MyLine { 
    int x0, y0, x1, y1; 
    Color color; 
    MyLine(int x0, int y0, int x1, int y1, Color color) { 
    this.x0 = x0; this.y0 = y0; this.x1 = x1; this.y1 = y1; 
    this.color = color; 
    } 
} 

static final Color MY_RED = new Color(56, 118, 29); 
static final Color MY_BEAK_COLOR = ... 

static final MyLine [] displayList = { 
    new MyLine(6, 0, 11, 0, MY_RED); 
    ... 
}; 

を今paintComponentに、またはフリップなしでレンダリング:

... 
if (flipped) { 
    int o = 2 * x_axis; 
    for (MyLine line : displayList) { 
    g.setColor(line.color); 
    g.drawLine(o - line.x0, line.y0, o - line.x1, line.y1); 
    } 
} else { 
    for (MyLine line : displayList) { 
    g.setColor(line.color); 
    g.drawLine(line.x0, line.y0, line.x1, line.y1); 
    } 
} 

flipが真である

は、あなたが、他の正常な反転した画像を得ることができます。両方が必要な場合は、 ifを削除してください。表示リストの1つの利点は、異なるバージョンで好きなだけイメージコンポーネントを何回も描画できることです。

関連する問題