2015-01-30 3 views
0

Я хочу перетащить текст из jlabel в jtextfield (у меня есть 9 jlabels и 81 jtextfields).Почему getDeepestComponentAt() возвращает null?

код выглядит следующим образом:

JPanel pole = new JPanel(); 

pole.add(tf[0][0]); 
tf[0][0].addMouseListener(this); 
tf[0][0].setName("0,0"); 
...... 
...... 
pole.add(jlab1); 
jlab1.addMouseListener(this); 
jlab1.setName("1"); 
..... 
..... 



@Override 
public void mouseReleased(MouseEvent me) { 

    //get drag component (that's ok) 
    Component c = me.getComponent(); 


    //get drop component - doesn't work - return null :( 
    Component d = SwingUtilities.getDeepestComponentAt(this.pole, me.getX(), me.getY()); 

Почему это возвращение нулевой? Как получить этот компонент drop? D?

+0

[JavaDocs] (http://docs.oracle.com/javase/7/docs/api/javax/swing/SwingUti lities.html # getDeepestComponentAt (java.awt.Component,% 20int,% 20int)) say * «Если родитель не содержит указанное местоположение, возвращается значение null» * – MadProgrammer

+0

Это может быть один из тех случаев, когда фактическое использование drop -n-drop API стоит усилий – MadProgrammer

+0

Что-то вроде [this] (http://stackoverflow.com/questions/11201734/java-how-to-drag-and-drop-jpanel-with-its-components/11443501# Например, 11443501). Вам было бы интересно извлечь текст с ярлыка, но основная идея звучит – MadProgrammer

ответ

1

MouseEvent s являются контекстуальными для компонента, который их создал. Это означает, что когда вы отпускаете кнопку мыши, источником события является тот же компонент, на который вы нажали.

Информация о местоположении, возвращаемая MouseEvent, также находится в контексте компонентов источника (0x0 - верхняя левая позиция исходного компонента).

Это означает, что при использовании Component d = SwingUtilities.getDeepestComponentAt(this.pole, me.getX(), me.getY());, координаты не в pole контексте, но источник Component s, что, вероятно, означает, что pole не содержит эти координаты и метод возврата null-х.

Как JavaDocs говорит «Если родитель не содержит указанное место, то нуль возвращается»

Вы можете попробовать перевод MouseEvent местоположение в контексте pole используя что-то вроде ...

MouseEvent evt = SwingUtilities.convertMouseEvent(e.getComponent(), e, textField); 

или

Point p = SwingUtilities.convertPoint(e.getComponent(), e.getPoint(), textField); 

Но по-прежнему нет никакой гарантии, что точка будет в пределах компонентов.

Вы могли бы еще проверить положение точки по отношению к pole используя что-то больше похоже на ...

Rectangle bounds = textField.getBounds(); 
bounds.setLocation(0, 0); 
if (bounds.contains(p)) { 
    // Finally... 
} 

или, возможно, ...

Point p = SwingUtilities.convertPoint(e.getComponent(), e.getPoint(), pole);      
Component dropPoint = SwingUtilities.getDeepestComponentAt(pole, p.x, p.y); 

Но это все еще может вернуться null если вы перетаскиваете за пределы прямоугольника pole ...

Смежные вопросы