【发布时间】:2015-01-07 15:23:36
【问题描述】:
我目前正在尝试将我的JFrame 上显示的光标更改为一些文本,例如“请稍等,您的工作正在完成”,而某个button 的actionPerformed() 方法正在执行。到目前为止,我发现的唯一解决方案是将Cursor 更改为包含我想要的文本的Image。代码如下:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.geom.Ellipse2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.nio.file.Paths;
import javax.imageio.ImageIO;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
public class Hasikome extends JFrame{
static Cursor cursor;
private static final long serialVersionUID = 1L;
public static void main(String[] args) {
final Hasikome hasi = new Hasikome();
hasi.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
hasi.setSize(new Dimension(1200, 1200));
hasi.setPreferredSize(new Dimension(500, 500));
Toolkit kit = Toolkit.getDefaultToolkit();
Dimension dim = kit.getBestCursorSize(16, 16);
BufferedImage buffered = null;
try {
buffered = ImageIO.read(new File(Paths.get("").toAbsolutePath().toString() + "\\belge.png"));
} catch (IOException e) {
e.printStackTrace();
}
java.awt.Shape circle = new Ellipse2D.Float(0, 0, dim.width - 1, dim.height - 1);
Graphics2D g = buffered.createGraphics();
g.setColor(Color.BLUE);
g.draw(circle);
g.setColor(Color.RED);
hasi.add(new JButton(new AbstractAction() {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
hasi.setCursor(cursor);
try {
Thread.sleep(10000);
} catch (InterruptedException e1) {
e1.printStackTrace();
} finally {
hasi.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
}
}), BorderLayout.NORTH);
int centerX = (dim.width - 1) /2;
int centerY = (dim.height - 1) / 2;
g.drawLine(centerX, 0, centerX, dim.height - 1);
g.drawLine(0, centerY, dim.height - 1, centerY);
g.dispose();
cursor = kit.createCustomCursor(buffered, new Point(centerX, centerY), "myCursor");
hasi.pack();
hasi.setVisible(true);
}
}
这段代码的问题是Dimension dim = kit.getBestCursorSize(16, 16); 这行总是在Windows 上生成大小为32x32 的Cursor,它依赖于平台。我不能使用超过 32x32 的值,否则我会得到 cursor = kit.createCustomCursor(buffered, new Point(centerX, centerY), "myCursor"); 行的异常。而且因为我使用了相当长的文本 (250x16),所以我无法正确地将 text image 显示为 Cursor。
此解决方案不是必需的,我想要完成的是在执行某些 Button 的 actionPerformed() 方法时向用户显示文本为 Cursor。有什么办法可以做到这一点吗?提前致谢。
【问题讨论】: