Why I cannot Move my JLabel after I add SetToolTipText()?

Dear Friends:

I met a tough problem that I debugged for few days but cannot solve it.

after I add SetToolTipText I cannot Move my JLabel , what is wrong here?

see code below, here label1 cannot move.

If somebody can throw some lights, that will be wonderful,

so far no progress.

import java.awt.*;

import java.awt.event.*;

import java.util.Vector;

import javax.swing.*;

import javax.swing.border.LineBorder;

import javax.swing.event.*;

publicclass DNDJLabelsextends JPanel{

protected JLabel label1, label2, label3, label4;

protected JLabel[] labels;

protected JLabel selectedLabel;

LineBorder black =new LineBorder(Color.black, 3,false);

int cx, cy;

protected Vector order =new Vector();

publicstaticvoid main(String[] args){

JFrame f =new JFrame("DNDJLabels");

f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

f.getContentPane().add(new DNDJLabels());

f.setSize(600,700);

f.setLocation(200,200);

f.setVisible(true);

}

public DNDJLabels (){

setLayout(null);

addLabels();

label1.setBounds( 125, 150, 150, 60);

label2.setBounds(425, 150, 150, 60);

label3.setBounds( 125, 575, 150, 60);

label4.setBounds(425, 575, 150, 60);

label1.setBorder(black);

label2.setBorder(black);

label3.setBorder(black);

label4.setBorder(black);

//add(btn);

label1.setToolTipText("AAAAAAAA");

determineCenterOfComponents();

ComponentMover mover =new ComponentMover();

addMouseListener(mover);

addMouseMotionListener(mover);

}

publicvoid paintComponent(final Graphics g){

super.paintComponent(g);

Graphics2D g2 = (Graphics2D)g;

g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);

Point[] p;

g2.setStroke(new BasicStroke(4f));

for(int i = 0 ; i < order.size()-1; i++){

JLabel l1 = (JLabel)order.elementAt(i);

JLabel l2 = (JLabel)order.elementAt(i+1);

p = getCenterPoints(l1, l2);

g2.setColor(Color.black);

//g2.draw(new Line2D.Double(p[0], p[1]));

}

}

private Point[] getCenterPoints(Component c1, Component c2){

Pointp1 =new Point(),p2 =new Point();

Rectangler1 = c1.getBounds(),

r2 = c2.getBounds();

p1.x = r1.x + r1.width/2;

p1.y = r1.y + r1.height/2;

p2.x = r2.x + r2.width/2;

p2.y = r2.y + r2.height/2;

returnnew Point[]{p1, p2};

}

privatevoid determineCenterOfComponents(){

intxMin = Integer.MAX_VALUE, yMin = Integer.MAX_VALUE, xMax = 0,yMax = 0;

for(int i = 0; i < labels.length; i++){

Rectangle r = labels[i].getBounds();

if(r.x < xMin)xMin = r.x;

if(r.y < yMin)yMin = r.y;

if(r.x + r.width > xMax)xMax = r.x + r.width;

if(r.y + r.height > yMax)yMax = r.y + r.height;

}cx = xMin + (xMax - xMin)/2;

cy = yMin + (yMax - yMin)/2;

}

privateclass ComponentMoverextends MouseInputAdapter{

Point offsetP =new Point();

boolean dragging;

publicvoid mousePressed(MouseEvent e){

Point p = e.getPoint();

for(int i = 0; i < labels.length; i++){

Rectangle r = labels[i].getBounds();

if(r.contains(p)){

selectedLabel = labels[i];

order.addElement(labels[i]);

offsetP.x = p.x - r.x;

offsetP.y = p.y - r.y;

dragging =true;

repaint();//added

break;

}

}

}

publicvoid mouseReleased(MouseEvent e){}

publicvoid mouseDragged(MouseEvent e){

Rectangle r = selectedLabel.getBounds();

r.x = e.getX() - offsetP.x;

r.y = e.getY() - offsetP.y;

selectedLabel.setBounds(r.x, r.y, r.width, r.height);

//determineCenterOfComponents();

repaint();

}

}

privatevoid addLabels(){

label1 =new JLabel("Label 1");

label2 =new JLabel("Label 2");

label3 =new JLabel("Label 3");

label4 =new JLabel("Label 4");

labels =new JLabel[]{

label1, label2, label3, label4

};

//add(btn);

for(int i = 0; i < labels.length; i++){

labels[i].setHorizontalAlignment(SwingConstants.CENTER);

labels[i].setBorder(BorderFactory.createEtchedBorder());

add(labels[i]);

}

}

}

[8053 byte] By [sunnysunnygirla] at [2007-11-27 10:36:36]
# 1

When you set a tooltip on a component a MouseListener is added to the component so it knows when you are hovering over the component, therefore the MouseEvent does not get forwarded to the parent JPanel.

Add your MouseListener to the individual labels, not the panel.

camickra at 2007-7-28 18:42:20 > top of Java-index,Desktop,Core GUI APIs...
# 2

Thanks, according to your suggestion, I did following, not know why not work, not sure is correct way or not, please advice right way to solve it.

import java.awt.*;

import java.awt.event.*;

import java.util.Vector;

import javax.swing.*;

import javax.swing.border.LineBorder;

import javax.swing.event.*;

public class DNDJLabels extends JPanel{

protected JLabel label1, label2, label3, label4;

protected JLabel[] labels;

protected JLabel selectedLabel;

protected Point offsetP = new Point();

protected boolean dragging;

LineBorder black = new LineBorder(Color.black, 3, false);

int cx, cy;

protected Vector order = new Vector();

public static void main(String[] args){

JFrame f = new JFrame("DNDJLabels");

f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

f.getContentPane().add(new DNDJLabels());

f.setSize(600,700);

f.setLocation(200,200);

f.setVisible(true);

}

public DNDJLabels (){

setLayout(null);

addLabels();

label1.setBounds( 125, 150, 150, 60);

label2.setBounds(425, 150, 150, 60);

label3.setBounds( 125, 575, 150, 60);

label4.setBounds(425, 575, 150, 60);

label1.setBorder(black);

label2.setBorder(black);

label3.setBorder(black);

label4.setBorder(black);

//add(btn);

label1.setToolTipText("AAAAAAAA");

label1.addMouseListener(new MouseListener() {

public void mouseDown(MouseEvent e) {

}

public void mouseClicked(MouseEvent e) {

}

public void mouseEntered(MouseEvent e) {

}

public void mouseExited(MouseEvent e) {

}

public void mouseDragged(MouseEvent e){

Rectangle r = selectedLabel.getBounds();

r.x = e.getX() - offsetP.x;

r.y = e.getY() - offsetP.y;

selectedLabel.setBounds(r.x, r.y, r.width, r.height);

//determineCenterOfComponents();

repaint();

}

public void mousePressed(MouseEvent e) {

Point p = e.getPoint();

dragging=true;

for(int i = 0; i < labels.length; i++){

Rectangle r = labels[i].getBounds();

if(r.contains(p)){

selectedLabel = labels[i];

order.addElement(labels[i]);

offsetP.x = p.x - r.x;

offsetP.y = p.y - r.y;

dragging = true;

repaint(); //added

break;

}

}

}

public void mouseReleased(MouseEvent e) {

}

public void mouseDoubleClick(MouseEvent e) {

}

});

determineCenterOfComponents();

ComponentMover mover = new ComponentMover();

addMouseListener(mover);

addMouseMotionListener(mover);

}

public void paintComponent(final Graphics g){

super.paintComponent(g);

Graphics2D g2 = (Graphics2D)g;

g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);

Point[] p;

g2.setStroke(new BasicStroke(4f));

for(int i = 0 ; i < order.size()-1; i++) {

JLabel l1 = (JLabel)order.elementAt(i);

JLabel l2 = (JLabel)order.elementAt(i+1);

p = getCenterPoints(l1, l2);

g2.setColor(Color.black);

//g2.draw(new Line2D.Double(p[0], p[1]));

}

}

private Point[] getCenterPoints(Component c1, Component c2){

Pointp1 = new Point(),p2 = new Point();

Rectangler1 = c1.getBounds(),

r2 = c2.getBounds();

p1.x = r1.x + r1.width/2;

p1.y = r1.y + r1.height/2;

p2.x = r2.x + r2.width/2;

p2.y = r2.y + r2.height/2;

return new Point[] {p1, p2};

}

private void determineCenterOfComponents(){

intxMin = Integer.MAX_VALUE, yMin = Integer.MAX_VALUE, xMax = 0,yMax = 0;

for(int i = 0; i < labels.length; i++){

Rectangle r = labels[i].getBounds();

if(r.x < xMin)xMin = r.x;

if(r.y < yMin)yMin = r.y;

if(r.x + r.width > xMax)xMax = r.x + r.width;

if(r.y + r.height > yMax)yMax = r.y + r.height;

}cx = xMin + (xMax - xMin)/2;

cy = yMin + (yMax - yMin)/2;

}

private class ComponentMover extends MouseInputAdapter{

public void mousePressed(MouseEvent e){

Point p = e.getPoint();

for(int i = 0; i < labels.length; i++){

Rectangle r = labels[i].getBounds();

if(r.contains(p)){

selectedLabel = labels[i];

order.addElement(labels[i]);

offsetP.x = p.x - r.x;

offsetP.y = p.y - r.y;

dragging = true;

repaint(); //added

break;

}

}

}

public void mouseReleased(MouseEvent e){ }

public void mouseDragged(MouseEvent e){

Rectangle r = selectedLabel.getBounds();

r.x = e.getX() - offsetP.x;

r.y = e.getY() - offsetP.y;

selectedLabel.setBounds(r.x, r.y, r.width, r.height);

//determineCenterOfComponents();

repaint();

}

}

private void addLabels(){

label1 = new JLabel("Label 1");

label2 = new JLabel("Label 2");

label3 = new JLabel("Label 3");

label4 = new JLabel("Label 4");

labels = new JLabel[] {

label1, label2, label3, label4

};

//add(btn);

for(int i = 0; i < labels.length; i++) {

labels[i].setHorizontalAlignment(SwingConstants.CENTER);

labels[i].setBorder(BorderFactory.createEtchedBorder());

add(labels[i]);

}

}

}

sunnysunnygirla at 2007-7-28 18:42:20 > top of Java-index,Desktop,Core GUI APIs...
# 3

In your original code you added the listeners to the panel:

ComponentMover mover = new ComponentMover();

addMouseListener(mover);

addMouseMotionListener(mover);

You don't want to add the listeners to the panel. You add them to the labels directly:

ComponentMover mover = new ComponentMover();

label1.addMouseListener(mover);

label1.addMouseMotionListener(mover);

label2.addMouseListener(mover);

label2.addMouseMotionListener(mover);

...

You may need to change the code in the ComponentMover because before you assumed you clicked on the panel and then found the appropriate label. But now you will be clicking directly on the label so you don't need to do your search.

If you don't understand the concept then create a true SSCCE. That is create a simple MouseListener that simply displays "Mouse clicked", "mouse pressed" and "mouse released" and then add the listener to the label. Once you understand the concept you incorporate the dragging logic.

camickra at 2007-7-28 18:42:20 > top of Java-index,Desktop,Core GUI APIs...