# JLabel in de Vordergrund



## Cathamenia (15. Jul 2007)

Hallo,

ich habe ein Fenster (JInternalFrame) und liegen verschiedene JLabels mit Icons. Ich kann in diesem Fenster so ein Bildchen setzen indem ich mit der Maus dorthin klick. Um zu sehen, welches Bild man dort gerade hin klickt, fährt mit der Maus ein Vorschaubild genau mit (unter der Maus quasi):


```
public void mouseMoved(MouseEvent e) {
		//this.setComponentZOrder(preview, 0);
		int xPos = e.getX();
		int yPos = e.getY() - 25;
		preview.setBounds(xPos-20, yPos-20, 40, 40);
	}
```

Nun habe ich das Problem, dass mein Vorschaubild nicht im Vordergrund bleibt. Dies wollte ich mit der auskommentierten Zeile beheben nur dann ist das Bildchen nicht mehr genau auf dem Mauszeiger sondern 25 pixel da drüber. Hat jemand rat?

Cathamenia


----------



## André Uhres (16. Jul 2007)

Du könntest mit *Toolkit#createCustomCursor* einen eigenen Mauszeiger bauen:

```
package cursor;
/*
* CursorDemo.java
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class CursorDemo extends JFrame {
    private JDesktopPane desktopPane;
    private JInternalFrame internalFrame;
    private JLabel bild1, bild2;
    private JPanel bilderQuelle, bilderZiel;
    private Cursor myPointer;
    final private Color BORDER_COLOR = Color.BLUE;
    private ImageIcon image;
    public CursorDemo() {
        super("Cursor Demo");
        initComponents();
        bild1.setIcon(UIManager.getIcon("Tree.closedIcon"));
        bild2.setIcon(UIManager.getIcon("Tree.leafIcon"));
    }
    private void initComponents() {
        setSize(400,300);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        desktopPane = new JDesktopPane();
        internalFrame = new JInternalFrame();
        bilderQuelle = new JPanel();
        bild1 = new JLabel();
        bild2 = new JLabel();
        bilderZiel = new JPanel();
        internalFrame.setVisible(true);
        MouseListener bildLauscher = new MouseAdapter() {
            public void mousePressed(final MouseEvent evt) {
                bildMousePressed(evt);
            }
        };
        bild1.setText("Bild 1");
        bild1.addMouseListener(bildLauscher);
        bild2.setText("Bild 2");
        bild2.addMouseListener(bildLauscher);
        bilderQuelle.add(bild1);
        bilderQuelle.add(bild2);
        internalFrame.getContentPane().add(bilderQuelle, BorderLayout.NORTH);
        bilderZiel.setBackground(new Color(255, 255, 204));
        bilderZiel.addMouseListener(new MouseAdapter() {
            public void mousePressed(final MouseEvent evt) {
                bilderZielMousePressed(evt);
            }
        });
        internalFrame.getContentPane().add(bilderZiel, BorderLayout.CENTER);
        internalFrame.setBounds(30, 30, 270, 180);
        desktopPane.add(internalFrame, JLayeredPane.DEFAULT_LAYER);
        getContentPane().add(desktopPane, BorderLayout.CENTER);
    }
    private void bilderZielMousePressed(final MouseEvent evt) {
        if(!bilderZiel.getCursor().equals(myPointer)) return;
        Icon image2 = new ImageIcon(image.getImage().getScaledInstance(30,-1,0));
        bilderZiel.add(new JLabel(image2));
        bilderQuelle .setCursor(Cursor.getDefaultCursor());
        bilderZiel .setCursor(Cursor.getDefaultCursor());
        bilderZiel.revalidate();
    }
    private void bildMousePressed(final MouseEvent evt) {
        buildMyPointer(((JLabel)evt.getSource()));
        bilderQuelle.setCursor(myPointer);
        bilderZiel.setCursor(myPointer);
    }
    private void buildMyPointer(final Component component){
        if(!(component instanceof JLabel)) return;
        JLabel label = (JLabel) component;
        image = (ImageIcon) label.getIcon();
        Toolkit tk = Toolkit.getDefaultToolkit();
        myPointer= tk.createCustomCursor(image.getImage(), new Point(10,10), "myPointer");
    }
    public static void main(final String args[]) {new CursorDemo().setVisible(true);}
}
```


----------



## Cathamenia (16. Jul 2007)

Das wär als Ausweichvariante möglich...

Vielleicht hat aber jemand noch eine Idee, wie ich das einfacher haben kann. Denn wenn ich das Label nicht nach oben hole, dann kann er setBounds() ohne probleme richtig ausführen


----------



## André Uhres (16. Jul 2007)

Cathamenia hat gesagt.:
			
		

> Das wär als Ausweichvariante möglich...
> 
> Vielleicht hat aber jemand noch eine Idee, wie ich das einfacher haben kann. Denn wenn ich das Label nicht nach oben hole, dann kann er setBounds() ohne probleme richtig ausführen


Man kann auch mit JLayeredPane arbeiten. Viel einfacher wird das aber imho nicht:

```
package cursor;
/*
* CursorDemo2.java
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class CursorDemo2 extends JFrame implements MouseMotionListener{
    private JDesktopPane desktopPane;
    private JInternalFrame internalFrame;
    private JLabel bild1, bild2;
    private JPanel bilderQuelle, bilderZiel;
    private Cursor myPointer;
    private JLabel preview;
    private JLayeredPane layeredPane;
    private ImageIcon image;
    public CursorDemo2() {
        super("Cursor Demo");
        initComponents();
        bild1.setIcon(UIManager.getIcon("Tree.closedIcon"));
        bild2.setIcon(UIManager.getIcon("Tree.leafIcon"));
    }
    private void initComponents() {
        setSize(400,300);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        desktopPane = new JDesktopPane();
        internalFrame = new JInternalFrame();
        bilderQuelle = new JPanel();
        bild1 = new JLabel();
        bild2 = new JLabel();
        bilderZiel = new JPanel();
        internalFrame.setVisible(true);
        MouseListener bildLauscher = new MouseAdapter() {
            public void mousePressed(final MouseEvent evt) {
                bildMousePressed(evt);
            }
        };
        bild1.setText("Bild 1");
        bild1.addMouseListener(bildLauscher);
        bild2.setText("Bild 2");
        bild2.addMouseListener(bildLauscher);
        bilderQuelle.add(bild1);
        bilderQuelle.add(bild2);
        internalFrame.getContentPane().add(bilderQuelle, BorderLayout.NORTH);
        bilderZiel.setBackground(new Color(255, 255, 204));
        bilderZiel.addMouseListener(new MouseAdapter() {
            public void mousePressed(final MouseEvent evt) {
                bilderZielMousePressed(evt);
            }
        });
        bilderZiel.addMouseMotionListener(this);
        internalFrame.getContentPane().add(bilderZiel, BorderLayout.CENTER);
        internalFrame.setBounds(30, 30, 270, 180);
        desktopPane.add(internalFrame, JLayeredPane.DEFAULT_LAYER);
        getContentPane().add(desktopPane, BorderLayout.CENTER);
        layeredPane = getLayeredPane();
    }
    private void bilderZielMousePressed(final MouseEvent evt) {
        if(preview == null) return;
        Icon image2 = new ImageIcon(image.getImage().getScaledInstance(30,-1,0));
        bilderZiel.add(new JLabel(image2));
        bilderZiel.revalidate();
        layeredPane.remove(preview);
        layeredPane.repaint();
        preview = null;
    }
    private void bildMousePressed(final MouseEvent evt) {
        image = (ImageIcon) ((JLabel)evt.getSource()).getIcon();
        preview = new JLabel(image);
        layeredPane.add(preview, JLayeredPane.DRAG_LAYER);
    }
    public static void main(final String args[]) {new CursorDemo2().setVisible(true);}
    public void mouseMoved(MouseEvent e) {
        if(preview == null) return;
        int xPos = e.getX();
        int yPos = e.getY()+getHeight()-desktopPane.getHeight();//+titlebar height
        Point p = internalFrame.getLocation();
        preview.setBounds(xPos+p.x, yPos+p.y, image.getIconWidth(), image.getIconHeight());
    }
    public void mouseDragged(MouseEvent e) {
    }
}
```


----------



## Cathamenia (16. Jul 2007)

stimmt, ich habs nun mit der Mauszeigervariante gemacht, Danke.

EDIT: Wie kann ich den Haken an den thread machen, oder macht das wer anderes?


----------

