当前位置: 首页 > 知识库问答 >
问题:

我可以把一块玻璃一分为二,然后在每一块上加一个分开的防腐剂吗?

鲜于裕
2023-03-14

我有一些代码与两个图像下的玻璃窗格。我想让每个图像都在自己的玻璃窗格下,每个玻璃窗格都发出自己的鼠标识别器的信号。目前,我已经在一个玻璃窗格下制作了两个,整个玻璃窗格都有一个防腐剂。两个图像都并排在网格布局中,所以将玻璃窗格分成两半应该不会太难。下面是一个玻璃窗格的代码,但请注意,我试图为每个图像创建两个玻璃窗格和两个分离的鼠标侦听器类。这只是一段代码,两个图像都有一个鼠标监听器:

package Buttons;


import java.awt.GridLayout;
import java.awt.event.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Giraffewindow extends JDialog {
public Giraffewindow() {
    JDialog giraffewindow = new JDialog();

    Icon giraffe = new ImageIcon(getClass().getResource("giraffe.png"));
    Icon windows = new ImageIcon(getClass().getResource("windows.png"));

    giraffewindow.setLayout(new GridLayout(1, 2, 0, 0));
    giraffewindow.add(new JLabel(windows));
    giraffewindow.add(new JLabel(giraffe));


    giraffewindow.pack();
    giraffewindow.setTitle("GIRAFFE!");
    giraffewindow.setVisible(true);
    giraffewindow.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    JPanel glass = ((JPanel) giraffewindow.getGlassPane());
    glass.setVisible(true);
    status = new JLabel("I can change");

    glass.add(status);
    glass.setLayout(null);
    giraffemousehandler giraffemouse = new giraffemousehandler();
    glass.addMouseListener(giraffemouse);
    glass.addMouseMotionListener(giraffemouse); //Can I add mouse motion listener to a picture
    // setLayout(null);
}


JLabel status = null;

class giraffemousehandler extends MouseAdapter implements MouseListener, MouseMotionListener { //MouseAdapter makes it so that you don't have to have all 7 implemented mouse listener methods

    @Override
    public void mouseMoved(MouseEvent e) {
        // TODO Auto-generated method stub
        status.setBounds(e.getX(), e.getY(), 50, 60); //Makes JLabel follow mouse

    }

    @Override
    public void mouseEntered(MouseEvent e) {

        status.setText("Enter);

    }

    @Override
    public void mouseExited(MouseEvent e) {

        status.setText("Exit");
        // status.setBounds(e.getX(), e.getY(), 5, 6);

    }

}
}

这里是Camickr请求的代码,请注意有两个单独的鼠标监听器,我很想知道如何做到这一点。当JLabel跟随鼠标时,1)它离鼠标非常远,2)它不会显示完整的JLabel和3)在一次退出/进入后它不会改变。我非常感谢您的帮助,下面是基于camickrs建议的代码:

import java.awt.GridLayout;
import java.awt.event.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;

class SSCCE extends JDialog {

public SSCCE() {
    JDialog giraffewindow = new JDialog();

    Icon giraffe = new ImageIcon(getClass().getResource("giraffe.png"));
    Icon windows = new ImageIcon(getClass().getResource("windows.png"));

    giraffewindow.setLayout(new GridLayout(1, 2, 0, 0));
    JLabel giraffelabel = new JLabel();
    JLabel windowlabel = new JLabel();

    windowlabel.setIcon(windows);
    giraffelabel.setIcon(giraffe);

    giraffewindow.add(windowlabel);
    giraffewindow.add(giraffelabel);

    giraffewindow.setTitle("Title!");
    giraffewindow.setSize(1100, 600);
    giraffewindow.setVisible(true);
    giraffewindow.setDefaultCloseOperation(DISPOSE_ON_CLOSE);

    JPanel glass = ((JPanel) giraffewindow.getGlassPane()); //Glasspane
    glass.setVisible(true);

    status = new JLabel("I can change"); //This is the JLabel which should follow my mouse

    glass.add(status);
    glass.setLayout(null);

    giraffemousehandler giraffemouse = new giraffemousehandler();
    windowmousehandler windowmouse = new windowmousehandler();

    windowlabel.addMouseListener(windowmouse);
    giraffelabel.addMouseMotionListener(giraffemouse); //Can I add mouse motion listener to a picture

    // setLayout(null);
}

JLabel status = null;

class giraffemousehandler extends MouseAdapter implements MouseListener, MouseMotionListener { //MouseAdapter makes it so that you don't have to have all 7 implemented mouse listener methods

    @Override
    public void mouseMoved(MouseEvent e) {
        // TODO Auto-generated method stub
        status.setBounds(e.getX(), e.getY(), 50, 60); //Makes JLabel follow mouse

    }

    @Override
    public void mouseEntered(MouseEvent e) {

        status.setText("Mouse is on giraffe");

    }

    @Override
    public void mouseExited(MouseEvent e) {

        status.setText("Mouse has left giraffe");
        // status.setBounds(e.getX(), e.getY(), 5, 6);

    }

}

class windowmousehandler extends MouseAdapter implements MouseListener, MouseMotionListener {
    public void mouseMoved(MouseEvent event) {
        // TODO Auto-generated method stub
        status.setBounds(event.getX(), event.getY(), 50, 60); //Makes JLabel follow mouse

    }

    public void mouseEntered(MouseEvent event) {

        status.setText("Mouse is on window");

    }

    @Override
    public void mouseExited(MouseEvent event) {

        status.setText("Mouse has left window");
        // status.setBounds(e.getX(), e.getY(), 5, 6);

    }
}
}

public class Icallsscce {
    public static void main(String [] args) {
        SSCCE object = new SSCCE();
    }
}

共有1个答案

朱慈
2023-03-14

如果你真正理解你想要实现的目标,几乎每一个问题都可以在10-50行代码中演示出来。

不。组件就是组件,你不能把一个组件一分为二。

您有几个选择:

编辑:

如何将getSource()方法添加到MouseEvent中?

10天前就已经回答了这个问题:在JLabel上翻转,它由网格布局中的图像组成?。

当你甚至不看代码时,它会变得很烦人,因为它不是一个完整的程序。我们不是来给你写代码的。当有人花时间回答一个问题时,你至少要花时间理解这个建议。

1)离老鼠极远,

我在这个问题中已经回答过了。我声明您需要添加标签的“x”值..。您需要这样做,因为鼠标事件是相对于侦听器添加到的组件生成的。

popupLabel.setLocation(e.getX() + giraffe.getLocation().x, e.getY());

2)它不显示完整的JLabel

因为您在setBounds()方法中使用了“神奇的数字”。为什么要用像“60”这样的数字来表示标签的宽度?不要硬编码数字。相反,当您更改标签的文本时,您可以执行以下操作:

label.setText(....);
label.setSize(label.getPreferredSize());

现在标签将具有适当的宽度/高度。然后,在玻璃窗格上移动标签时,只需使用setlocation(...)方法定位标签。

您要实现一个MouseListener和一个MouseMotionListener,因此需要将这两个监听器添加到每个组件中。所以你需要:

长颈鹿。addmouselistener(...);长颈鹿。addmousemotionListener(...);AddMouseListener(...);Window.AddMousEmotionListener(...);

同样,请记住,您只需要一个类来实现MouseListener和MouseMotionListener,就像10天前演示的那样。监听器的同一个实例可以添加到两个组件中,这将有助于清理代码。

 类似资料:
  • 问题内容: 关于此的几个问题: 这是好习惯吗? 它将大规模地缩短加载时间吗? 会导致浏览器“崩溃”吗? JavaScript(/ jQuery)中的最后一个函数是否也是如此? 我的意思是这样的: 问题答案: 这是好习惯吗? 手动排除分号不是一个好习惯。这纯粹是因为添加更多样式时很容易忽略,尤其是在团队中工作时: 假设您从以下内容开始: 然后有人添加了一些样式: 突然,另一个开发人员在浪费时间弄清楚

  • 本文向大家介绍我们可以在Java中的另一个try catch块中声明一个try catch块吗?,包括了我们可以在Java中的另一个try catch块中声明一个try catch块吗?的使用技巧和注意事项,需要的朋友参考一下 是的,我们可以 在另一个try-catch块中声明一个try-catch块,这称为嵌套try-catch块。 嵌套的尝试捕获块 如果一个内部的try statemen牛逼没

  • 本文向大家介绍一个try块在Java中可以有多个catch块吗?,包括了一个try块在Java中可以有多个catch块吗?的使用技巧和注意事项,需要的朋友参考一下 是的,单个try块可以有多个catch块。 示例 以下Java程序包含一个数字数组(显示)。从用户那里,它接受此数组中的两个位置,然后将第一个位置的数字除以第二个位置的数字。 输入值时- 如果选择的位置不在显示的数组中,则抛出Array

  • 可能重复: 如何在Java中将字符串转换为int? 我的代码应该读取字符串,然后采取相应的操作,但如果字符串是一行数字,我需要这一行作为一个完整的数字(一个int)而不是作为一个字符串,这可以做到吗?

  • 是否有一种明智的方法让一个perl6模块检查另一个perl6模块的存在,并在安装时“使用”它? 像这样的。。。 其思想是传播操作符重载(中缀: (请不要拆掉排水管,因为我怀疑总有办法!)

  • 我安装了Windows和Linux双系统 ,Windows系统崩了, 但是Linux系统还能运行, 我想在Linux上,直接把Windows安装的iso镜像文件,写入Windows所在分区. 该如何做? dd命令可以吗?但是dd命令好像不能操作分区吧