Hey,
ich hab ein für mich nicht erklärbares Problem in meiner Anwendung:
Ich hab mir eine Klasse extends JFrame gemacht, die zwei Methoden anbietet um das Frame zu (ent-)sperren. Wenn es gesperrt ist wird ein Layer drübergelegt und es sollte der Wait-Cursor angezeigt werden, beim Entsperren soll der Layer verschwinden und der Cursor wieder normal werden.
Allerdings funktionieren die setCursor() Aufrufe irgendwie genau falsch rum, d.h. während es gelockt ist wird der normale Cursor angezeigt, und nach dem unlock auf einmal der Wait-Cursor.
Hier mal diese Klasse als KSKB mit ner main-Methode:
Seht ihr den Fehler?
Danke!
ich hab ein für mich nicht erklärbares Problem in meiner Anwendung:
Ich hab mir eine Klasse extends JFrame gemacht, die zwei Methoden anbietet um das Frame zu (ent-)sperren. Wenn es gesperrt ist wird ein Layer drübergelegt und es sollte der Wait-Cursor angezeigt werden, beim Entsperren soll der Layer verschwinden und der Cursor wieder normal werden.
Allerdings funktionieren die setCursor() Aufrufe irgendwie genau falsch rum, d.h. während es gelockt ist wird der normale Cursor angezeigt, und nach dem unlock auf einmal der Wait-Cursor.
Hier mal diese Klasse als KSKB mit ner main-Methode:
Java:
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class LockableJFrame extends JFrame {
public static void main(String[] x){
Runnable init = new Runnable() {
public void run() {
final LockableJFrame frame = new LockableJFrame ();
frame.setSize(500,500);
frame.setVisible(true);
frame.lock("Loading settings...");
new SwingWorker<Void, Void>() {
@Override
protected Void doInBackground() throws Exception {
Thread.sleep(5000);
return null;
}
@Override
protected void done() {
frame.unlock();
}
}.execute();
}
};
SwingUtilities.invokeLater(init);
}
private LockPane lockPane;
public LockableJFrame() {
super();
setupGlassPane();
}
public LockableJFrame(String title) {
super(title);
setupGlassPane();
}
private void setupGlassPane() {
this.lockPane = new LockPane();
setGlassPane(lockPane);
}
/**
* Must be called on EDT! Locks this frame so that user events are not
* handled, and puts a transparent layer on the frame to show the user that
* the frame is disabled.
*/
public void lock() {
this.lock(null);
}
/**
* Must be called on EDT! Locks this frame so that user events are not
* handled, and puts a transparent layer on the frame to show the user that
* the frame is disabled. In addition, a message is displayed.
*
* @param msg
* the message to display.
*/
public void lock(String msg) {
this.setEnabled(false);
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
LockPane lockPane = (LockPane) getGlassPane();
lockPane.msg = msg;
lockPane.setVisible(true);
lockPane.requestFocusInWindow();
}
/**
* Must be called on EDT! Unlocks the frame.
*/
public void unlock() {
getGlassPane().setVisible(false);
this.setEnabled(true);
setCursor(Cursor.getDefaultCursor());
requestFocus();
}
private class LockPane extends JPanel implements KeyListener {
private String msg;
private Font msgFont;
private Color msgColor;
public LockPane() {
setOpaque(false);
setFocusTraversalKeysEnabled(false);
addKeyListener(this);
setBackground(new Color(100, 100, 100, 150));
msgFont = this.getFont().deriveFont(16f);
msgColor = Color.WHITE;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
int width = getWidth();
int height = getHeight();
g.setColor(getBackground());
g.fillRect(0, 0, width, height);
if (msg != null) {
// calculate positions
g.setFont(msgFont);
FontMetrics m = g.getFontMetrics();
Point msgCenter = new Point(50,100); // dafür bräuchte man ne Hilfsklasse, is jetzt wurscht
Point boxPos = new Point(msgCenter.x - 10, msgCenter.y
- m.getAscent() - 10);
// draw message box
Color backgrnd = getBackground();
int red = backgrnd.getRed();
int green = backgrnd.getGreen();
int blue = backgrnd.getBlue();
int alpha = backgrnd.getAlpha();
g.setColor(new Color(red, green, blue,
alpha <= 205 ? alpha + 50 : 255));
g.fillRoundRect(boxPos.x, boxPos.y, m.stringWidth(msg) + 20, m
.getHeight() + 20, 10, 10);
g.setColor(msgColor);
g.drawRoundRect(boxPos.x, boxPos.y, m.stringWidth(msg) + 20, m
.getHeight() + 20, 10, 10);
// draw message text
g.setColor(msgColor);
g.drawString(msg, msgCenter.x, msgCenter.y);
}
}
@Override
public void keyPressed(KeyEvent e) {
e.consume();
}
@Override
public void keyReleased(KeyEvent e) {
e.consume();
}
@Override
public void keyTyped(KeyEvent e) {
e.consume();
}
}
}
Seht ihr den Fehler?
Danke!
Zuletzt bearbeitet: