Maximale Fenstergröße bestimmen
lima-city → Forum → Programmiersprachen → Java
abstract
beispiel
code
dimension
ergebnis
import
login
methode
null
panel
pixel
problem
reihenfolge
string
swing
system
test
testen
update
url
-
Hiho,
ich habe da mal eine (wahrscheinlich) nicht ganz so triviale Frage. Und zwar kann ich ja mit
Toolkit.getDefaultToolkit().getScreenSize();
die Größe des Bildschirms bestimmen. Mein Problem ist das da die Taskleiste noch nicht rausgerechnet ist. Da diese aber immer unterschiedlich groß ist kann ich auch nicht einfach X Pixel abziehen. Habt ihr eine Idee wie ich es realisieren kann um am Ende wirklich meine Fenstergröße zu haben?
Bin für jeden Hinweis dankbar. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Moin,
wofür brauchst Du das denn?
Maximiere doch einfach einen JFrame und lies die sich daraus ergebende Fenstergröße aus?
Damit hättest Du ja die Größe die Du suchst.
Gruß,
Pawnee -
Naja theoretisch brauche ich das um in einem Maximierten JFrame (^^) Elemente in die untere Rechte Ecke zu setzen.
Das Problem verschiebt sich dadurch auf "Wie maximiere ich einen JFrame?"
Aktuell mache ich es so:
setExtendedState(JFrame.MAXIMIZED_BOTH)
Aber dabei setzt der die eigentliche Size des Frames nicht um. Daher bekomme ich mit getSize() nur 0en zurück. -
Moin,
dann machst Du irgendwas falsch.
Der folgende Code gibt mir die Größe des JFrames ohne Probleme zurück:
Gruß,import javax.swing.JFrame; public class FrameTest { public static void main(String[] args) { JFrame f = new JFrame("Test Frame"); f.setExtendedState(JFrame.MAXIMIZED_BOTH); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); System.out.println("Dimension: " + f.getSize()); } }
Pawnee -
Das ist äußerst merkwürdig. An sich habe ich eine Auflösung von 1440x900. Mit dem Toolkit erkennt er immerhin das problemlos. Wenn ich jetzt ähnlich deinem Beispiel (meine Klassenstruktur ist noch etwas umfangreicher) die Auflösung ermittle kommt 1446x906 raus.
Interessanter Weise unterscheidet sich der Wert nochmals wenn ich setResizeable() ändere. Die 1446x906 kommen raus wenn Resizeable false ist, wenn es true ist kommt 1456x876 raus. Das macht irgendwie keinen Sinn...
Ich werde das aber sicherheitshalber morgen nochmal testen. Vllt. erkennt er ja auch jetzt nur wegen meinem zweiten Bildschirm komische Werte. Was jedoch trotzdem doof wäre...
Wenn das auch nicht klappt probiere ich mal nur dein kleines Codeschnipselchen zu nutzen. Mal sehen was er dann ausspuckt....könnte ja auch an meiner Klassenstruktur drumherum liegen... -
Moin,
Du könntest auch einfach mal Deinen Code zeigen, vielleicht hat sich ja ein Fehler eingeschlichen.
Gruß,
Pawnee -
Okay auf deine Verantwortung :) . Habe leider seit 3 Jahren nichts mehr mit Java gemacht, daher bin ich mir bei vielem nicht so sicher...
Also hier steckt das JFrame drin.
package rmanager; import rabstracts.Gamestate; import java.util.ArrayList; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import javax.swing.JFrame; import rjava.Charselector; import rjava.Login; import rjava.Maingame; /** * * @author loadi */ public class Statemanager { private static int activeState = 0; private static ArrayList<Gamestate> states = new ArrayList<Gamestate>(); private static boolean init = false; private static JFrame window = new JFrame(); private static ExecutorService executor = Executors.newCachedThreadPool(); public static enum stateNubers { LOGIN, CHARSELECTOR, GAME }; public static void init() { window.setTitle("16 Reiche"); states.add(new Login()); states.add(new Charselector()); states.add(new Maingame()); init = true; } public static Gamestate getActiveState() { if (!init) { init(); } return states.get(activeState); } public static void setActiveState(stateNubers activeState) { if (!init) { init(); } Statemanager.activeState = Statemanager.stateNubers.valueOf(activeState.toString()).ordinal(); } public static JFrame getWindow() { return window; } public static void setWindow(JFrame window) { Statemanager.window = window; } public static ExecutorService getExecutor() { return executor; } public static void switchToState(stateNubers newState) { if (getActiveState() != null) { getActiveState().stop(); } window.setTitle("16 Reiche"); setActiveState(newState); getExecutor().execute(getActiveState()); } }
Das ist ein Gamestate in dem das JFrame benutzt wird... gibt noch mehr, aber da diese ähnlich aufgebaut sind dürfte einer reichen.
package rjava; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import javax.swing.JFrame; import javax.swing.JPanel; import rabstracts.Gamestate; import rmanager.Globals; import rmanager.Statemanager; import rparts.Chat; /** * * @author loadi */ public class Maingame extends Gamestate { private JPanel panel = new JPanel(null); private Chat chat = new Chat(panel); private ExecutorService executor = Executors.newCachedThreadPool(); @Override public void draw() { Statemanager.getWindow().setVisible(true); Statemanager.getWindow().setExtendedState(JFrame.MAXIMIZED_BOTH); panel.setBounds(Statemanager.getWindow().getBounds()); } @Override public void init() { Statemanager.getWindow().setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Statemanager.getWindow().setResizable(false); Statemanager.getWindow().add(panel); executor.execute(chat); } @Override public void logic() { } @Override public void update() { } }
Als letztes ist denke ich noch die Abstrakte Klasse interessant. Da hier die Reihenfolge der Funktionsaufrufe drinsteht.
package rabstracts; import javax.swing.JFrame; import rmanager.Statemanager; /** * * @author loadi */ public abstract class Gamestate implements Runnable { /** * Gamestate initialisieren * - wichtige Variablen anlegen */ private boolean init = false; private boolean stop = false; private boolean updateDisabled = false; private long updateInterval = 500; public void stop() { this.stop = true; Statemanager.getWindow().dispose(); Statemanager.setWindow(new JFrame()); } public abstract void init(); public abstract void update(); public abstract void logic(); public void setUpdateDisabled(boolean updateDisabled) { this.updateDisabled = updateDisabled; } public void setUpdateInterval(long updateInterval) { this.updateInterval = updateInterval; } /** * Zeichnet alle bewegten Bilder */ public abstract void draw(); public void run() { this.stop = false; if (!init) { init(); init = true; } logic(); draw(); while (!stop && !updateDisabled) { if (updateInterval > 0) { try { Thread.sleep(updateInterval); } catch (InterruptedException e) { } } update(); } } }
Da die meisten anderen Klassen nichts mit dem Seitenaufbau an sich zu tun haben lasse ich die mal weg...
Habe gerade mal deinen Code ohne etwas anderes bei mir ausprobiert und auch der gibt mir falsche Daten (1456x876) ...
Im Notfall muss ich mit Fullscreen arbeiten, also setUndecorated(). -
Moin,
scheint eigentlich alles soweit zu stimmen.
Warum der Dir aber eine falsche Auflösung zurückgibt, ist mir schleierhaft.
Wie schaut es denn mit dem contentPane im JFrame aus?
Vielleicht gibt Dir das ja "bessere" Werte, wenn Du dessen Größe ermittelst.
Sofern Du das testet, mach es bitte korrekt und rufe die Maximierungs-Methode in der Reihenfolge auf wie ich es getan habe.
Man weiß nie, ob eine der Methoden buggy ist und dementsprechend ein Problem auftaucht, wenn Du nach setVisible maximierst.
Gruß,
Pawnee -
Ich habe es jetzt mal so probiert:
package rjava; import javax.swing.JFrame; import javax.swing.JPanel; public class Main { /** * @param args the command line arguments */ public static void main(String[] args) { JFrame f = new JFrame("Test Frame"); JPanel p = new JPanel(null); f.setExtendedState(JFrame.MAXIMIZED_BOTH); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); f.add(p); p.setBounds(f.getBounds()); System.out.println("Dimension: " + p.getSize()); } }
Ich hoffe das ist es was du meintest... Aber auch das gibt mir nur die altbekannten falschen Werte...
Er zieht zwar in der Höhe etwas ab nur reichen die paar Pixel nicht für meine Taskleiste...
Was sogar noch komischer ist: Woher zum Teufel bekommt er noch zusätzliche Pixel in der Breite?
Ich habe den oben stehenden Code gerade mal in einer Ubuntu VM getestet: 0x0 war die Ausgabe... Ich werde es zu Hause nochmal unter einem "richtigen" Ubuntu testen...
-
Moin,
Nein, so meinte ich das nicht, das macht Dich ja wieder vom JFrame abhängig.
Nutze ein BorderLayout und setzte das JPanel per BorderLayout.CENTER.
Wir wollen den JFrame gar nicht anfassen, da der ja wie Du sagst, falsche Werte liefert.
Komisch ist das trotzdem, da er bei mir komplett richtige Ergebnisse ausgibt.
EDIT:
Habe mal diese Methode begutachtet:
http://download.oracle.com/javase/1.4.2/docs/api/java/awt/Toolkit.html#getScreenInsets%28java.awt.GraphicsConfiguration%29
Über Umwege sollte diese Dir eigentlich das gewünschte Ergebnis liefern.
Musst Du mal im Internet nach einem verständlichen Beispiel suchen.
Gruß,
Pawnee
Beitrag zuletzt geändert: 2.12.2010 14:03:22 von pawnee -
Du bist mein Held! Wenn ich die Insets noch beachte komme ich auf genau die Position wo ich es hin haben möchte. Auch wenn ich keine Ahnung habe was das so genau macht, komme ich so zumindest schon mal unter Windows zum gewünschten Ergebnis.
Also zusammenfassend:
Ich bestimme die Größe des Frames und ziehe bei der Weite sicherheitshalber noch die Insets rechts ab und bei der Höhe die Insets unten. -
Wunderbar.
Dann schließe ich hiermit das Thema.
Sofern noch Verbesserungsvorschläge bzw. Anregungen Deinerseits vorzubringen sind, schick' mir bitte eine Nachricht.
Gruß,
Pawnee -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage