ColorReader, bei Fadenkreuz zeichnen mit repaint() flackern

Gustl_Java

Aktives Mitglied
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.)
Java:
....
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

Top Contributor
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

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

Hier der komplette Code:
Java:
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ß
 
Zuletzt bearbeitet:

Marco13

Top Contributor
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
Java:
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

Aktives Mitglied
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

Top Contributor
Vielleicht weil der Rechner scheiß langsam ist? :D

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

Aktives Mitglied
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

Aktives Mitglied
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

Top Contributor
Für das Zeichnen eines Gitters GROB
Java:
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

Aktives Mitglied
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:
Java:
    //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. :D

Gruß
 

Marco13

Top Contributor
Den bisherigen Timer ersetzen durch

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

und MyTimer dann so
Java:
    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 :D
 

Gustl_Java

Aktives Mitglied
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:
Java:
  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:
Java:
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:
Java:
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:
 
Zuletzt bearbeitet:

Ebenius

Top Contributor
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

Aktives Mitglied
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

Top Contributor
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
 

Ebenius

Top Contributor
Habe es schon mit
Code:
setFocusable( true );
probiert, leider ohne Erfolg.
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. ;-)

Was genau meinst du damit?
Du hast einige male [c]new Tastatur()[/c] in Deinem Quelltext. Du könntest auch nur einen Listener nehmen:
Java:
final Tastatur tastatur = new Tastatur();
…
irgendwas.addKeyListener(tastatur);
…
irgendwasAnderes.addKeyListener(tastatur);
Ebenius
 

Gustl_Java

Aktives Mitglied
hehe, klingt einleuchtend. :D

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.. :oops:
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ß
 

Gustl_Java

Aktives Mitglied
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ß
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Mandelbrot mit BigDecimal erstellen und in der UI zeichnen, funktionierte nicht. AWT, Swing, JavaFX & SWT 1
H JavaFX Canvas neu zeichnen anstoßen AWT, Swing, JavaFX & SWT 34
H Transparent zeichnen mit drawImage in paintComponent Methode AWT, Swing, JavaFX & SWT 3
N JavaFX Unicode zeichnen in javafx Label verwenden AWT, Swing, JavaFX & SWT 2
G 2D-Grafik Grafik in zwei verschiedenen Fenstern gleichzeitig zeichnen AWT, Swing, JavaFX & SWT 9
S Event Handling Neu zeichnen nur wenn Berechnung fertig ist AWT, Swing, JavaFX & SWT 4
W JavaFX Ich kann keinen Kreis richtig zeichnen AWT, Swing, JavaFX & SWT 8
CptK Funktionsgraphen effizient zeichnen und nur Teile von JPanel erneuern AWT, Swing, JavaFX & SWT 2
G Dreieck aus Pixeln zeichnen AWT, Swing, JavaFX & SWT 8
N Mit KeyListener ein rechteck zeichnen AWT, Swing, JavaFX & SWT 9
B 2D-Grafik paintcomponent Probleme beim zeichnen AWT, Swing, JavaFX & SWT 10
Z Swing Graph zeichnen lassen AWT, Swing, JavaFX & SWT 16
O Kann kei neues Panel zum zeichnen aufrufen... AWT, Swing, JavaFX & SWT 4
L Swing zeichnen AWT, Swing, JavaFX & SWT 14
S GUI Kreuz zeichnen und Position ausgeben AWT, Swing, JavaFX & SWT 3
S GUI Kreis zeichnen AWT, Swing, JavaFX & SWT 13
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
L Swing Ein Rechteck in ein Grid Zeichnen AWT, Swing, JavaFX & SWT 5
L JavaFX Animation, erst zeichnen dann anzeigen AWT, Swing, JavaFX & SWT 4
K Mehrere Linien zeichnen AWT, Swing, JavaFX & SWT 8
E Transparent zeichnen AWT, Swing, JavaFX & SWT 2
S AWT Probleme beim Zeichnen AWT, Swing, JavaFX & SWT 3
T Tic Tac Toe - GUI Linien zeichnen AWT, Swing, JavaFX & SWT 14
C Applet Zeichnen über Button-Click AWT, Swing, JavaFX & SWT 13
Soloeco Graph zeichnen AWT, Swing, JavaFX & SWT 1
G Zeichnen Programm AWT, Swing, JavaFX & SWT 1
I Graph mit Swing zeichnen AWT, Swing, JavaFX & SWT 8
H Swing + Paint: Mehrere Objekte zeichnen lassen AWT, Swing, JavaFX & SWT 3
W Swing JPanel nur einmal nach mehreren Änderungen neu zeichnen AWT, Swing, JavaFX & SWT 1
D Quadrat, Rechteck zeichnen AWT, Swing, JavaFX & SWT 3
K Probleme beim zeichnen mit paintComponent() AWT, Swing, JavaFX & SWT 1
JG12111989 mehrere Polyline-Objekte zeichnen AWT, Swing, JavaFX & SWT 3
A Swing JRadioButton zeichnen nicht AWT, Swing, JavaFX & SWT 4
J Swing Vertikales Zeichnen eines Strings mit Java2D AWT, Swing, JavaFX & SWT 1
7 JavaFX Problem beim Zeichnen eines Dreiecks in einem GUI AWT, Swing, JavaFX & SWT 6
P 2D-Grafik Bogen(Arc) zwischen zwei Punkten zeichnen AWT, Swing, JavaFX & SWT 2
F Java Swing Rechteck in JPanel zeichnen AWT, Swing, JavaFX & SWT 7
KilledByCheese Swing 2D JLabel Array Maze zeichnen AWT, Swing, JavaFX & SWT 2
S Parallele Linien zeichnen AWT, Swing, JavaFX & SWT 5
J Linien auf JPanel zeichnen AWT, Swing, JavaFX & SWT 3
P AWT Canvas freihändig zeichnen AWT, Swing, JavaFX & SWT 1
llabusch Linien in JPanel zeichnen AWT, Swing, JavaFX & SWT 6
S passende PaintComponent ? Zeichnen in TextArea mit Scrollpane ? AWT, Swing, JavaFX & SWT 2
I Applet BlueJ Applet - Bild mit if-Schleife zeichnen lassen AWT, Swing, JavaFX & SWT 16
L JavaFX JavafX Timelime zeichnen und schön stylen? AWT, Swing, JavaFX & SWT 2
I JFrame neu zeichnen, nicht überzeichnen! AWT, Swing, JavaFX & SWT 2
I Spielsteine zeichnen und entfernen AWT, Swing, JavaFX & SWT 3
H JavaFX Freezes beim Zeichnen mit Canvas AWT, Swing, JavaFX & SWT 3
H Swing BufferedImage zeichnen AWT, Swing, JavaFX & SWT 1
M JFreeChart neu zeichnen sich Wenn Jtable sich ändert AWT, Swing, JavaFX & SWT 5
S 2D-Grafik MouseDragged Linien zeichnen AWT, Swing, JavaFX & SWT 4
M Zeichnen ohne vorherige Linien zu löschen AWT, Swing, JavaFX & SWT 2
T Problem beim Zeichnen von Rechteck AWT, Swing, JavaFX & SWT 3
T Swing / Kreis zeichnen AWT, Swing, JavaFX & SWT 2
I Text zur Linie zeichnen AWT, Swing, JavaFX & SWT 1
I Pfeil zeichnen am Ende einer Linie AWT, Swing, JavaFX & SWT 1
D 2D-Grafik Inhalt eines Graphics in anderes Graphics zeichnen.... AWT, Swing, JavaFX & SWT 3
F Zeichnen des Button AWT, Swing, JavaFX & SWT 4
B Zeichnen mit paintComponent? Oder anders? AWT, Swing, JavaFX & SWT 15
C Swing Aus verschiedenen Klassen zeichnen. AWT, Swing, JavaFX & SWT 2
C Swing BufferedImage zeichnen und JLabels setzen. AWT, Swing, JavaFX & SWT 17
M Kein Zeichnen der Figuren auf JPanel AWT, Swing, JavaFX & SWT 4
J JButton neu zeichnen lassen AWT, Swing, JavaFX & SWT 9
S Quadrat auf Frame zeichnen AWT, Swing, JavaFX & SWT 2
P Image oder Icon auf Tooltip zeichnen AWT, Swing, JavaFX & SWT 4
C Graphics Objekt in Zeitschleife zeichnen AWT, Swing, JavaFX & SWT 4
X Swing JPanel mehrere Ebenen zeichnen AWT, Swing, JavaFX & SWT 13
G Zeichnen auf eine schwergewichtige Komponente? AWT, Swing, JavaFX & SWT 0
G Mehrere Strings um Kreis zeichnen und positionieren AWT, Swing, JavaFX & SWT 0
P SWT Nebula Gallery - Bildbereiche zeichnen AWT, Swing, JavaFX & SWT 3
A Swing Paint mit Button Clear den Hintergrund säubern um wieder zeichnen zu können AWT, Swing, JavaFX & SWT 2
A 2D-Grafik Zeichnen einer sich bewegenden Box mit BufferStrategy zieht Spur AWT, Swing, JavaFX & SWT 2
T AWT Bild laden und transparent zeichnen AWT, Swing, JavaFX & SWT 2
Helgon Swing Mit Swing zeichnen / NetBeans GUI AWT, Swing, JavaFX & SWT 11
M JLabel über JButtons zeichnen AWT, Swing, JavaFX & SWT 4
J JApplet und Zeichnen AWT, Swing, JavaFX & SWT 8
P 2D-Grafik NPE beim Zeichnen auf Graphics g AWT, Swing, JavaFX & SWT 8
4 Swing Graphen selber zeichnen AWT, Swing, JavaFX & SWT 2
T Über mehrere Panel zeichnen AWT, Swing, JavaFX & SWT 2
T Zeichnen von getSubimage funktioniert nicht AWT, Swing, JavaFX & SWT 7
M Bilder zeichnen, NullPointer Exception AWT, Swing, JavaFX & SWT 3
N JPanel neu zeichnen AWT, Swing, JavaFX & SWT 10
D Zeichnen eines Barplots AWT, Swing, JavaFX & SWT 2
bluerob Problem beim Image zeichnen via andere Klasse AWT, Swing, JavaFX & SWT 7
M Swing JFrame in einem Panel zeichnen AWT, Swing, JavaFX & SWT 3
M Suche Javabibliothek zum Zeichnen mathematischer Funktionen AWT, Swing, JavaFX & SWT 11
M Swing Warum öffnen sich beim Zeichnen mit Swing plötzlich zwei Fenster? AWT, Swing, JavaFX & SWT 5
P ScrollPane nach zeichnen dynamisch resize AWT, Swing, JavaFX & SWT 7
M Swing In GUI-Builder-JFrame mit Menü Schreiben und Zeichnen AWT, Swing, JavaFX & SWT 4
N 2D-Grafik 2 Probleme beim zeichnen AWT, Swing, JavaFX & SWT 18
S Swing Bild auf jPanel nach Änderung von JComboBox zeichnen AWT, Swing, JavaFX & SWT 4
C Funktionen zeichnen AWT, Swing, JavaFX & SWT 16
P JPanel neu zeichnen AWT, Swing, JavaFX & SWT 10
M Auf einem Hintergrundbild zeichnen AWT, Swing, JavaFX & SWT 2
S Eigene JComponent Image zeichnen AWT, Swing, JavaFX & SWT 3
T Oval auf ein JPanel zeichnen AWT, Swing, JavaFX & SWT 3
L Zeichnen in zwei Fenstern AWT, Swing, JavaFX & SWT 8
S Font laden, Wort zeichnen und animieren..? AWT, Swing, JavaFX & SWT 2
S Bild von Punkt zu Punkt zeichnen AWT, Swing, JavaFX & SWT 8
U Pixel zeichnen AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben