2016-03-27 26 views
0

画面上の特定のピクセルの色を探したいと思います。 JFrameの背景は白(RGB(255,255,255))に設定されています。 Graphicsオブジェクトは黒(RGB(0、0、0))に設定されています。画面上のピクセルの色を取得できません

私は長方形を描きます。 (100,100)は、矩形の輪郭上の画素である。

描画する前に、ピクセルの色は(100,100)になり、RGB(255,255,255)になります。描画後、ピクセルの色は(100,100)になり、RGB(255,255,255)になります。それはRGB(0、0、0)ではないでしょうか?また、出力は2回繰り返されます。どうして?

コード:

public void paintComponent(Graphics g){ 
     Robot robot = null; 
     try { 
      robot = new Robot(); 
     } catch (AWTException e) { 
      e.printStackTrace(); 
     } 
     Color pixelColour; 
     g.setColor(Color.black); 
     pixelColour = robot.getPixelColor(100, 100); 
     System.out.println("Pixel colour at (100, 100) before drawing: " + pixelColour.toString()); 
     g.drawLine(100, 100, 100, 200); 
     g.drawLine(100, 200, 300, 200); 
     g.drawLine(300, 200, 300, 100); 
     g.drawLine(300, 100, 100, 100); 
     pixelColour = robot.getPixelColor(100, 100); 
     System.out.println("Pixel colour at (100, 100) after drawing: " + pixelColour.toString()); 
    } 
    public static void main(String[] args) 
    { 
     PixelColour pc = new PixelColour(); 
     JFrame frame = new JFrame("Pixel colour"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(pc); 
     frame.setSize(500,500); 
     frame.setBackground(Color.white); 
     frame.setVisible(true); 
    } 
} 

出力:

Pixel colour at (100, 100) before drawing: java.awt.Color[r=255,g=255,b=255] 
Pixel colour at (100, 100) after drawing: java.awt.Color[r=255,g=255,b=255] 
Pixel colour at (100, 100) before drawing: java.awt.Color[r=255,g=255,b=255] 
Pixel colour at (100, 100) after drawing: java.awt.Color[r=255,g=255,b=255] 

答えて

0

ロボットは、特定の画面でpixelcolor座標グラブ。原点を画面の左上に表示します。あなたの窓については知らない。親コンポーネントを基準にピクセルを描画します。 PixelColorコンポーネントの起点は、JFrameの表示領域の左上隅です。画面では、SwingUtilitiesを使用することができ画素の座標を取得するためには:

SwingUtilities.convertPointToScreen(point, component); 

https://docs.oracle.com/javase/7/docs/api/javax/swing/SwingUtilities.html#convertPointToScreen(java.awt.Point,%20java.awt.Component)

Point screenLocation = SwingUtilities.convertPointToScreen(new Point(100, 100), this); 
pixelColour = robot.getPixelColor(screenLocation.x, screenLocation.y); 

ロボットは、あなたが、現時点では白与えた理由は、おそらく単なる偶然です。

また、コードが2回実行される理由は、Swingがそのコードを2回呼び出すためです。スウィングがコンポーネントの再描画が必要であると思っている場合、たとえばサイズを変更するとpaintComponentが呼び出されます。あなたはそれについて何もすることはできません。

関連する問題