2016-11-12 12 views
0

私のコードが実行され、コンパイルされます。これは、JFrame内の任意の場所にホバリングしている場合に機能しますが、画面に出るときには時々動作し、そうであれば、RGB値は白、時には灰色で表示されます。私はボックスの外に出るたびになぜそれが動作しないのかわかりませんし、フレームの外でRGB値がすべて得られないのはなぜですか?誰かが見てみることができますか?私はホバリング時に箱の外側に白を与えるスクリーンショットを添付しました。ありがとう!イベントがSwingコンポーネント上に生成されたときRGB値画面下のどこでもカーソルがあります

enter image description here

import java.awt.*; 
import java.awt.event.*; 
import java.awt.image.BufferedImage; 
import java.io.*; 
import java.net.*; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.imageio.ImageIO; 
import javax.swing.*; 
import javax.swing.border.EmptyBorder; 

public class RGBValue { 

public static void main(String[] args) throws Exception { 

    new RGBValue(); 
} 

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

      JFrame frame = new JFrame("Get the RGB"); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setLayout(new BorderLayout()); 
      try { 
       frame.add(new TestPane()); 
      } catch (Exception ex) { 
       Logger.getLogger(RGBValue.class.getName()).log(Level.SEVERE, null, ex); 
      } 
      frame.pack(); 
      frame.setLocationRelativeTo(null); 
      frame.setVisible(true);       
     }  
    }); 
} 

public class TestPane extends JPanel { 

    private BufferedImage img; 
    private JLabel label; 
    private JPanel fields; 
    private JTextField red; 
    private JTextField green; 
    private JTextField blue; 
    // private JTextArea RGB; 

    PointerInfo info = MouseInfo.getPointerInfo(); 
    Point point = info.getLocation();  
    Robot robot = new Robot();  

    public TestPane() throws Exception { 
     setLayout(new GridBagLayout()); 
     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.gridwidth = GridBagConstraints.REMAINDER; 
     label = new JLabel(); 
     try { 
      URL url = new URL("https://c6.staticflickr.com/2/1520/24330829813_944c817720_b.jpg"); 
      img = ImageIO.read(url); 
      label.setIcon(new ImageIcon(img)); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 

     add(label, gbc); 

     fields = new JPanel(); 
     fields.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     red = new JTextField(3); 
     green = new JTextField(3); 
     blue = new JTextField(3); 
     fields.add(red); 
     fields.add(green); 
     fields.add(blue); 
     add(fields, gbc); 

     robot.delay(2000); 

     label.addMouseMotionListener(new MouseAdapter() { 
      // @Override 
      public void mouseMoved(MouseEvent e) { 

     // while (true) { 
       //int packedInt = img.getRGB(e.getX(), e.getY()); 
       // Color color = new Color(packedInt, true); 
       point = MouseInfo.getPointerInfo().getLocation(); 
       Color color = robot.getPixelColor((int)point.getX(), (int)point.getY()); 
       // RGB.setText(color.getBlue() + color.getRed() + color.getGreen()); 
       red.setText(Integer.toString(color.getRed())); 
       green.setText(Integer.toString(color.getGreen())); 
       blue.setText(Integer.toString(color.getBlue())); 
       fields.setBackground(color); 
      } 
     }); 

    } 

} 

} 

答えて

1

スイングのみマウスイベントを受け取ります。

画面の任意の場所でイベントを受信したい場合は、フレームが画面全体をカバーする必要があります。

あなたは使ってフレームを最大化することができます:

frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 

をフレームを可視化する前に。

もちろん、フレームは背景をカバーするので、デスクトップは表示されないので、フレームを透明にする必要があります。詳細と例については、How to Create Translucent FramesのSwingチュートリアルのセクションを参照してください。

+0

これは良いアイデアですが、画面全体に広がっていますが、時にはRGB値だけを取ります。 – Millie

+1

@Millie、 'robot.delay(2000);' - なぜあなたは遅延がありますか? MouseEventが生成されると、ピクセルが取得されます。したがって、更新頻度はマウスの動きによって制御されます。 – camickr

+0

これを解決しても問題は解決しません。私はまだどこが間違っているのか分からない。 – Millie

関連する問題