2011-09-13 19 views
9

Aşağıdaki Salıncak kodu benim makinede ya da benim iş arkadaşları makinelerde (tüm Windows XP & Java 6) doğru çalışmıyor:JFrame.setExtendedState (MAXIMIZED_BOTH), renklenmemiş çerçevelerle çalışır mı?

public class Test { 
    public static void main(String[] args) { 
     final JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(800, 600); 
     frame.setLayout(new FlowLayout()); 
     frame.add(new JButton(new AbstractAction("Maximize") { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       frame.setExtendedState((frame.getExtendedState() & Frame.MAXIMIZED_BOTH) == Frame.MAXIMIZED_BOTH ? JFrame.NORMAL : JFrame.MAXIMIZED_BOTH); 
      } 
     })); 
     frame.setUndecorated(true); 
     frame.setVisible(true); 
    } 
} 

Pencereden maksimize ama dikkate windows görev katmaz çubuğu (ekranı doldurur). "Frame.setUndecorated (true)" ifadesini kullanırsanız; düzgün çalışıyor gibi görünüyor.

Javadoc, bunun işe yarayacağını ima ediyor gibi görünüyor. Java'da bu bir hata mı? Belirli bir sürüm veya Windows sürümü ile sınırlı mı? Bir çözüm var mı?

few workarounds gördüm, ancak eksik görünüyorlar. Java'da kendi çerçeve süslemelerini kodlayan ilk kişi olamam.

DÜZENLEME

: OpenJDK indirme ve yerli kod kazma sonra Java Win32 işlevini SetWindowPlacement çağırarak ve bazı koşullar altında sağ pencere boyutunu almak için MINMAXINFO değiştirerek tespit ettik. Gördüğüm şey, başlık veya kenarlıksız bir pencere için varsayılan pencerelerin davranışıydı (her ne kadar bu belgeyi herhangi bir yerde bulamıyorum). JFrame.setMaximizedBounds() çağrısının, win32 MINMAXINFO yapısını değiştirmek için kullanılan sınırları sağladığını buldum. Yani benim eylem gerçekleştirildi değiştirerek ve benim MaximizedBounds olarak camickr önerdiği pencere boyutunu kullanarak, biraz daha yakın:

GraphicsConfiguration graphicsConfiguration = frame.getGraphicsConfiguration(); 
frame.setMaximizedBounds(graphicsConfiguration.getBounds()); 
frame.setExtendedState((frame.getExtendedState() & Frame.MAXIMIZED_BOTH) == Frame.MAXIMIZED_BOTH ? JFrame.NORMAL : JFrame.MAXIMIZED_BOTH); 

Şimdi Ekranı kaplama pencere artık menü çubuğu gizler. Ama şimdi başka bir problemim var. İkincil monitörden en üst düzeye çıkamıyorum. Çerçeve sadece kayboluyor.

Bu sorunu tanıyan bir C++ programcısı almanın umuduyla bazı win32 etiketleri ekliyorum.

ÇÖZÜM: Görünüşe göre henüz kendi sorumu yanıtlayamıyorum, bu yüzden çözümümüzü buraya koyacağım. Bir Güneş sınıfını kullanmak zorunda kaldı ve ben Windows'un dışında herhangi platformlarda test etmedim, ama şimdiye kadar bu çoklu monitör ve çoklu görev çubuğu yapılandırmaları iyi çalışıyor gibi görünüyor:

GraphicsConfiguration config = frame.getGraphicsConfiguration(); 
Rectangle usableBounds = SunGraphicsEnvironment.getUsableBounds(config.getDevice()); 
frame.setMaximizedBounds(new Rectangle(0, 0, usableBounds.width, usableBounds.height)); 
frame.setExtendedState((frame.getExtendedState() & Frame.MAXIMIZED_BOTH) == Frame.MAXIMIZED_BOTH ? JFrame.NORMAL : JFrame.MAXIMIZED_BOTH); 
+0

http://download.oracle.com/javase/tutorial/extra/fullscreen/exclusivemode.html hakkında forumun konuları var, bu forumda – mKorbel

+0

Teşekkürler, ama tam ekran uygulama yapmaya çalışmıyorum . Muhtemelen hedeflerim konusunda daha net olmalıydım, ancak işletim sistemi başlık çubuğunu değiştirmeye çalışıyorum ve kendimle (Google Chrome, Microsoft Office, vb.) Kontrol ediyorum. Güneş bile bunu bir kez kutudan çıkarmaya çalıştı, ama benim yaptığım aynı soruna sahipler: 'frame.getRootPane(). SetWindowDecorationStyle (JRootPane.FRAME);' –

cevap

4

İlginç. Denediğimde iki adımda gerçekleşiyor. İlk önce görev çubuğunun üzerindeki boşluğu doldurmak için genişler, daha sonra bir ikinci sonra görev çubuğunu kapsar. Neden olduğuna dair hiçbir fikrim yok.

Neyse geçici bir çözüm için kullanabilirsiniz:

GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
Rectangle bounds = env.getMaximumWindowBounds(); 
System.out.println("Screen Bounds: " + bounds); 

elle çerçevenin sınırlarını belirlemek için bunu maksimize etmek istediğinizde.

+0

Bu bana daha yakın geliyor gibi görünüyor, ama çerçeve genişletilmiş durumu 'normal' olarak sıfırlar. Kendi çerçeve alt sınıfımı oluşturabilir ve kendi genişletilmiş durumumu ve önceki sınırlarımı takip edebilirim, ancak işletim sistemi bu simüle edilmiş durumun farkında değil ve bana ince küçük şekillerde ihanet ederdi.Ayrıca, birden fazla monitörde pencere sınırlarını almanın bir yolunu bulmam gerek. –

+0

Sınırları takip etme ve kendinizi ifade etme fikri buydu. İnce problemlerin ne olabileceğini bilmiyorum orada daha fazla öneride bulunamıyorum. Hiç oynamamıştım ama birden fazla monitör için “GraphicsDevice” sınıfına bakabiliyorsun. – camickr

İlgili konular