Пользовательский курсор Java не будет работать на новом компьютере

Недавно я купил новый компьютер и перенес свои проекты со старого на новый. Я сделал компиляцию всех своих проектов, и все они работали нормально, и большинство из них все еще работают на моем новом компьютере, но в одном проекте, в частности, не отображался пользовательский курсор, который я переместил. Я убедился, что переместил изображение с проектом, чтобы исключить это. Я переписал исходный код, чтобы он соответствовал новому местоположению на моем новом компьютере, но он по-прежнему не отображается. Это дает мне сообщение об ошибке:

Exception in thread "main" java.lang.IndexOutOfBoundsException: invalid hotSpot
    at sun.awt.CustomCursor.<init>(Unknown Source)
    at sun.awt.windows.WCustomCursor.<init>(Unknown Source)
    at sun.awt.windows.WToolkit.createCustomCursor(Unknown Source)
    at wtalfvn.Window.<init>(Window.java:32)
    at wtalfvn.Main.main(Main.java:9)

Мой старый компьютер 32-битный, а мой новый 64-битный, оба работают на Windows 7, я использую eclipse Kepler, но имеет ли это значение при использовании Cursor и Toolkit?

Вот мой код, который я использовал для создания своего курсора

Image cursor = Toolkit.getDefaultToolkit().getImage("graphx/PNG/cursor.png");
Cursor c = Toolkit.getDefaultToolkit().createCustomCursor(cursor,new Point(this.getX(),this.getY()), "cursor");
this.setCursor(c);

РЕДАКТИРОВАТЬ: Вот весь код для тех, кто хочет его увидеть.

import javax.swing.*;

import java.awt.*;
import java.awt.event.*;

public class Window extends JFrame{

Image ico= Toolkit.getDefaultToolkit().getImage("graphx/ico/icon.PNG");

TextBox tb=new TextBox();

public Window(){
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(800,600);
    setVisible(true);
    setFocusable(true);
    getContentPane().setBackground(Color.BLACK);
    setIconImage(ico);
    setLocationRelativeTo(null);
    setResizable(false);
    setTitle("MYTITLE");
    addKeyListener(new KeyAdapter(){
        public void keyTyped(KeyEvent e) {
            if (e.getKeyChar()==KeyEvent.VK_ESCAPE){
                System.exit(0);
            }
        }
    });
    Image cursor = Toolkit.getDefaultToolkit().getImage( getClass().getResource("/graphx/PNG/cursor.png"));
    Cursor c = Toolkit.getDefaultToolkit().createCustomCursor(cursor,new Point(this.getX(),this.getY()), "cursor");
    setCursor(c);
}
}

person Garrett    schedule 28.05.2014    source источник
comment
Добро пожаловать в Stack Overflow! Рассмотрите возможность предоставления фактического выполняемого примера, демонстрирующего вашу проблему, что потребует меньше догадок и лучших ответов.   -  person MadProgrammer    schedule 28.05.2014
comment
Весь остальной код работает, поэтому я решил не сильно беспокоить вас, ребята, скопировав весь свой код только для того, чтобы добраться до виновника. Окно работает, кастомная иконка работает, все работает кроме курсора.   -  person Garrett    schedule 28.05.2014
comment
Проблема в том, что я пытаюсь угадать, что означают this.getX и this.getY, для меня они означают расположение компонентов, но это может быть не так.   -  person MadProgrammer    schedule 28.05.2014
comment
Я отредактировал это, так что это немного проясняет ситуацию?   -  person Garrett    schedule 28.05.2014
comment
Да, getX и getY не являются подходящими методами для активной точки курсора в этом контексте.   -  person MadProgrammer    schedule 28.05.2014
comment
Все, что я знаю, это то, что это работало на 32-битной версии, без редактирования кода, но теперь это не работает на моем новом компьютере...   -  person Garrett    schedule 28.05.2014
comment
Я вижу две причины, по которым это не сработает (и по крайней мере одну, которая будет проблематичной). Поскольку разные системы/ОС работают по-разному (даже две машины с одной и той же ОС будут работать немного по-разному в зависимости от того, что они делают), вы получите разные результаты.   -  person MadProgrammer    schedule 28.05.2014


Ответы (1)


Активная точка курсора должна относиться к изображению курсора...

Вероятная причина заключается в том, что заданные координаты x/y находятся за пределами видимого диапазона изображения...

 Cursor c = Toolkit.getDefaultToolkit().createCustomCursor(cursor,new Point(this.getX(),this.getY()), "cursor");

Например, предположим, что следующий курсор имеет размер 32x32 пикселя...

КурсорПример

Горячая точка курсора будет около 26x0, это представляет собой точку, в которой будут запускаться события мыши, и Point и MouseEvent будут зарегистрированы как произошедшие.

Другая возможность заключается в том, что изображение на самом деле не было загружено...

Image cursor = Toolkit.getDefaultToolkit().getImage("graphx/PNG/cursor.png");

getImage предполагает, что значение представляет собой местоположение файла, что в этом примере означает, что файл должен находиться относительно местоположения, в котором выполняется программа.

Если изображение на самом деле является встроенным ресурсом, вы должны использовать

Image cursor = Toolkit.getDefaultToolkit().getImage(
    getClass().getResource("/graphx/PNG/cursor.png"));

или аналогичный для загрузки изображения.

Вы можете проверить это, используя ImageIO.read, так как это вызовет IOException, если изображение не может быть загружено по какой-либо причине.

person MadProgrammer    schedule 28.05.2014
comment
Хорошо, я избавился от параметров getX() и getY(), и он по-прежнему делает то же самое... Я сделал getClass().getResource() и все равно ничего. Изучив мой код (и это весь код, кроме основного класса, где я собираю все свои конструкторы в основной функции), что вы можете сказать, что нужно исправить? - person Garrett; 28.05.2014
comment
Где хранится изображение? Это в контексте Jar приложения или хранится снаружи в файловой системе - person MadProgrammer; 28.05.2014
comment
Извините, что был таким надоедливым новичком. Хотел бы я никогда не записывать это сейчас, потому что выставляю себя полным идиотом :(. - person Garrett; 28.05.2014
comment
Добро пожаловать в мой клуб, членство огромно - person MadProgrammer; 28.05.2014
comment
Он хранится как файл ресурсов в eclipse. Я использовал тот же базовый путь для своего значка, и он отлично работает. - person Garrett; 28.05.2014
comment
В качестве ресурса он должен загружаться с помощью Class#getResource. Вы заглянули в файл Jar, чтобы убедиться, что он включен? Или путь - это то, что вы ожидаете? Попробуйте вместо этого использовать ImageIO.read - person MadProgrammer; 28.05.2014
comment
Я думаю, что изображение загружается, потому что я пытаюсь убрать G в конце PNG, и курсор просто исчезает. Я постараюсь посмотреть, работает ли это. Спасибо - person Garrett; 28.05.2014
comment
Хорошо, он только начинает работать без особой причины... Спасибо за ваше время. Это просто СТРАННО........ - person Garrett; 28.05.2014