Swing Wo ist die Taskleiste?

Status
Nicht offen für weitere Antworten.

pinerski

Mitglied
Hallo,

schreibe gerade eine Applikation, die herausfinden soll, wo die (Windows) Taskleiste sich befindet und welche Maße sie hat.

Es geht darum, dass wenn ich in einem JFrame auf ein Textfeld klicke soll sich darunter eine Dialog öffnen, wenn Dialog sich aber mit der Taskleiste schneidet, dann soll es sich nach oben öffnen.

Hier mein Lösungsansatz um herauszufinden welche Fläche auf dem Bildschirm mir zur verfügung steht:


FrameInfoMax.java
Java:
package dimensionen;

import java.awt.BorderLayout;

import javax.swing.JPanel;
import javax.swing.JFrame;

public class FrameInfoMax extends JFrame {

	private static final long serialVersionUID = 1L;

	private JPanel jContentPane = null;

	public FrameInfoMax() {
		super();
		initialize();
	}

	private void initialize() {
		this.setContentPane(getJContentPane());
		this.setTitle("Frame Max");
		this.setUndecorated(false);
		this.setExtendedState(JFrame.MAXIMIZED_BOTH);
	}

	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jContentPane = new JPanel();
			jContentPane.setLayout(new BorderLayout());
		}
		return jContentPane;
	}

	public int getPositionX() {
		return this.getLocationOnScreen().x + getOffset();
	}

	public int getPositionY() {
		return this.getLocationOnScreen().y + getOffset();
	}

	public int getDimensionWidth() {
		return this.getSize().width - (2 * getOffset());
	}

	public int getDimensionHeight() {
		return this.getSize().height - (2 * getOffset());
	}

	private int getOffset() {
		return jContentPane.getLocationOnScreen().x - this.getLocationOnScreen().x;
	}
}

Dazu öffne ich jedesmal ein jFrame im Maximalen zustand und gib dann die Maße aus.
Finde es etwas zu umständlich, funktioniert aber.
Vielleicht hat jemand eine andere Idee....

Java:
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
hiermit bekomme ich leider nur die absoluten Maße meines Bildschirms.


Hier noch die Main-Class

MainInfoAusgabe.java
Java:
package dimensionen;

import java.awt.Point;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

public class FrameInfoAusgabe implements WindowListener {

	private FrameInfoMax fMax = null;

	public Point LO = null;

	public Point RO = null;

	public Point LU = null;

	public Point RU = null;

	public FrameInfoAusgabe() {
		fensterOeffnen();
	}

	public static void main(String[] args) {
		new FrameInfoAusgabe();
	}

	public void windowOpened(WindowEvent arg0) {
		setzeWerte(arg0);
	}

	private void fensterOeffnen() {
		if (fMax == null) {
			fMax = new FrameInfoMax();
			fMax.addWindowListener(this);
			fMax.setVisible(true);
		}
	}

	private void fensterSchliessen() {
		if (fMax != null) {
			fMax.setVisible(false);
			fMax.dispose();
			fMax = null;
		}
	}

	private void setzeWerte(WindowEvent arg0) {
		LO = new Point(fMax.getPositionX(), fMax.getPositionY());
		RO = new Point((fMax.getDimensionWidth() + fMax.getPositionX()), fMax.getPositionY());
		LU = new Point(fMax.getPositionX(), (fMax.getDimensionHeight() + fMax.getPositionY()));
		RU = new Point((fMax.getDimensionWidth() + fMax.getPositionX()), (fMax.getDimensionHeight() + fMax
				.getPositionY()));
		fensterAusgabe();
		fensterSchliessen();
	}

	public void fensterAusgabe() {
		System.out.println("LO: " + LO.x + " " + LO.y);
		System.out.println("RO: " + RO.x + " " + RO.y);
		System.out.println("LU: " + LU.x + " " + LU.y);
		System.out.println("RU: " + RU.x + " " + RU.y);
	}

	public void windowClosed(WindowEvent arg0) {
	}

	public void windowClosing(WindowEvent arg0) {
	}

	public void windowDeactivated(WindowEvent arg0) {
	}

	public void windowDeiconified(WindowEvent arg0) {
	}

	public void windowIconified(WindowEvent arg0) {
	}

	public void windowActivated(WindowEvent arg0) {
	}

}
 
wieso im Dialog nicht setLocationRelativeTo(null); ?
Das macht doch eigentlich genau das, was du möchtest oder nicht?
*kopfkratz*
 
Hab es gerade mit
Java:
meinDialog.setLocationRelativeTo(jTextField);
ausprobiert.

Klappt aber leider nicht den meinDialog verdeckt dann das jTextField, es sollte sich aber darunter öffnen. Und die Taskleiste wird auch nicht beachtet, spricht meinDialog ist somit teilweise unter der Taskleiste.
 
Hat es einen bestimmten Grund, wieso du dieses Textfeld als "Anker" benutzt?
Was soll das bringen?
Beschreib uns dochmal genauer, was du vorhast
 
Also ich möchte eine Application schreiben um z.B Termine zu speicheren.

Jetzt habe ich im Hauptfenster ein Textfeld, wo ich ein Datum eingeben kann. Um das ganze etwas benutzerfreundlicher zugestalten habe ich in einem Dialogfenster einen kleinen Kalender programmiert. Wenn ich nun auf dem Button neben den Textfeld klicke soll sich nun das Dialogfenster öffnen, um dann das Datum auszuwählen.

Lade mal 2 Screenshots mit hoch.

Wenn das Hauptfenster nun zu tief ist wie in Bild2 dann soll es sich eben über dem Textfeld öffnen.
 

Anhänge

  • bild1.jpg
    bild1.jpg
    24 KB · Aufrufe: 56
  • bild2.jpg
    bild2.jpg
    21,1 KB · Aufrufe: 48
Du könntest
Component (Java 2 Platform SE v1.4.2))
auf das Textfeld abfragen, die Auflösung vom Bildschirm haste ja.
Dann sagste einfach, wenn das Textfeld näher als xx Pixel am Bildschirmboden ist, dann setze es nach oben, ansonsten nach unten


edit: getLocationOnScreen(), scheiss Link
 
Zuletzt bearbeitet:
Naja wie oben gesagt mein Problem ist, wenn ich die genauen Maße vom Bildschirm haben möchte (ohne Taskleiste), dann muss ich erstmal mit
setExtendedState(JFrame.MAXIMIZED_BOTH);
ein FensterMaximieren die Maße vom Fenster abfrage und dann das Fenster wieder schliessen. Somit kommt es dann immer kurz zum flackern.
 
Also hast du auch keine Ahnung🙁. Sehe ich das richtig?

Vielleicht gibt es ja jemand anderes der eine Idee hat?
 
Naja wie oben gesagt mein Problem ist, wenn ich die genauen Maße vom Bildschirm haben möchte (ohne Taskleiste), dann muss ich erstmal mit
setExtendedState(JFrame.MAXIMIZED_BOTH);
ein FensterMaximieren die Maße vom Fenster abfrage und dann das Fenster wieder schliessen. Somit kommt es dann immer kurz zum flackern.


Dann mach das doch ein einziges mal bei Programmstart und nicht "ständig". So oft wird die Lage und Größe der Taskleiste nicht ändern.

Allerdings könnte ich mir vorstellen dass es eine Methode gibt mit der du den Nutzbaren Desktopbereich raus bekommst.

- Alex

[update]

Siehe zweiter Post: Java Desktop Applications - need help @ windows screen-size (excluding size of taskbar)
 
Zuletzt bearbeitet von einem Moderator:
am einfachsten nimmst du swingx und nimmst den JXDatePicker sieht nicht schlecht aus und erledigt das alles für dich 😉
 
Nach langen suchen hab ich jetzt die Lösung.

Einfach in eineim JFrame folgendes abfragen

Java:
GraphicsConfiguration gc = this.getGraphicsConfiguration();
		
		Insets insects = Toolkit.getDefaultToolkit().getScreenInsets(gc);

		System.out.println("insects:::"+insects);

und schon weiß man wo sich die Taskleiste sich befindet und wie breit sie ist.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben