2016-01-20 2 views
0

Я создал просто программу, которая показывает окно JFram, когда ваша мышь находится на JLabel. Это, кажется, работает прекрасно, пока вы не пройдете мыши над JLabel много раз: JComponents начинают ломаются, как на этой картинке:JComponent и mouseListener очень странное поведение

enter image description here

JComponents начинают появляться в любом месте, и JLabel, который должен быть показан, имеет «странный смелый» шрифт. Я думаю, это может случиться, потому что программа никогда не «выходит» из маленького окна, поэтому память никогда не освобождается ?! Возможно, я тоже ошибаюсь ... но, конечно, я не знаю, почему это происходит!

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); 

     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(); 
    }; 

} 

ответ

3

КИ, я действительно не знаю, почему ваш код плохо себя, как это не плохо себя для меня, но рассмотреть вопрос об использовании либо всплывающей подсказки для этой функции, или еще немодальный непараметризованный JDialog и как показано здесь :

import java.awt.Color; 
import java.awt.GridLayout; 
import java.awt.Point; 
import java.awt.Dialog.ModalityType; 
import java.awt.Window; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

import javax.swing.*; 
import javax.swing.border.Border; 

public class Finestra2 extends JPanel { 
    private static final int EB = 20; 
    private JLabel dialogLabel = new JLabel("Dialog hover label"); 
    private JLabel toolTipLabel = new JLabel("Tooltip hover label"); 

    public Finestra2() { 
     // tool tip text will appear if the mouse hovers over component 
     toolTipLabel.setToolTipText("This is tooltipLabel's text"); 
     dialogLabel.addMouseListener(new DialogLabelMouseListener()); 

     // a one column grid with a variable number of rows 
     setLayout(new GridLayout(0, 1)); 

     addWithBorder(dialogLabel); 
     add(new JButton("Some Button")); // just a component to show possible visual misbehaviors 
     add(new JLabel("Do nothing label")); // ditto 
     addWithBorder(toolTipLabel); 
     add(new JButton("Some Button")); 
     add(new JLabel("Do nothing label")); 

     setBorder(BorderFactory.createEmptyBorder(EB, EB, EB, EB)); 
    } 

    // put a border around our labels of interest 
    private void addWithBorder(JComponent component) { 
     Border innerBorder = BorderFactory.createEmptyBorder(EB, EB, EB, EB); 
     Border outerBorder = BorderFactory.createLineBorder(Color.BLACK); 
     Border compoundBorder = BorderFactory.createCompoundBorder(outerBorder, innerBorder); 
     component.setBorder(compoundBorder); 
     add(component); 
    } 

    private class DialogLabelMouseListener extends MouseAdapter { 
     private JDialog hoverDialog; 

     @Override 
     public void mouseEntered(MouseEvent e) { 
      // only create the dialog once in a lazy fashion 
      if (hoverDialog == null) { 
       Window win = SwingUtilities.getWindowAncestor(Finestra2.this); 
       hoverDialog = new JDialog(win, "", ModalityType.MODELESS); 
       JLabel label = new JLabel("Dialog label hover window"); 
       hoverDialog.add(label); 
       hoverDialog.setUndecorated(true); 
       hoverDialog.pack(); 
      } 
      Point punto = e.getLocationOnScreen(); 
      punto.setLocation(punto.getX() + 20, punto.getY() + 20); 
      hoverDialog.setLocation(punto); 
      hoverDialog.setVisible(true); 
     } 

     @Override 
     public void mouseExited(MouseEvent e) { 
      if (hoverDialog != null) { 
       hoverDialog.setVisible(false); 
      } 
     } 
    } 

    private static void createAndShowGui() { 
     Finestra2 mainPanel = new Finestra2(); 

     JFrame frame = new JFrame("Finestra2"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> { 
      createAndShowGui(); 
     }); 
    } 
} 
+0

хорошо, проблема, что JComponents появляются без чувства, решена. Но как насчет этого «странного смелого» шрифта? –

+0

@ElMapoMapo: пожалуйста, проигнорируйте этот ответ - это неправильно. Позвольте мне посмотреть, что происходит. –

+0

@ElMapoMapo: см. Править для ответа. –

2

Прежде всего, изучить и использовать стандартные соглашения об именах:

  1. имена классов должны начинаться с верхнего регистра символов (Финестра). Кроме того, очень сложно ввести одно и то же имя класса и переменной.

  2. Второе слово имен переменных должен быть верхний обсаженной (littleLabel)

https://en.wikipedia.org/wiki/Naming_convention_(programming)#Java

JLabel, который должен быть показан, имеет "странный" жирный шрифт.

Это потому, что вы продолжаете создавать новую JLabel и добавляете ее в фрейм. Поэтому каждый ярлык нарисован и выглядит как жирный текст. Не уверен, почему каждый ярлык не нарисован точно друг над другом. Может иметь какое-то отношение к сглаживанию, отмечая черные пиксели в каждом месте.

Создайте метку при создании рамки и добавьте ее в рамку. Затем вы просто вызываете метод setText (...) в своем слушателе.

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