Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 更改光标以在JFrame中切换某些坐标_Java_Swing_Cursor_Jframe - Fatal编程技术网

Java 更改光标以在JFrame中切换某些坐标

Java 更改光标以在JFrame中切换某些坐标,java,swing,cursor,jframe,Java,Swing,Cursor,Jframe,我有一个布尔值,当鼠标在JFrame内的设置坐标范围内时会发生变化,然后我的run方法中有一个if,这样我就可以更改光标,但是我找不到任何地方可以在不使用列表或对象的情况下更改光标。如果不使用JFrame以外的对象,如何更改光标?我不太清楚为什么需要“不”使用其他对象。如果您愿意使用像JPanel这样的东西,您的代码可能会变得非常简单。例如,您可以将JPanel添加到相关区域,然后设置一个光标,以便每次光标进入或离开该swing组件时都能识别。比如, import java.awt.*; imp

我有一个布尔值,当鼠标在JFrame内的设置坐标范围内时会发生变化,然后我的run方法中有一个if,这样我就可以更改光标,但是我找不到任何地方可以在不使用列表或对象的情况下更改光标。如果不使用JFrame以外的对象,如何更改光标?

我不太清楚为什么需要“不”使用其他对象。如果您愿意使用像
JPanel
这样的东西,您的代码可能会变得非常简单。例如,您可以将
JPanel
添加到相关区域,然后设置一个光标,以便每次光标进入或离开该swing组件时都能识别。比如,

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;


public class ExampleClass{    

    public static void main(String args[]){

        JFrame exampleFrame = new JFrame("Test");          
        exampleFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        exampleFrame.setLayout(new FlowLayout());
        exampleFrame.setSize(300, 300);

        JPanel redPanel = new JPanel();
        redPanel.setBackground(Color.RED);
        redPanel.setPreferredSize(new Dimension(150, 300));
        redPanel.setCursor(new Cursor(Cursor.HAND_CURSOR)); // This one line changes the cursor.

        exampleFrame.add(redPanel);
        exampleFrame.setVisible(true);            
    }
}
尽管完全有可能按照你的要求去做,但听起来似乎比看到结果所需的要详细得多/可读性要差得多。
JPanel甚至不需要使用不同的颜色,用户可以完全看不见它(
redPanel.setOpaque(false);
就可以了)

运行上面的示例代码显示了一个带有一个集中的红方块的
JFrame
(JPanel
redPanel)。将鼠标移到红方块上会更改光标


如果由于某种原因,上述方法不切实际,或者您的程序设计在很大程度上是按照它的方式设置的,那么您可以使用相对于
JFrame
的绝对坐标。为JFrame创建一个
MouseMotionListener
,如下所示

class CursorMouseMotionListener implements MouseMotionListener{

    JFrame yourFrame;

    CursorMouseMotionListener(JFrame yourFrame){
        this.yourFrame = yourFrame;
    }

    @Override
    public void mouseDragged(MouseEvent e) {
        // Do nothing.
    }
    /// The important bit below
    @Override
    public void mouseMoved(MouseEvent e) {
        if(e.getPoint().x >= 50 && e.getPoint().x <=150 && e.getPoint().y >= 50 && e.getPoint().y <=150){
            yourFrame.setCursor(new Cursor(Cursor.HAND_CURSOR));
        }
        else{
            yourFrame.setCursor(new Cursor(Cursor.MOVE_CURSOR));
        }
    }

}

当然,你必须改变坐标,以匹配你的按钮位置,但你的好。如果你能避免的话,我还是不会建议这种方法。最好使用您可以随意使用的swing组件。但是,如果您确实需要使用当前程序,那么这应该可以工作。

“如果不使用JFrame以外的对象,我如何更改光标?”为什么“不使用对象”?这看起来像是一个经典。我只是JFrame中的一个鼠标听筒,当我在某个区域单击时,我有一些代码可以更改某些内容,但我需要弄清楚如何在这些区域将鼠标更改为手。我不确定为什么需要“不”使用其他对象/组件。一些示例代码,展示您尝试过的内容可能会有所帮助。原因是我在该类中已经有大约1000行代码,并且我使用坐标作为参考buttons@silverlight513-我假设你用一张图片作为背景,其中包括按钮外观等。如果您已经能够检查鼠标位置,并且它是否已经在按钮上,那么您所需要做的就是为帧设置
光标
,如果
您在这些区域内
否则
使用
frame.setCursor()保持正常。我已经编辑了我的问题,加入了一个你可能会用到的备选方案。这正是我正在做和寻找的,非常感谢。
frame.addMouseMotionListener(new CursorMouseMotionListener(frame));