[Java] JField + KeyListener

DragonIce

Commander
Registriert
Okt. 2006
Beiträge
2.585
Guten Morgen,

ich habe mir ein kleines Tool geschrieben. Dabei handelt es sich um eine sog. Topclock.
Der JFrame springt an den beiden oberen Bildschirmecken via MouseMotionListener hin und her. Jetzt möchte eine Vergrößerung & Verkleinerung des Fensters einbauen. Das sollte so ablaufen, dass wenn ich den Frame / das Feld mit dem Mauszeiger berühre und die Taste strg gedrückt habe, es sich nach gewissen Regeln (die ich alle schon habe) vergrößert bzw. verkleinert.
Jetzt stellt sich mir die Frage wo ich den KeyListener einbauen muss.
Muss ich den in den MouseMotionListener einbauen oder auf das Feld direkt?

Im Anhang nur einmal schnell mein Code für das zu behandelnde JField
Code:
private JTextField getJclockTextField() {
    if (jclockTextField == null) {
        jclockTextField = new JTextField();
        jclockTextField.setEditable(false);
        [B][...][/B]
        [B]jclockTextField.addMouseMotionListener[/B](new MouseMotionAdapter() {
            public void mouseMoved(MouseEvent arg0) {
                setHeightResolution(Toolkit.getDefaultToolkit().getScreenSize().height);
                setWidthResolution(Toolkit.getDefaultToolkit().getScreenSize().width);
                setMouseXPos(arg0.getXOnScreen());
                setMouseYPos(arg0.getYOnScreen());
                checkMousePosition();
            }
        });
    }
    return jclockTextField;
}

Vielen Dank im Voraus
 
wenn ich richtig verstanden habe musst du einfach bei der event abfrage (if(....))noch ein
&& "taste strg-taste gedrückt"
dazuschreiben!?
 
Ne das ist es nicht - Das if (jclockTextField == null) { [...] schaut nur nach
ob ich bereits ein Feld erzeugt habe oder nicht. Ich muss es schon irgendwie mit dem MouseMotionListener in Verbindung bringen.
 
ehm ich würde des vlt so realisieren:
du hast ja die platzierungen von deinem TextField (oder was des war) jetzt machste das halt so das du einen Mouse Event listener hast, wenn du klickst, mus du ihn abfragen lassen ob die position des klicks innerhlab des feldes wahr, wenn das stimmt und zusätzlich die strg taste gedrückt ist, soll er die frame größe verändern...
weil ansonsten verbringt das programm den größten anteil damit abzufragen wo sich grade die mouse befindet, denkemal das das sehr CPU belastend ist ;)
 
Ich kann in dem Feld auf Grund des MouseMotionListeners "nicht klicken". Man ist nicht so schnell..
Er berechnet auch nur die Mausposition wenn ich sie über den JFrame bzw. das JField bewege.
Die Belastung hält sich also in Grenzen.
Und meine Frage ist ja wo ich den KeyListener ansetzen muss...
 
Hab mal was geschrieben, hoffe es entspricht Deinen wünschen ;) :
Sobald der Zeiger über dem Feld ist und du STRG drückst verkleinert sich das Fenster.

MfG m3x

Code:
import java.awt.Dimension;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.PointerInfo;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class GUIResize extends JFrame implements KeyListener {

	private static final long serialVersionUID = 1L;
	
	/*
	 * Fensteroffset
	 * Zum Bestimmen den Mauszeiger auf die obere, linke ecke im Fensterinneren Zeigen,
	 * bei druck auf Strg muss in der Konsole die Position "0.0 0.0" erscheinen.
	 */
	private int offsetX = 3;
	private int offsetY = 29;

	private int breite = 400;
	private int hoehe = 250;
	private JTextField tf;
	Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

	public GUIResize() {
		this.setTitle("Test");
		this.setResizable(false);
		this.setSize(breite, hoehe);
		this.setLayout(null);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);

		// Ausrichten des Frames auf die mittige Position des Fensters
		setBounds((screenSize.width / 2) - (breite / 2),
				(screenSize.height / 2) - (hoehe / 2), breite, hoehe);

		tf = new JTextField(200);
		tf.setBounds(10, 10, 200, 20);
		add(tf);

		tf.addKeyListener(this);
	}

	public static void main(String[] args) {
		GUIResize gui = new GUIResize();
		gui.setVisible(true);
	}

	public void keyPressed(KeyEvent e) {
		if (e.getKeyCode() == 17) {
			PointerInfo info = MouseInfo.getPointerInfo();
			Point place = info.getLocation();
			double x = place.getX() - (screenSize.width / 2) - (breite / 2)
					+ breite - offsetX;
			double y = place.getY() - (screenSize.height / 2) - (hoehe / 2)
					+ hoehe - offsetY;

	
			System.out.println("Position: "+x+" "+y);
			if ((x >= tf.getX()) && (x <= tf.getWidth()) && (y >= tf.getY())
					&& (y <= tf.getHeight())) {

				// Operator für Groeßenaenderung
				this.setSize(this.getWidth() - 10, this.getHeight() - 10);
			}

		}

	}

	public void keyReleased(KeyEvent f) {
		// TODO Auto-generated method stub

	}

	public void keyTyped(KeyEvent g) {
		// TODO Auto-generated method stub

	}
}

EDIT: Sehe garde du wolltest das die Maus nur des Frame berühren soll. Einfach sagen das X größer gleich 0 und kleiner gleich deine Fenster breite sein soll, das gleiche gilt auch für die Höhe
 
Zuletzt bearbeitet:
Ahoi,

ich hab mir das von dir angeschaut und ein wenig umgebaut.
Die Idee den KeyListener als Schnittstelle laufen zu lassen hat mir gefehlt ;)
Auf jeden Fall vielen Dank für deine Geduld und deine Hilfe :)
Hab es jetzt vernünftig gelöst... Müsste nur den Quelletxt bissel säubern :D
 
Zurück
Oben