Swing Icon verschwindet beim Verschieben eines JLabels

olimeck

Mitglied
Als Anfänger stoße ich bei der Programmierung auf folgendes Problem: ein mit einem ImageIcon-Objekt versehenes JLabel verschwindet, sobald ich es verschieben möchte. Woran kann das liegen?


Java:
import java.awt.event.*;

import java.awt.GridBagLayout;



import javax.swing.*;



public class Spielbrett {

    private JFrame frame;

    private Label label;

    private ImageIcon icon;

  

    public static void main(String args[]) {

        new Spielbrett();

    }

  

    public Spielbrett() {

        icon = new ImageIcon("Kreis.png");

        frame = new JFrame();//Neues Frame-Objekt

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//Fenster wird geschlossen, wenn man auf "x" klickt

        frame.setLayout(new GridBagLayout());//Kein Layout hinzugefügt

        label = new Label(icon);//Neues Label-Objekt erstellen

        label.setBounds(50, 50, 100, 100);

        frame.getContentPane().add(label);

      

        frame.setBounds(50,50,1000,1000);//Position des Fensters und Größe festlegen

        frame.setVisible(true);//Fenster sichtbar machen

        label.addMouseMotionListener(new MouseMotionListener() {

            public void mouseMoved(MouseEvent e) {

            }

            public void mouseDragged(MouseEvent e) {

                label.setBounds(label.getMyX() + e.getXOnScreen() - label.getMouseX(), label.getMyY() + e.getYOnScreen() - label.getMouseY(),50,50);

            }

        });

        label.addMouseListener(new MouseListener() {



            @Override

            public void mouseClicked(MouseEvent e) {

              

            }



            @Override

            public void mousePressed(MouseEvent e) {

                label.setMouseX(e.getXOnScreen());

                label.setMouseY(e.getYOnScreen());

                label.setMyX(label.getX());

                label.setMyY(label.getY());

            }



            @Override

            public void mouseReleased(MouseEvent e) {

            }



            @Override

            public void mouseEntered(MouseEvent e) {

              

            }



            @Override

            public void mouseExited(MouseEvent e) {

              

            }

          

        });

      

    }

}

DIE KLASSE Label...

import javax.swing.*;



public class Label extends JLabel{



    private int myX;

    private int myY;

    private int mouseX;

    private int mouseY;

  

    public Label(ImageIcon icon) {

        super(icon);

    }

    public Label(String text){

        super(text);

    }

    public int getMyX() {

        return myX;

    }

    public void setMyX(int x) {

        this.myX = x;

    }

    public int getMyY() {

        return myY;

    }

    public void setMyY(int y) {

        this.myY = y;

    }

    public int getMouseX() {

        return mouseX;

    }

    public void setMouseX(int mouseX) {

        this.mouseX = mouseX;

    }

    public int getMouseY() {

        return mouseY;

    }

    public void setMouseY(int mouseY) {

        this.mouseY = mouseY;

    }

    private static final long serialVersionUID = 1L;



}
 

Robert Zenz

Top Contributor
Lass dir mal die Koordinaten bei jedem mouseDragged ausgeben. Ich bin mir sehr sicher dass deine Rechnung nicht stimmt.

Java:
int x = label.getMyX() + e.getXOnScreen() - label.getMouseX();
int y = label.getMyY() + e.getYOnScreen() - label.getMouseY();

System.out.println(Integer.toString(x) + ":" + Integer.toString(y));
label.setBounds(x, y,50,50);
 

olimeck

Mitglied
Lass dir mal die Koordinaten bei jedem mouseDragged ausgeben. Ich bin mir sehr sicher dass deine Rechnung nicht stimmt.

Java:
int x = label.getMyX() + e.getXOnScreen() - label.getMouseX();
int y = label.getMyY() + e.getYOnScreen() - label.getMouseY();

System.out.println(Integer.toString(x) + ":" + Integer.toString(y));
label.setBounds(x, y,50,50);

Lass dir mal die Koordinaten bei jedem mouseDragged ausgeben. Ich bin mir sehr sicher dass deine Rechnung nicht stimmt.

Java:
int x = label.getMyX() + e.getXOnScreen() - label.getMouseX();
int y = label.getMyY() + e.getYOnScreen() - label.getMouseY();

System.out.println(Integer.toString(x) + ":" + Integer.toString(y));
label.setBounds(x, y,50,50);
Vielen Dank für den Tipp, ich werde mich morgen gleich ans Werk machen! Bin gespannt, ob ich es hinbekomme. Sieht auf den ersten Blick so aus, als wenn es ein Problem mit der relativen und der absoluten Position auf de Bildschirm wäre... Kann man das so sagen?
 

MarvinsDepression

Bekanntes Mitglied
Das sollte funktionieren:
Java:
        label.addMouseListener(new MouseListener() {
            @Override
            public void mousePressed(MouseEvent e) {
                labelMouseX = label.getMousePosition().x;
                labelMouseY = label.getMousePosition().y;
            }
            
            @Override
            public void mouseClicked(MouseEvent e) {}
            @Override
            public void mouseReleased(MouseEvent e) {}
            @Override
            public void mouseEntered(MouseEvent e) {}
            @Override
            public void mouseExited(MouseEvent e) {}
        } );
        
        label.addMouseMotionListener( new MouseMotionListener() {
            @Override
            public void mouseDragged(MouseEvent e) {
                try {
                    int x = frame.getContentPane().getMousePosition().x - labelMouseX;
                    int y = frame.getContentPane().getMousePosition().y - labelMouseY;
                    label.setLocation(x, y);
                } catch (NullPointerException ex) {}
            }

            @Override
            public void mouseMoved(MouseEvent e) {}
        } );
labelMouseX und labelMouseY sind Instanzvariablen
 

olimeck

Mitglied
Lass dir mal die Koordinaten bei jedem mouseDragged ausgeben. Ich bin mir sehr sicher dass deine Rechnung nicht stimmt.

Java:
int x = label.getMyX() + e.getXOnScreen() - label.getMouseX();
int y = label.getMyY() + e.getYOnScreen() - label.getMouseY();

System.out.println(Integer.toString(x) + ":" + Integer.toString(y));
label.setBounds(x, y,50,50);
Du hattest Recht, die Koordinaten waren falsch! Vielen Dank für die Hilfe! Von selbst wäre ich da sicherlich ewig nicht draufgekommen! DANKE!
 

olimeck

Mitglied
Das sollte funktionieren:
Java:
        label.addMouseListener(new MouseListener() {
            @Override
            public void mousePressed(MouseEvent e) {
                labelMouseX = label.getMousePosition().x;
                labelMouseY = label.getMousePosition().y;
            }
           
            @Override
            public void mouseClicked(MouseEvent e) {}
            @Override
            public void mouseReleased(MouseEvent e) {}
            @Override
            public void mouseEntered(MouseEvent e) {}
            @Override
            public void mouseExited(MouseEvent e) {}
        } );
       
        label.addMouseMotionListener( new MouseMotionListener() {
            @Override
            public void mouseDragged(MouseEvent e) {
                try {
                    int x = frame.getContentPane().getMousePosition().x - labelMouseX;
                    int y = frame.getContentPane().getMousePosition().y - labelMouseY;
                    label.setLocation(x, y);
                } catch (NullPointerException ex) {}
            }

            @Override
            public void mouseMoved(MouseEvent e) {}
        } );
labelMouseX und labelMouseY sind Instanzvariablen
 

olimeck

Mitglied
Super! Vielen Dank! Das hat auf Anhieb geklappt! ...und alleine wäre ich da wohl kaum draufgekommen bzw. ich hätte noch viel recherchieren müssen! DANKE! Oliver
 

mihe7

Top Contributor
Hier mal eine klein wenig angepasste Variante, die das Event-Handling in einer separaten Klasse durchführt. Diese erlaubt es prinzipiell, die Komponente auch außerhalb des sichtbaren Bereichs zu verschieben, was aber durch eine entsprechende Prüfung verhindert wird. Natürlich kann der Test entsprechend angepasst werden, z. B. könnte man statt contains auch intersects verwendet werden, dann kann die Komponente zwar teilweise aber nicht vollständig in den nicht-sichtbaren Bereich geschoben werden.

Java:
import java.awt.event.*;
import java.awt.Color;
import java.awt.Component;
import java.awt.Point;
import java.awt.Rectangle;

import javax.swing.*;

public class Spielbrett {

    public static void main(String args[]) {
        SwingUtilities.invokeLater(() -> new Spielbrett().run());
    }

    public void run() {
        JLabel label = new JLabel("Label");
        label.setBounds(50, 50, 100, 100);
        label.setBorder(BorderFactory.createLineBorder(Color.BLACK));
        DragHandler handler = new DragHandler();
        label.addMouseListener(handler);
        label.addMouseMotionListener(handler);

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().setLayout(null);
        frame.add(label);
        frame.setBounds(50, 50, 800, 600);
        frame.setVisible(true);
    }

    // Kann zwecks Wiederverwendbarkeit in DragHandler.java ausgelagert werden
    static class DragHandler extends MouseAdapter {
        private Component component;
        private Point dragOffset;

        @Override
        public void mousePressed(MouseEvent e) {
            component = e.getComponent();
            dragOffset = e.getPoint();
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            component = null;
            dragOffset = null;
        }

        @Override
        public void mouseDragged(MouseEvent e) {
            Rectangle bounds = new Rectangle(getLocationOnParent(e), component.getSize());

            // Beispielsweise kann man testen, ob die Komponente vollständig sichtbar ist
            if (component.getParent().getBounds().contains(bounds)) {
                component.setLocation(bounds.getLocation());
            }
        }

        private Point getLocationOnParent(MouseEvent e) {
            // Konvertiere Mauskoordinate in das Koordinatensystem des Parents,
            // da getParent().getMousePosition() null liefert,
            // wenn der Mauszeiger sich außerhalb des Parents befindet.
            Point locationOnParent = e.getLocationOnScreen();
            SwingUtilities.convertPointFromScreen(locationOnParent, component.getParent());
            locationOnParent.translate(-dragOffset.x, -dragOffset.y);
            return locationOnParent;
        }
    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S JCheckBoxMenuItem - Haekchen verschwindet bei Icon AWT, Swing, JavaFX & SWT 3
G Ikonli in Fat-Jar mit mehreren Icon-Packs einbinden AWT, Swing, JavaFX & SWT 5
I AWT java.awt.FileDialog - "coffee cup"-Icon lässt sich nicht ersetzen AWT, Swing, JavaFX & SWT 14
P Swing Icon einfügen wirft eine Fehlermeldung AWT, Swing, JavaFX & SWT 3
J JButton Icon hinzufügen AWT, Swing, JavaFX & SWT 5
U Swing JButton mit Icon AWT, Swing, JavaFX & SWT 7
N Swing Image aus Web laden und in Icon umwandeln AWT, Swing, JavaFX & SWT 4
krgewb Swing Icon von Button AWT, Swing, JavaFX & SWT 12
Shallty JavaFX MenuItem (Info) Icon ändern AWT, Swing, JavaFX & SWT 7
Legi Swing JButton Icon verschiebt sich AWT, Swing, JavaFX & SWT 2
U AWT Smoother Icon AWT, Swing, JavaFX & SWT 2
D Kein Icon beim JTabbedPane AWT, Swing, JavaFX & SWT 1
S JavaFX TreeItem: Icon am Ende eines Eintrags anhängen AWT, Swing, JavaFX & SWT 2
D Icon in Menuitem einfügen AWT, Swing, JavaFX & SWT 8
C Icon in der Spaltenüberschrift AWT, Swing, JavaFX & SWT 1
C SWT Treeview mit Bilder im Label verändert Expanded Icon AWT, Swing, JavaFX & SWT 1
Tom299 JavaFX TreeView Expanded-Icon ändern AWT, Swing, JavaFX & SWT 0
E Swing Error icon in der TextArea AWT, Swing, JavaFX & SWT 1
D JButton - Nur Icon anzeigen / transparenter Hintergrund AWT, Swing, JavaFX & SWT 2
M label mit icon verschieben. AWT, Swing, JavaFX & SWT 1
M JavaFX wie kann mann sein frame mit einem Icon fersehen? AWT, Swing, JavaFX & SWT 2
C JavaFX Application -Icon wird falsch dargestellt AWT, Swing, JavaFX & SWT 7
J JavaFX TextArea dynamisch Icon im Background anzeigen AWT, Swing, JavaFX & SWT 2
P Image oder Icon auf Tooltip zeichnen AWT, Swing, JavaFX & SWT 4
D JavaFX - MenuItem mit Icon AWT, Swing, JavaFX & SWT 1
T JFrame Icon unter Linux/Ubuntu AWT, Swing, JavaFX & SWT 11
A Swing JColorChooser's Icon will nicht getauscht werden. AWT, Swing, JavaFX & SWT 10
B JAVAFX icon in ComboBox einfügen AWT, Swing, JavaFX & SWT 5
H Javafx - Menuitem - Icon AWT, Swing, JavaFX & SWT 4
J JComboBox Dropdown Icon AWT, Swing, JavaFX & SWT 2
vodkaz JButtonz Icon&Background AWT, Swing, JavaFX & SWT 3
B Windowbuilder - Icon für Button einbinden AWT, Swing, JavaFX & SWT 2
B Icon AWT, Swing, JavaFX & SWT 5
E Swing JFrame Icon AWT, Swing, JavaFX & SWT 3
F icon aus exe auslesen mithilfe des JFilechooser ? AWT, Swing, JavaFX & SWT 4
F DefaultTreeCellEditor - Fragen zur Groesse und zum Icon beim Editieren AWT, Swing, JavaFX & SWT 4
H Label mit Icon positionieren AWT, Swing, JavaFX & SWT 14
H Image Icon ersetzen AWT, Swing, JavaFX & SWT 8
J Icon vor Button AWT, Swing, JavaFX & SWT 7
M Swing JButton-Konstruktor Icon-Parameter (Verständnisfrage) AWT, Swing, JavaFX & SWT 7
TheWhiteShadow Swing Problem mit Icon-Menü-Leiste AWT, Swing, JavaFX & SWT 5
S Würfelanimation icon updaten AWT, Swing, JavaFX & SWT 8
S JButton -> Text über Icon AWT, Swing, JavaFX & SWT 4
M Swing DoubleBuffer mit Icon AWT, Swing, JavaFX & SWT 3
TiME-SPLiNTER JLabel mit Icon & JFrame Resize AWT, Swing, JavaFX & SWT 5
V Panel/Icon aktualisieren AWT, Swing, JavaFX & SWT 10
S 2D-Grafik Icon in Image (System Icons) AWT, Swing, JavaFX & SWT 2
X Icon in JTable abbilden AWT, Swing, JavaFX & SWT 10
M Icon wird bei externen Jar nicht angezeigt AWT, Swing, JavaFX & SWT 2
L toggel icon in jtable AWT, Swing, JavaFX & SWT 3
kodela Swing Icon in der Titelleiste "festnageln" AWT, Swing, JavaFX & SWT 6
G JLabel Icon Pfeilform AWT, Swing, JavaFX & SWT 14
Burny91 Swing Swatches vom JColorChooser als Icon für JButton benutzen AWT, Swing, JavaFX & SWT 4
V Ein Image als Button (nicht mit JButton(Icon)) AWT, Swing, JavaFX & SWT 5
algorismi JInternalframe Icon AWT, Swing, JavaFX & SWT 14
M JCheckBox Icon anpassen AWT, Swing, JavaFX & SWT 2
E Icon für Fenster AWT, Swing, JavaFX & SWT 5
M Prozess-Icon im Prozessmanager AWT, Swing, JavaFX & SWT 8
W Swing Button mit Icon AWT, Swing, JavaFX & SWT 3
S svg Icon für Button (Batik Problem?) AWT, Swing, JavaFX & SWT 3
C Swing JToggleButton und Icon AWT, Swing, JavaFX & SWT 2
S JTree - Knoten mit animiertem GIF/Icon AWT, Swing, JavaFX & SWT 5
S vector Icon AWT, Swing, JavaFX & SWT 3
C LayoutManager Icon Einfügen? AWT, Swing, JavaFX & SWT 6
N Icon für Button wird nicht gefunden AWT, Swing, JavaFX & SWT 11
B SWT Eigenes Icon für CheckboxTreeViewer AWT, Swing, JavaFX & SWT 3
K LookAndFeel JTabbedPane mit Icon und CloseButton AWT, Swing, JavaFX & SWT 2
badfish Swing ImageIcon auf JLabel, Fenster Maximieren verbieten und Icon oben links austauschen? AWT, Swing, JavaFX & SWT 5
F Problem beim Positionieren von Icon und Text in Button AWT, Swing, JavaFX & SWT 2
R JTable mit Column die Icon und Integer enthält? AWT, Swing, JavaFX & SWT 3
T Icon von Frame ändern - Applet AWT, Swing, JavaFX & SWT 2
J Icon einer JCheckBox AWT, Swing, JavaFX & SWT 6
D Swing Anwenungs Icon AWT, Swing, JavaFX & SWT 8
A Swing JTable Icon nur in einer Zelle AWT, Swing, JavaFX & SWT 2
R JTable Header - will links kleines icon hinzufuegen..? AWT, Swing, JavaFX & SWT 6
J Swing JToolBar Button mit Icon AWT, Swing, JavaFX & SWT 4
V [Swing] Overlay Icon AWT, Swing, JavaFX & SWT 5
K Schachbrett / Icon / JButton AWT, Swing, JavaFX & SWT 7
T Abbrechen-Icon entfernen AWT, Swing, JavaFX & SWT 4
S Buttons mit großen Icon AWT, Swing, JavaFX & SWT 7
klattiator Icon und Button zum Schließen in einem Tab AWT, Swing, JavaFX & SWT 3
G Sehr kleine JButtons mit Icon oder Beschriftung AWT, Swing, JavaFX & SWT 2
G Icon ans Ende einer JToolbar AWT, Swing, JavaFX & SWT 7
D Abfrageproblem bei JMenu mit Icon AWT, Swing, JavaFX & SWT 2
K Icon auf JButton mit Wechsel der Farbe AWT, Swing, JavaFX & SWT 2
G Gap zwischen JButton-Rand und JButton-Icon verändern AWT, Swing, JavaFX & SWT 2
G JFrame Icon ändern AWT, Swing, JavaFX & SWT 5
G Icon und Text in JTable darstellen AWT, Swing, JavaFX & SWT 3
S Eclipse Icon Set AWT, Swing, JavaFX & SWT 6
G Icon in JTable AWT, Swing, JavaFX & SWT 9
S Jtree-Icon per Klick auf JBUTTON ändern AWT, Swing, JavaFX & SWT 3
A Icon,zentriert,Farbiger Text alles in einer Tabelle/Spalte ? AWT, Swing, JavaFX & SWT 4
L icon auf Label AWT, Swing, JavaFX & SWT 4
K Icon und Text auf JButton anordnen AWT, Swing, JavaFX & SWT 2
D Icon in MenuItem AWT, Swing, JavaFX & SWT 3
B jtree root icon ändern AWT, Swing, JavaFX & SWT 1
H Java Jar Icon AWT, Swing, JavaFX & SWT 12
K SystemTray-Icon im Prozesslauf ändern AWT, Swing, JavaFX & SWT 2
P [JTree] Icon für Nodes und Leafs ändern bzw. löschen AWT, Swing, JavaFX & SWT 2
C Jar Datei ist ausführbar aber zeigt keine icon's an AWT, Swing, JavaFX & SWT 18

Ähnliche Java Themen

Neue Themen


Oben