2016-01-20 1 views
0

У меня есть jframe с некоторыми JComponents, с некоторыми mouseListener. Моя цель - показать немного jframe с указанным текстом, когда мышь вводится на jlabel и демонстрировать его, когда мышь выйдет. Jframe предполагается показывать рядом с мышью. В любом случае этого не происходит, и программа ведет себя очень странно. Почему? the bug Вот мой кодSwing mouseEntered странное поведение

package finestrina; 

import java.awt.GridLayout; 
import java.awt.Point; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

public class finestra implements MouseListener{ 

    private JFrame finestra = new JFrame(); 
    private JFrame pagina = new JFrame(); 
    private JButton submit1 = new JButton("press"); 
    private JTextField text = new JTextField(); 
    finestra(){ 

     pagina.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     pagina.setSize(500, 500); 

     JPanel cont = new JPanel(); 
     cont.setLayout(new GridLayout(3,4)); 

      JLabel label = new JLabel(); 
      label.setText("ON MOUSEROVER THIS"); 
       cont.add(label); 
      label.addMouseListener(this); 


      submit1.addMouseListener(this); 
      text.addMouseListener(this); 

     cont.add(submit1); 
     cont.add(text); 
     pagina.add(cont); 
     pagina.setVisible(true); 

     finestra.setUndecorated(true); 
    } 

    @Override 
    public void mouseClicked(MouseEvent arg0) {} 

    @Override 
    public void mouseEntered(MouseEvent event) { 
     if(event.getSource() instanceof JLabel){ 
      JLabel event_casted = (JLabel)event.getSource(); 

      if(event_casted.getText().equals("ON MOUSEROVER THIS")){ 
       Point punto = event.getLocationOnScreen(); 
       punto.setLocation(punto.getX()+20, punto.getY()+20); 

       JLabel littlelabel = new JLabel(); 

       littlelabel.setText("your mouse is on the jlabel"); 
       finestra.add(littlelabel); 
       finestra.setLocation(punto); 
       finestra.setSize(100,100); 
       finestra.setVisible(true); 
      } 
     } 
    } 

    @Override 
    public void mouseExited(MouseEvent event) { 
     if(event.getSource() instanceof JLabel){ 
      JLabel event_casted = (JLabel)event.getSource(); 
       if(event_casted.getText().equals("ON MOUSEROVER THIS")){ 
        finestra.setVisible(false); 
       } 
     } 
    } 

    @Override 
    public void mousePressed(MouseEvent event) { 

    } 

    @Override 
    public void mouseReleased(MouseEvent arg0) {} 

    public static void main(String[] args0){ 
     new finestra(); 
    }; 

} 
+1

Можете ли вы быть более конкретным, чем «программа ведет себя странным образом»? – khelwood

+1

Считается, что используется поддержка 'tooltip'? – MadProgrammer

+0

Проверьте результат (System.out.println (punto.getX() + "" punto.getY()); Я думаю, что он возвращается не так, как вы ожидаете – John

ответ

1

Есть ряд (возможно) выдает

  • GridLayout заставит компонент занимать большую часть пространства контейнера, который может вызвать окно «появляться» для всплывания ранее, тогда вы ожидаете, что
  • finestra.add(event_casted); вызывает удаление метки из текущего родительского контейнера (главного окна), поскольку компонент может принадлежать только одному контейнеру

Как правило, лучше использовать поддержку всплывающей подсказки, предоставляемую API. Возможно, посмотрите на How to Use Tool Tips, помните, что они также могут поддерживать HTML.

Если это не функциональность то, что вы хотите, то, возможно, JPopupMenu может быть лучше

+0

Ok @MadProgrammer, вы мне помогли, но я начал этот вопрос, потому что реальная «ошибка» - это когда я добавляю в основное окно некоторые другие JComponents, заставляя макет «волшебно» сломаться. Я обновил код ... –