我创建了一个简单的程序,当鼠标位于 JLabel 上时,它会显示 JFram 窗口。它似乎工作得很好,直到您多次将鼠标移到 JLabel 上:JComponent 开始像下面的图片一样损坏:
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();
};
}
最佳答案
好吧,我真的不知道为什么你的代码行为不当,因为它对我来说不是行为不当,但请考虑使用此功能的工具提示,或者使用无模式未修饰的 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();
});
}
}
关于java - JComponent 和 mouseListener 的行为非常奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34902831/