Hallo Zusammen,
Im folgenden Beispiel versuche ich es so hinzukriegen, daß das JPanel (Variable "DrawingBoard board") innerhalb der JScrollPane immer den Fokus bekommt. (Auch dann, wenn ich z.B. das JFrame-Fenster minimiere oder hinter anderen Fenstern verstecke und dann wieder sichtbar mache). Das "Zeichenbrett" sollte dann immer auf Tastendrücke reagieren können und als Test ein schwarzes Quadrat zeichnen. Im Moment wird dieses Quadrat jedoch selbst am Anfang nicht gezeichnet, wo das Fenster noch den Fokus hat. Wäre Klasse, wenn mir da jemand helfen könnte. Vielen Dank!
Viele Grüße
Karl
Im folgenden Beispiel versuche ich es so hinzukriegen, daß das JPanel (Variable "DrawingBoard board") innerhalb der JScrollPane immer den Fokus bekommt. (Auch dann, wenn ich z.B. das JFrame-Fenster minimiere oder hinter anderen Fenstern verstecke und dann wieder sichtbar mache). Das "Zeichenbrett" sollte dann immer auf Tastendrücke reagieren können und als Test ein schwarzes Quadrat zeichnen. Im Moment wird dieses Quadrat jedoch selbst am Anfang nicht gezeichnet, wo das Fenster noch den Fokus hat. Wäre Klasse, wenn mir da jemand helfen könnte. Vielen Dank!
Viele Grüße
Karl
Code:
package tests;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class FocusTest extends JFrame {
public class DrawingBoard extends JPanel {
protected void paintComponent(Graphics g) {
super.paintComponent(g);
this.requestFocus(); // funktioniert auch nicht...
// Hier wird spaeter etwas gezeichnet.
}
};
private Dimension wndsize;
private JLabel statusbar;
private DrawingBoard board;
private JScrollPane scrollpane;
private KeyListener keycontroller = new KeyListener() {
public void keyTyped(KeyEvent e) {}
public void keyPressed(KeyEvent e) {}
public void keyReleased(KeyEvent e) {
// Testen ob Tastendruecke empfangen werden => schwarzes Quadrat zeichnen!
board.getGraphics().fillRect(10,10,50,50);
}
};
private FocusListener myfocus = new FocusListener() {
public void focusGained(FocusEvent e) {}
public void focusLost(FocusEvent e) {
// Sollte eigentlich sicherstellen, dass das "Zeichenbrett"
// immer den Focus kriegt? Funktioniert aber irgendwie nicht.
board.requestFocus();
}
};
private FocusTest(String title) {
super(title);
Dimension wndsize = Toolkit.getDefaultToolkit().getScreenSize();
wndsize.width = wndsize.width / 2;
wndsize.height = wndsize.height / 2;
this.setSize(wndsize.width, wndsize.height);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
statusbar = new JLabel();
this.getContentPane().add(statusbar, BorderLayout.SOUTH);
board = new DrawingBoard();
board.setPreferredSize(new Dimension(800, 800));
scrollpane = new JScrollPane(board);
this.getContentPane().add(scrollpane, BorderLayout.CENTER);
this.addKeyListener(keycontroller);
this.addFocusListener(myfocus);
}
public static void main(String[] args) {
Runnable guiCreator = new Runnable() {
public void run() {
FocusTest wnd = new FocusTest("FocusTest");
wnd.setVisible(true);
// setFocusable sollte laut Google irgendwie auch helfen den
// Focus nach einem Verlust zurueckzubekommen?
wnd.setFocusable(true);
}
};
try {
SwingUtilities.invokeAndWait(guiCreator);
} catch (Exception ie) {
ie.printStackTrace();
System.exit(0);
}
}
}