Недавно я купил новый компьютер, и я перевел свои проекты с моего старого на новый. Я сделал компиляцию по всем моим проектам, и все они отлично работали, и большинство из них все еще работают на моем новом компьютере, но в одном проекте, в частности, не будет отображаться пользовательский курсор, который я переместил. Я убедился, что я перенес картину с проектом, чтобы это исключить. Я переписал источник, чтобы соответствовать новому местоположению на моем новом компьютере, но он все равно не будет отображаться. Это дает мне сообщение об ошибке:
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);
EDIT: Вот код для тех, кто хочет его увидеть.
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);
}
}
Горячая точка курсора должна относиться к изображению курсора...
Вероятная причина заключается в том, что заданные координаты 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
если изображение не может быть загружено по какой-либо причине