# ColorReader, bei Fadenkreuz zeichnen mit repaint() flackern



## Gustl_Java (4. Jun 2010)

Hallo,

ich habe zur Übung einen ColorReader geschrieben (Anfänger in Java),
jetzt habe ich eine kleine Lupe mit 11x11 JPanels eingebaut bei denen ich mit dem My_Timer die jeweiligen Farben abfrage, was auch gut funktioniert.

In der Paint Methode zeichne ich das Fadenkreuz mit zwei Linien:
         g.drawLine( 32, 15,32,105  );
         g.drawLine( 0, 46,62,46 );
welche natürlich über die JPanels verlaufen sollen, dazu brauche ich in dem Timer die Methode repaint();, aber die angewand flackert das ganze programm so komisch. Habe es auch schon bei diesen JPanels mit setDoubleBuffered proiert, ohne erfolg. 

Viellicht kann mir einer einen Tipp geben wie ich dieses unschöne Flackern in den Griff bekomme.

Hier codeausschnitte: (Will wegen der Unübersichtlichkeit nicht den komplette code posten.)

```
....
ColorReader()
    {   try
        {   robot = new Robot();
        } catch (AWTException e)
        {   e.printStackTrace();
        }
        klick = false;
        
        this.setTitle("Color Reader");
        this.setLayout( new BorderLayout() );
        this.setUndecorated(true);
        
        //Lupe erstellen
        //Farbepanel
        Farbe = new JPanel();
        Farbe.setLayout( new GridLayout( 11, 11 ) );
        Farbe.setDoubleBuffered(true);
        
        lupe = new JPanel[11][];
        for(int i = 0; i < lupe.length; i++)
            lupe[i] = new JPanel[11];        

        for(int i = 0; i < lupe.length; i++) 
            for(int j = 0; j < lupe[i].length; j++)
            {	lupe[i][j] = new JPanel();
                lupe[i][j].setPreferredSize(new Dimension(5,5));
                lupe[i][j].setBackground(Color.black);
                lupe[i][j].setDoubleBuffered(true);
                Farbe.add(lupe[i][j]);
            }
....
....
  public void paint(Graphics g)
    { 	 super.paint(g);
         //Rand und Titelleiste Linien zeichnen
         Dimension size = new Dimension(this.getSize());
         g.drawLine(0, 15, (int)size.getWidth(), 15);
         g.drawLine(0, 0, 0, (int)size.getHeight());
         g.drawLine(0, 0, (int)size.getWidth(), 0);
         g.drawLine((int)size.getWidth()-1, 0, (int)size.getWidth()-1, (int)size.getHeight());
         g.drawLine(0, (int)size.getHeight()-1, (int)size.getWidth(), (int)size.getHeight()-1);
         //Fadenkreuz zeichnen
         g.drawLine( 32, 15,32,105  );
         g.drawLine( 0, 46,62,46 );
    }
....
....
 public class My_Timer extends TimerTask
    {   public void run()
        {   if(!klick)
            {
            PointerInfo pointerInfo = MouseInfo.getPointerInfo();
            Point point = pointerInfo.getLocation();
            
            if(robot != null)
            {   c = robot.getPixelColor((int)point.getX(),(int)point.getY());
            
            for(int i = 0; i < lupe.length; i++) 
                for(int j = 0; j < lupe[i].length; j++)
                {	
                    lupe[i][j].setBackground(robot.getPixelColor((int)point.getX()- 5 + j,(int)point.getY() - 5 + i));
                }

            tf_R.setText(String.valueOf( c.getRed() ));
            tf_G.setText(String.valueOf( c.getGreen() ));
            tf_B.setText(String.valueOf( c.getBlue() ));
            
            
            tf_hex.setText("#" + Integer.toHexString(c.getRed()).toUpperCase() + Integer.toHexString(c.getGreen()).toUpperCase() + Integer.toHexString(c.getBlue()).toUpperCase() );
            repaint();
            }
            }
        }
    }

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

Gruß


----------



## eRaaaa (4. Jun 2010)

Ohne den kompletten Code zu sehen wirds schwer. Eines kann man aber schon sagen, du sprichst von JPanels (also Swing) und überschreibst paint... überschreibe paintComponent eines JPanels o.ä.


----------



## Gustl_Java (4. Jun 2010)

Ich zeichne ja nicht nur in JPanels, es soll ja ein Fadenkreuz gezeichnet werden.

Hier der komplette Code:

```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.ImageIcon;
import javax.swing.border.*;
import java.util.*;
import java.lang.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;

public class ColorReader extends JFrame
{   public JLabel l_R;
    public JLabel l_G;
    public JLabel l_B;
    public JLabel l_hex;
    public JPanel p_right;
    public JPanel p_rgb;
    public JPanel p_hex;
    public JTextField tf_R;
    public JTextField tf_G;
    public JTextField tf_B;
    public JTextField tf_hex;
    public JPanel Farbe;
    public JPanel inhalt;

    public JPanel p_titelleiste;
    public JPanel p_exit;
    public JPanel p_titel;
    public JLabel l_exit;
    public JLabel l_titel;
    
    Point point = new Point();
    private Robot robot;
    boolean klick;
    Color c;
    
    JPanel[][] lupe;

    ColorReader()
    {   try
        {   robot = new Robot();
        } catch (AWTException e)
        {   e.printStackTrace();
        }
        klick = false;
        
        this.setTitle("Color Reader");
        this.setLayout( new BorderLayout() );
        this.setUndecorated(true);
        
        //Lupe erstellen
        //Farbepanel
        Farbe = new JPanel();
        Farbe.setLayout( new GridLayout( 11, 11 ) );
        Farbe.setDoubleBuffered(true);
        
        lupe = new JPanel[11][];
        for(int i = 0; i < lupe.length; i++)
            lupe[i] = new JPanel[11];        

        for(int i = 0; i < lupe.length; i++) 
            for(int j = 0; j < lupe[i].length; j++)
            {	lupe[i][j] = new JPanel();
                lupe[i][j].setPreferredSize(new Dimension(5,5));
                lupe[i][j].setBackground(Color.black);
                lupe[i][j].setDoubleBuffered(true);
                Farbe.add(lupe[i][j]);
            }
        
        
        //JLabel & JPanel Titelleiste
        l_exit = new JLabel(new ImageIcon("img//close.png"));
        p_exit = new JPanel();
        p_exit.setLayout( new FlowLayout( FlowLayout.RIGHT, 0, 0) );
        l_exit.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent evt) {
                System.exit(0);
            }
        });
        p_exit.addMouseListener(new titelklick());
        p_exit.addMouseMotionListener(new titelmove());

        p_exit.setBackground(Color.WHITE);
        p_exit.add(l_exit);
        
        l_titel = new JLabel("Color Reader 2.0");
        p_titel = new JPanel();
        p_titel.setLayout( new FlowLayout( FlowLayout.LEFT, 3, 0) );
        p_titel.setBackground(Color.WHITE);
        p_titel.addMouseListener(new titelklick());
        p_titel.addMouseMotionListener(new titelmove());

        p_titel.add(l_titel);
        
        p_titelleiste = new JPanel();
        p_titelleiste.setLayout( new GridLayout( 1, 2 ) );
        p_titelleiste.add(p_titel);
        p_titelleiste.add(p_exit);
        
        //JLabels & JTextFields RGB
        l_R  = new JLabel("R:");
        l_R.setForeground(Color.WHITE);
        tf_R = new JTextField("R",2);
        tf_R.setBackground(new Color(91,91,91));
        tf_R.setForeground(Color.WHITE);
        tf_R.setEditable(false);
        tf_R.addKeyListener(new Tastatur());
        
        l_G  = new JLabel("G:");
        l_G.setForeground(Color.WHITE);
        tf_G = new JTextField("G",2);
        tf_G.setBackground(new Color(91,91,91));
        tf_G.setForeground(Color.WHITE);
        tf_G.setEditable(false);
        tf_G.addKeyListener(new Tastatur());
        
        l_B  = new JLabel("B:");
        l_B.setForeground(Color.WHITE);
        tf_B = new JTextField("B",2);
        tf_B.setBackground(new Color(91,91,91));
        tf_B.setForeground(Color.WHITE);
        tf_B.setEditable(false);
        tf_B.addKeyListener(new Tastatur());
        
        //JLabel & TextField Hexwert
        l_hex  = new JLabel("Hex-Wert:");
        l_hex.setForeground(Color.WHITE);
        tf_hex = new JTextField("HEX",6);
        tf_hex.setBackground(new Color(91,91,91));
        tf_hex.setForeground(Color.WHITE);
        tf_hex.setEditable(false);
        tf_hex.addKeyListener(new Tastatur());
        
    
        //Anordnung der Komponenten durch Panels
        p_rgb   = new JPanel();
        p_rgb.setLayout( new FlowLayout( FlowLayout.LEFT , 5 , 3 ) );
        p_rgb.setBackground(new Color(91,91,91));
        p_rgb.add(l_R);
        p_rgb.add(tf_R);
        p_rgb.add(l_G);
        p_rgb.add(tf_G);
        p_rgb.add(l_B);
        p_rgb.add(tf_B);
        
        p_hex   = new JPanel();
        p_hex.setLayout( new FlowLayout( FlowLayout.LEFT , 7 , 3 ) );
        p_hex.setBackground(new Color(91,91,91));
        p_hex.add(l_hex);
        p_hex.add(tf_hex);
        
        p_right = new JPanel();
        p_right.setLayout( new GridLayout( 2, 1) );
        p_right.setBackground(new Color(91,91,91));
        p_right.add(p_rgb);
        p_right.add(p_hex);
        
        //Einstellungen vom Frame
        inhalt = new JPanel();
        inhalt.setLayout( new FlowLayout( FlowLayout.LEFT , 5 , 3 ) );
        inhalt.setBackground(new Color(91,91,91));
        inhalt.add(Farbe);
        inhalt.add(p_right);
        
        this.add( "North" ,p_titelleiste);
        this.add( "South" ,inhalt);
        
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.pack();
        this.addKeyListener(new Tastatur());
        this.setLocation( 200 , 200 );
        this.setVisible( true );
        this.setAlwaysOnTop( true );

        java.util.Timer timer = new java.util.Timer();
        timer.schedule  ( new My_Timer(), 1, 1 );
    }
    
    public void paint(Graphics g)
    { 	 super.paint(g);
         //Rand und Titelleiste Linien zeichnen
         Dimension size = new Dimension(this.getSize());
         g.drawLine(0, 15, (int)size.getWidth(), 15);
         g.drawLine(0, 0, 0, (int)size.getHeight());
         g.drawLine(0, 0, (int)size.getWidth(), 0);
         g.drawLine((int)size.getWidth()-1, 0, (int)size.getWidth()-1, (int)size.getHeight());
         g.drawLine(0, (int)size.getHeight()-1, (int)size.getWidth(), (int)size.getHeight()-1);
         //Fadenkreuz zeichnen
         g.drawLine( 32, 15,32,105  );
         g.drawLine( 0, 46,62,46 );
    }

    //Verschieben des Fensters realisieren
    class titelklick extends MouseAdapter
    {   public void mousePressed(MouseEvent e)
        {   if(!e.isMetaDown())
            {   point.x = e.getX();
                point.y = e.getY();
            }
        }
    }
    class titelmove extends MouseMotionAdapter
    {   public void mouseDragged(MouseEvent e)
        {   if(!e.isMetaDown())
            {   Point p = getLocation();
                setLocation(p.x + e.getX() - point.x,
                p.y + e.getY() - point.y);
            }
        }
    }
    
    //Bei Taste H (hold) wird die abfrage gestoppt und der hex Wert in die Zwischenablage gespeichert
    class Tastatur implements KeyListener
    {   public void keyPressed(KeyEvent e)
        { if(e.getKeyCode() == KeyEvent.VK_H)
           if(klick)
              klick = false;
            else
           {  klick = true;
              Clipboard systemZwischenablage = Toolkit.getDefaultToolkit().getSystemClipboard();
              StringSelection inhalt = new StringSelection(Integer.toHexString(c.getRed()).toUpperCase() + Integer.toHexString(c.getGreen()).toUpperCase() + Integer.toHexString(c.getBlue()).toUpperCase());
              systemZwischenablage.setContents( inhalt, null );
           }
        }
        public void keyReleased(KeyEvent e) {}
        public void keyTyped(KeyEvent e)    {}
    }
    
    //Der Timer der die Farben abfrägt
    public class My_Timer extends TimerTask
    {   public void run()
        {   if(!klick)
            {
            PointerInfo pointerInfo = MouseInfo.getPointerInfo();
            Point point = pointerInfo.getLocation();           
            if(robot != null)
            {   c = robot.getPixelColor((int)point.getX(),(int)point.getY());
            
            for(int i = 0; i < lupe.length; i++) 
                for(int j = 0; j < lupe[i].length; j++)
                {	
                    lupe[i][j].setBackground(robot.getPixelColor((int)point.getX()- 5 + j,(int)point.getY() - 5 + i));
                }
            tf_R.setText(String.valueOf( c.getRed() ));
            tf_G.setText(String.valueOf( c.getGreen() ));
            tf_B.setText(String.valueOf( c.getBlue() ));
                    
            tf_hex.setText("#" + Integer.toHexString(c.getRed()).toUpperCase() + Integer.toHexString(c.getGreen()).toUpperCase() + Integer.toHexString(c.getBlue()).toUpperCase() );
            repaint(0,15,100,100);
            }
            }
        }
    }

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

mit repaint(0,15,100,100); flackert es schon nicht mehr so stark, aber dennoch wollte ich einfach wissen ob es einen einfacheren Weg gibt.

Gruß


----------



## Marco13 (4. Jun 2010)

Habs GANZ kurz angeschaut und getestet: Das könnte damit zusammenhängen, dass der Timer seinen TimerTask zu beliebigen Zeitpunkten (und nicht auf dem Event-Dispatch-Thread) ausführt. NUR ZUM TESTEN hab' ich mal das, was der TimerTask in seinem run() macht, zusätzlich in ein

```
SwingUtilities.invokeLater(new Runnable()
{
    public void run()
    {
        ....
    }
});
```
eingewickelt, und das scheint(!) zu helfen. Du solltest statt des util.Timers lieber einen javax.swing.Timer verwenden, und das, was jetzt in der run() gemacht wird, in der actionPerformed des Swing-Timers machen, das könnte schon das Problem lösen.


----------



## Gustl_Java (4. Jun 2010)

Ok, danke, werde ich probieren...

Aber jetzt habe ich ein anderes Problem.
Und zwar ging das ganz in der Arbeit bei xp sehr flüssig, also das einzelne farbpixel abtasten und dann in den JPanel array anpassen (zeile 242) ging "zeitgleich", aber nun daheim wenn ich den selben quellcode wie in der Arbeit starte dauert es ewig bis sich das array (farben) den cursor anpassen... 
Kann mir wer sagen woran das liegen könnte?

Gruß


----------



## Marco13 (5. Jun 2010)

Vielleicht weil der Rechner scheiß langsam ist? 

Mal im ernst: Das mit JPanels in einem GridLayout anzuzeigen ist schon... ... ... ... interessant. Dort einfach selbst das Farbraster in ein eigenes JPanel zu malen, oder vielleicht ein Image zu nehmen, und das in der passenden Größe zu malen wäre vielleicht eine Alternative....


----------



## Gustl_Java (6. Jun 2010)

Ne, mein Rechner ist eigentlich besser als der in der Arbeit...

Deswegen frag ich mich ja warum es so langsam bei mir daheim geht.

Ja, das mit dem zeichnen in einem JPanel klingt logisch, aber ich weiß leider nicht wie ich da angreifen sollte...

bin leider noch anfänger, und dein ratschlag mit dem timer habe ich auch nicht hinbekommen... 

Gruß


----------



## Gustl_Java (6. Jun 2010)

Anscheinend liegt das an windows7, weil auf meinen laptop mit xp funktioniert es wieder einwandfrei.
Kann es sein das da bei windwos7 das ganze "gebremst" wird? 
Finde das schon sehr komisch...


----------



## Marco13 (6. Jun 2010)

Für das Zeichnen eines Gitters GROB

```
class GridPanel extends JPanel
{
    private int w = 10;
    private int h = 10;
    private int colors[][] = new int[w][h];

    public void setColor(int x, int y, int color)
    {
        colors[x][y] = color;
    }

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        int dx = getWidth() / w;
        int dy = getHeight() / h;
        for (int x=0; x<w; x++) 
        {
            for (int y=0; y<h; y++) 
            {
                g.setColor(new Color(colors[x][y]));
                g.fillRect(x*dx, y*dy, dx, dy);
            }
        }
    }
}
```
Nur so vom Ansatz her...

Zum Timer... poste evtl. dann nochmal den aktuellen Code.


----------



## Gustl_Java (6. Jun 2010)

Hey, klasse danke.
Wenn man sich es anschaut sieht alles einfach aus, aber selbst drauf kommen. 
Habe jetzt ne Klasse für das Panel der Lupe geschrieben und zeichne jetzt die kleinen rechtecke ein, also fillrect. funktioniert auch super.

Aber eben auch noch nicht auf Windows7, was mich sehr wundert... Weiß da keiner rat?

Zum Thema Timer:
ich habe jetzt class My_Timer ersetzt durch:

```
//Der Timer der die Farben abfrägt
     SwingUtilities.invokeLater(new Runnable()
     {   public void run()
         {   if(!klick)
             {   PointerInfo pointerInfo = MouseInfo.getPointerInfo();
                 Point point = pointerInfo.getLocation();
                 if(robot != null)
                 {   c = robot.getPixelColor((int)point.getX(),(int)point.getY());
                     for(int i = 0; i < 11; i++)
                        for(int j = 0; j < 11; j++)
                           Lupe.setColor(j, i, (robot.getPixelColor((int)point.getX()- 5 + j,(int)point.getY() - 5 + i)).getRGB() );
                     Farbe_hex.setBackground(c);
                     tf_R.setText(String.valueOf( c.getRed() ));
                     tf_G.setText(String.valueOf( c.getGreen() ));
                     tf_B.setText(String.valueOf( c.getBlue() ));

                     tf_hex.setText("#" + Integer.toHexString(c.getRed()).toUpperCase() + Integer.toHexString(c.getGreen()).toUpperCase() + Integer.toHexString(c.getBlue()).toUpperCase() );
                     repaint(0,15,100,100);
                 }
             }
         }
     });
```

Ich weiß das man direkt in der Klasse, wo die Variablen defklariert werden soetwas nicht machen soll, deswegen kommen ja auch 10 Fehler, aber ich weiß auch leider nicht wie man das dann richtig einbindet!? :bahnhof:
Im Konstruktor ist es ja wohl auch falsch? Da wird es nur einmal aufgerufen?

Vielleicht möchte mir ja noch einer helfen.
Würde mich sehr freuen. 

Gruß


----------



## Marco13 (6. Jun 2010)

Den bisherigen Timer ersetzen durch

        javax.swing.Timer t = new javax.swing.Timer(1, new My_Timer());
        t.start();

und MyTimer dann so

```
public class My_Timer implements ActionListener
    {   public void actionPerformed(ActionEvent e)
        {   if(!klick)
            {
```

Wenn man über den String mit dem Farbcode geht, ist es aber normal, dass es flackert


----------



## Gustl_Java (7. Jun 2010)

Ja, das meinte ich auch nicht mit flackern, man sieht halt das er das Fenster immer wieder neu aufbaut und dadurch entsteht das flackern.

Aber ist jetzt mit dem swing timer weg, zumindest denke ich das so.  Danke.

Als nächstes möchte ich das, wenn der Benutzer mit der Maus das Frame betritt die farbcodes verscheinden und dort ein JLabel gesetzt wird, wo beschrieben wird was beim drücken der Taste H passiert...

Ich habe jetzt ein neues JLabel erstellt in dem der Text drin steht,
dann habe ich mir gedacht mit add und remove zu arbeiten.. etwa so:

```
class MouseMove extends MouseAdapter
    {   public void mouseEntered(MouseEvent e)
        {   inhalt.remove(p_right);
            inhalt.add(text_taste);
            repaint();
        }
    	public void mouseExited(MouseEvent e)
        {   inhalt.remove(text_taste);
            inhalt.add(p_right); 
            repaint();
        } 	
    }
```
aber leider zeigt er mir das JLabel nicht an... 

Hier der gesamte Code:

```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.ImageIcon;
import javax.swing.border.*;
import java.util.*;
import java.lang.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;

public class ColorReader extends JFrame
{   public JLabel l_R;
    public JLabel l_G;
    public JLabel l_B;
    public JLabel l_hex;
    public JPanel p_right;
    public JPanel p_rgb;
    public JPanel p_hex;
    public JLabel text_taste;
    public JTextField tf_R;
    public JTextField tf_G;
    public JTextField tf_B;
    public JTextField tf_hex;
    public JPanel Farbe_hex;
    public LupePanel Lupe;
    public JPanel inhalt;

    public JPanel p_titelleiste;
    public JPanel p_exit;
    public JPanel p_titel;
    public JLabel l_exit;
    public JLabel l_titel;
    
    Point point = new Point();
    private Robot robot;
    boolean klick;
    Color c;

    ColorReader()
    {   try
        {   robot = new Robot();
        } catch (AWTException e)
        {   e.printStackTrace();
        }
        klick = false;
        
        this.setTitle("Color Reader");
        this.setLayout( new BorderLayout() );
        this.setUndecorated(true);
        this.addMouseListener(new MouseMove());
        
        //Lupe erstellen
        //Farbepanel
        Lupe = new LupePanel();
        Lupe.setDoubleBuffered(true);



        //JLabel & JPanel Titelleiste
        l_exit = new JLabel(new ImageIcon("img//close.png"));
        p_exit = new JPanel();
        p_exit.setLayout( new FlowLayout( FlowLayout.RIGHT, 0, 0) );
        l_exit.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent evt) {
                System.exit(0);
            }
        });
        p_exit.addMouseListener(new titelklick());
        p_exit.addMouseMotionListener(new titelmove());

        p_exit.setBackground(Color.WHITE);
        p_exit.add(l_exit);
        
        l_titel = new JLabel("Color Reader 2.0");
        p_titel = new JPanel();
        p_titel.setLayout( new FlowLayout( FlowLayout.LEFT, 3, 0) );
        p_titel.setBackground(Color.WHITE);
        p_titel.addMouseListener(new titelklick());
        p_titel.addMouseMotionListener(new titelmove());

        p_titel.add(l_titel);
        
        p_titelleiste = new JPanel();
        p_titelleiste.setLayout( new GridLayout( 1, 2 ) );
        p_titelleiste.add(p_titel);
        p_titelleiste.add(p_exit);
        
        //JLabels & JTextFields RGB
        l_R  = new JLabel("R:");
        l_R.setFont( new Font( "", Font.PLAIN, 11 ) );
        l_R.setForeground(Color.WHITE);
        tf_R = new JTextField("R",3);
        tf_R.setFont( new Font( "", Font.PLAIN, 11 ) );
        tf_R.setBackground(new Color(91,91,91));
        tf_R.setForeground(Color.WHITE);
        tf_R.setEditable(false);
        tf_R.addKeyListener(new Tastatur());
        
        l_G  = new JLabel("G:");
        l_G.setFont( new Font( "", Font.PLAIN, 11 ) );
        l_G.setForeground(Color.WHITE);
        tf_G = new JTextField("G",3);
        tf_G.setFont( new Font( "", Font.PLAIN, 11 ) );
        tf_G.setBackground(new Color(91,91,91));
        tf_G.setForeground(Color.WHITE);
        tf_G.setEditable(false);
        tf_G.addKeyListener(new Tastatur());
        
        l_B  = new JLabel("B:");
        l_B.setFont( new Font( "", Font.PLAIN, 11 ) );
        l_B.setForeground(Color.WHITE);
        tf_B = new JTextField("B",3);
        tf_B.setFont( new Font( "", Font.PLAIN, 11 ) );
        tf_B.setBackground(new Color(91,91,91));
        tf_B.setForeground(Color.WHITE);
        tf_B.setEditable(false);
        tf_B.addKeyListener(new Tastatur());
        
        //JLabel & TextField Hexwert
        l_hex  = new JLabel("Hex-Wert:");
        l_hex.setFont( new Font( "", Font.PLAIN, 11 ) );
        l_hex.setForeground(Color.WHITE);
        tf_hex = new JTextField("HEX",7);
        tf_hex.setFont( new Font( "", Font.PLAIN, 11 ) );
        tf_hex.setBackground(new Color(91,91,91));
        tf_hex.setForeground(Color.WHITE);
        tf_hex.setEditable(false);
        tf_hex.addKeyListener(new Tastatur());
        Farbe_hex = new JPanel();
        Farbe_hex.setPreferredSize(new Dimension(19,19));
        
    
        //Anordnung der Komponenten durch Panels
        p_rgb   = new JPanel();
        p_rgb.setLayout( new FlowLayout( FlowLayout.LEFT , 3 , 2 ) );
        p_rgb.setBackground(new Color(91,91,91));
        p_rgb.add(l_R);
        p_rgb.add(tf_R);
        p_rgb.add(l_G);
        p_rgb.add(tf_G);
        p_rgb.add(l_B);
        p_rgb.add(tf_B);
        
        p_hex   = new JPanel();
        p_hex.setLayout( new FlowLayout( FlowLayout.LEFT , 2 , 2 ) );
        p_hex.setBackground(new Color(91,91,91));
        p_hex.add(l_hex);
        p_hex.add(tf_hex);
        p_hex.add(Farbe_hex);
        
        p_right = new JPanel();
        p_right.setLayout( new GridLayout( 2, 1) );
        p_right.setBackground(new Color(91,91,91));
        p_right.add(p_rgb);
        p_right.add(p_hex);
        
        text_taste = new JLabel("<html>Beim drücken der Taste 'H'</html>");
        text_taste.setFont( new Font( "", Font.PLAIN, 11 ) );
        text_taste.setForeground(Color.WHITE);
        
        //Einstellungen vom Frame
        inhalt = new JPanel();
        inhalt.setLayout( new FlowLayout( FlowLayout.LEFT , 5 , 3 ) );
        inhalt.setBackground(new Color(91,91,91));
        inhalt.add(Lupe);
        inhalt.add(p_right);
        
        this.add( "North" ,p_titelleiste);
        this.add( "South" ,inhalt);
        
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.pack();
        this.addKeyListener(new Tastatur());
        this.setLocation( 200 , 200 );
        this.setVisible( true );
        this.setAlwaysOnTop( true );

        javax.swing.Timer t = new javax.swing.Timer(1, new My_Timer());
        t.start();
    }
    
    class MouseMove extends MouseAdapter
    {   public void mouseEntered(MouseEvent e)
        {   inhalt.remove(p_right);
            inhalt.add(text_taste);
            repaint();
        }
    	public void mouseExited(MouseEvent e)
        {   inhalt.remove(text_taste);
            inhalt.add(p_right); 
            repaint();
        } 	
    }
    
    public void paint(Graphics g)
    {    super.paint(g);
         //Rand und Titelleiste Linien zeichnen
         Dimension size = new Dimension(this.getSize());
         g.drawLine(0, 15, (int)size.getWidth(), 15);
         g.drawLine(0, 0, 0, (int)size.getHeight());
         g.drawLine(0, 0, (int)size.getWidth(), 0);
         g.drawLine((int)size.getWidth()-1, 0, (int)size.getWidth()-1, (int)size.getHeight());
         g.drawLine(0, (int)size.getHeight()-1, (int)size.getWidth(), (int)size.getHeight()-1);
         //Fadenkreuz zeichnen
         g.drawLine( 32, 15,32,105  );
         g.drawLine( 0, 46,62,46 );
    }

    //Verschieben des Fensters realisieren
    class titelklick extends MouseAdapter
    {   public void mousePressed(MouseEvent e)
        {   if(!e.isMetaDown())
            {   point.x = e.getX();
                point.y = e.getY();
            }
        }
    }
    class titelmove extends MouseMotionAdapter
    {   public void mouseDragged(MouseEvent e)
        {   if(!e.isMetaDown())
            {   Point p = getLocation();
                setLocation(p.x + e.getX() - point.x,
                p.y + e.getY() - point.y);
            }
        }
    }
    
    //Bei Taste H (hold) wird die abfrage gestoppt und der hex Wert in die Zwischenablage gespeichert
    class Tastatur implements KeyListener
    {   public void keyPressed(KeyEvent e)
        { if(e.getKeyCode() == KeyEvent.VK_H)
           if(klick)
              klick = false;
            else
           {  klick = true;
              Clipboard systemZwischenablage = Toolkit.getDefaultToolkit().getSystemClipboard();
              StringSelection inhalt = new StringSelection(Integer.toHexString(c.getRed()).toUpperCase() + Integer.toHexString(c.getGreen()).toUpperCase() + Integer.toHexString(c.getBlue()).toUpperCase());
              systemZwischenablage.setContents( inhalt, null );
           }
        }
        public void keyReleased(KeyEvent e) {}
        public void keyTyped(KeyEvent e)    {}
    }
    
    //Der Timer der die Farben abfrägt
    public class My_Timer implements ActionListener
    {   public void actionPerformed(ActionEvent e)
        {   if(!klick)
            {   PointerInfo pointerInfo = MouseInfo.getPointerInfo();
                Point point = pointerInfo.getLocation();
                if(robot != null)
                {   c = robot.getPixelColor((int)point.getX(),(int)point.getY());
                    for(int i = 0; i < 11; i++)
                       for(int j = 0; j < 11; j++)
                          Lupe.setColor(j, i, (robot.getPixelColor((int)point.getX()- 5 + j,(int)point.getY() - 5 + i)).getRGB() );
                    Farbe_hex.setBackground(c);
                    tf_R.setText(String.valueOf( c.getRed() ));
                    tf_G.setText(String.valueOf( c.getGreen() ));
                    tf_B.setText(String.valueOf( c.getBlue() ));
                    tf_hex.setText("#" + Integer.toHexString(c.getRed()).toUpperCase() + Integer.toHexString(c.getGreen()).toUpperCase() + Integer.toHexString(c.getBlue()).toUpperCase() );
                    repaint(0,15,100,100);
                }
            }
        }
    }

    public static void main( String[] args )
    {   new ColorReader();
    }
}
```
LupePanel:

```
import java.awt.*;
import javax.swing.*;

class LupePanel extends JPanel
{
    private int w = 11;
    private int h = 11;
    private int colors[][] = new int[w][h];

    LupePanel()
    {   this.setPreferredSize(new Dimension(55,55));
    }

    public void setColor(int x, int y, int color)
    {
        colors[x][y] = color;
    }

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        int dx = getWidth() / w;
        int dy = getHeight() / h;
        for (int x=0; x<w; x++)
        {
            for (int y=0; y<h; y++)
            {
                g.setColor(new Color(colors[x][y]));
                g.fillRect(x*dx, y*dy, dx, dy);
            }
        }
    }
}
```

Edit: Ich habe das jetzt mit den validate(); ergänzt und es funktioniert.
Aber wenn ich dann mouseEntered aktiviert habe funktioniert der KeyListener nicht mehr, keine reaktion auf die Taste H... Warum ist das so?

Gruß

Edit2:
Man könnte also meinen das durch das auslösen von der Zeile inhalt.remove(p_right); den KeyListener "deaktiviert", nur verstehe ich den Zusammenhang nicht, da der Listener ja auf dem JFrame liegt. und nicht auf dem jpanel inhalt weder noch auf dem jpanel p_right...
:bahnhof:


----------



## Ebenius (7. Jun 2010)

Gustl_Java hat gesagt.:


> Aber wenn ich dann mouseEntered aktiviert habe funktioniert der KeyListener nicht mehr, keine reaktion auf die Taste H... Warum ist das so?


Ich hab den Code nur überflogen, vermute also nur… Es funktioniert dann nicht mehr, weil dann das neu hinzugefügte JLabel die MouseEvents bekommt und nicht mehr der darunter liegende Container. MouseEvents gibt's immer nur für die Komponente die unter dem Mauszeiger ganz oben auf dem Stapel liegt.

Ebenius


----------



## Gustl_Java (7. Jun 2010)

Hallo, das MouseEvent funktioniert ja einwandfrei, aber sobald die Methode mouseEntered angesprochen wird, bzw. sobald ich dort drin nur inhalt.remove(p_right); drin stehen habe, funktioniert der KeyListener leider nicht mehr.

Gruß


----------



## Ebenius (7. Jun 2010)

Ahso der KeyListener. KeyListener funktionieren nur auf der Komponente die Fokus hat. Transferier den Fokus also auf die richtige Komponente, dann wird's wohl funktionieren. BTW: Warum instanziierst Du den KeyListener x-mal neu anstatt die selbe Instanz zu nutzen?

Ebenius


----------



## Gustl_Java (7. Jun 2010)

Habe es schon mit 
	
	
	
	





```
setFocusable( true );
```
 probiert, leider ohne Erfolg.
Aber mit 
	
	
	
	





```
requestFocus();
```
 funktioniert es wohl. Danke.



Ebenius hat gesagt.:


> Warum instanziierst Du den KeyListener x-mal neu anstatt die selbe Instanz zu nutzen?



Was genau meinst du damit?

Gruß


----------



## Ebenius (7. Jun 2010)

Gustl_Java hat gesagt.:


> Habe es schon mit
> 
> 
> 
> ...


Das sagt ja auch nur, ob eine Komponente den Fokus erhalten soll, wenn man mit der Maus drauf klickt oder mit TAB den Fokus wechselt. ;-)



Gustl_Java hat gesagt.:


> Was genau meinst du damit?


Du hast einige male [c]new Tastatur()[/c] in Deinem Quelltext. Du könntest auch nur einen Listener nehmen: 
	
	
	
	





```
final Tastatur tastatur = new Tastatur();
…
irgendwas.addKeyListener(tastatur);
…
irgendwasAnderes.addKeyListener(tastatur);
```
Ebenius


----------



## Gustl_Java (7. Jun 2010)

hehe, klingt einleuchtend. 

das new Tastatur(); öfters instanziierst wird habe ich gar nicht gesehn. Ist wohl schon länger her als ich das gemacht habe. Ist auch recht unübersichtlich mein Code muss ich sagen.. 
Aber jetzt funktioniert es. Danke dir.

Bleibt jetzt nur noch die Frage offen, warum die Auswertung der Farben in der Lupe bei Windows 7 so extrem lange dauern. An der Geschwindigkeit des Rechners kann es nicht liegen. :noe:

Gruß


----------



## Ebenius (7. Jun 2010)

Falscher/schlechter Graka-Treiber?

Ebenius


----------



## Gustl_Java (7. Jun 2010)

Ok, das kann ich noch überprüfen, aber ich denke nicht das es an dem Treiber liegt.

Wie es scheint liegt es aber nicht an der Umsetzung in Java?
Deshalb werde ich das Thema als "erledigt" markieren.

Danke nochmal.
Gruß


----------

