특정 button
의 actionPerformed()
메서드가 실행되는 동안 현재 내 JFrame
에 표시된 커서를 "작업 완료 중입니다"와 같은 텍스트로 변경하려고합니다. 내가 찾은 유일한 해결책은 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);
}
}
문제는이 라인은 항상 Windows
에 크기 32 × 32로 Cursor
를 생성하고 플랫폼에 의존 Dimension dim = kit.getBestCursorSize(16, 16);
이다. 32x32 이상 값을 사용할 수 없으면 cursor = kit.createCustomCursor(buffered, new Point(centerX, centerY), "myCursor");
행에 대해 예외가 발생합니다. 그리고 합리적으로 긴 텍스트 (250x16)를 사용하기 때문에 text image
을 Cursor
으로 올바르게 표시 할 수 없습니다.
이 솔루션은 필연적으로 사용자에게 Cursor
으로 텍스트를 표시하고 일부는 Button
의 actionPerformed()
메서드가 실행되는 동안 필요하지 않습니다. 내가 이것을 할 수있는 방법이 있습니까? 미리 감사드립니다.
이것은 올바른 생각이지만 setCursor 함수 주위에서 SwingUtilities.invokeLater를 사용해야하고 비 -ui 스레드에서 doProcessing()을 수행해야합니다. – ControlAltDel
선택 사항이 내 것이었을 경우에만 이것도 사용했습니다. 그러나 요구 사항은 위의 내 질문에 대한 답변을 찾기 위해 나를 이끌었다. 이 모든 답변과 내가 찾고있는 답변은 운영상의 차이가 있지만 시각적 인 차이는 없습니다. – halil