2009-05-17 15 views
16

W mojej aplikacji Swing, chcę możliwość przełączania między dekorowane i bez dekoracji bez odtwarzania całej klatki. Jednak interfejs API nie pozwala mi wywoływać setUndecorated() po pokazaniu ramki.Jak wywołać metodę setUndecorated() po udostępnieniu ramki?

Nawet jeśli zgłoszę setVisible(false), isDisplayable() nadal zwraca true. API mówi, że jedynym sposobem, aby uczynić ramkę niemożliwą do wyświetlenia, jest jej ponowne utworzenie. Jednak nie chcę odtwarzać ramki tylko po to, aby wyłączyć niektóre paski tytułu.

Tworzę aplikację, która może być wyświetlana w pełnym ekranie i może być przełączana między trybami pełnoekranowymi i okienkowymi; Powinien on być w stanie przełączać przy zachowaniu stanu itd

Jak mogę to zrobić po ramce widoczna jest ?.

Odpowiedz

16

Nie możesz. To było moje doświadczenie, kiedy próbowałem osiągnąć to samo.

Jednak jeśli masz cały interfejs w jednym panelu, który jest w ramce, można utworzyć nową ramkę a następnie dodać ten panel do ramy. Nie za dużo pracy.

coś takiego:

// to start with 
JPanel myUI = createUIPanel(); 
JFrame frame = new JFrame(); 
frame.add(myUI); 

// .. and later ... 

JFrame newFrame = new JFrame(); 
newFrame.setUndecorated(); 
newFrame.add(myUI); 

W Swing panel (i rzeczywiście każda instancja składnika) może być tylko w jednej ramce na raz, więc jeśli od razu dodać go do nowej ramki, to przestaje być w starej ramie.

+2

Wywołanie "dispose()" zwalnia zasoby rodzimego okna. wtedy możesz edytować właściwości, takie jak bez ozdób i tak dalej. z 'pack()' odtwarzasz zasoby okna. to po prostu wywołaj 'setVisible (true)' i wszystko działa dobrze (pozycja i wszystkie kompozytorki nie zostaną zmienione) – Thomas

+1

Jak opisał Thomas, jest to możliwe, zobacz także http://stackoverflow.com/questions/27715638/is- tam-do-do-usunięcia-dekoracji-ramki-bez-ponownego-otwarcia-to –

2

Cóż, będziesz potrzebować innej instancji ramki. Możesz przesuwać zawartość ramki bez odtwarzania tego. Kluczem jest tutaj, aby twój kod nie był zależny od konkretnej ramki. Jest to podstawowa dobra praktyka w każdym przypadku.

+0

Tak właśnie rozważałem, ale szukam alternatywy. – Lucky

20

Czy próbowałeś dzwoniąc Frame.dispose() a następnie zmieniając go? Nie próbowałem tego sam, ale to może zadziałać.

Jeśli nie, to możesz zrobić, aby ramka była nieistotną częścią klasy, z koniecznie tylko minimalnymi haczykami do panelu najwyższego poziomu lub paneli, i po prostu przenieś je do nowej ramki. Wszystkie dzieci pójdą za tobą.

+0

To działa dla mnie. – dimo414

+0

Który, dispose() lub tworzenie nowej ramki? – Yishai

+2

Calling dispose() działa dla mnie – Annan

12

Wystarczy popatrzeć na https://tvbrowser.svn.sourceforge.net/svnroot/tvbrowser/trunk/tvbrowser/src/tvbrowser/ui/mainframe/MainFrame.java

w metodzie switchFullscreenMode():

dispose(); 
... 
setFullScreenWindow(...); 
setUndecorated(true/false); 
setBounds(mXPos, mYPos, mWidth, mHeight); 
... 
setVisible(true); 

Właściwie jest dużo więcej rzeczy dzieje się ukryć, że różne sidepanels ponownie jeśli mysz dotyka boków.

Należy również pamiętać, że należy wyraźnie ustawić granice. Window.setExtendedState(MAXIMIZED_BOTH) źle wpływa na czas w pobliżu dispose(), ponieważ polegają one na wielu natywnych zdarzeniach systemu operacyjnego, które zostały utracone, gdyby okno nie było wyświetlane w tej ułamku sekundy.

Nie polecam biorąc ekran domyślny bezpośrednio:

GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); 

i zamiast korzystać z ekranu, twój JFrame jest obecnie na:

setBounds(getGraphicsConfiguration().getBounds()); 
getGraphicsConfiguration().getDevice().setFullScreenWindow(this); 

Choć jest obecnie taka sama, może to zmienić w przyszłości.

+0

To działało idealnie dla mnie i była prostszą zmianą kodu niż tworzenie nowych ramek reguarly. Twoje komentarze na temat granic i korzystania z bieżącego ekranu ramki były szczególnie pomocne. Przed przejściem na pełny ekran uzyskuję granice okna, co pozwala mi przywrócić je do tej samej lokalizacji i rozmiaru po wyjściu z trybu pełnoekranowego. – dimo414

8

wywoływanie dispose() uwalnia zasoby rodzimego okna. wtedy możesz edytować właściwości, takie jak bez ozdób i tak dalej. Następnie wystarczy zadzwonić setVisible(true) odtworzyć zasoby okiennych i wszystko działa poprawnie (pozycja i wszystkie compoenents won `t być zmieniane)

dispose(); 
setUndecorated(true/false); 
setVisible(true); 
0

Oto kod, w jaki sposób dokonać ALT + Enter wchodzi Full Screen bez trybu z barem i zminimalizować pokazując pasek tytułowy i pasek start:

public class myTest extends JFrame{ 
//Your codes... 
    //if "ALT" key on hold and "Enter" key pressed with it 
    if (evt.isAltDown() && evt.getKeyCode() == evt.VK_ENTER) {  
     //if the JFrame has Title bar 
     if (isUndecorated()) { 
      //this will dispose your JFrame 
      dispose(); 
      //here to set it with no Title bar 
      setUndecorated(false); 
      pack(); 
      setLocationRelativeTo(null); 
      //as you dispose your JFrame, you have to remake it Visible.. 
      setVisible(true); 
      } else { 
      dispose(); 
      setUndecorated(true); 
      setExtendedState(MAXIMIZED_BOTH); 
      setVisible(true); 
     } 
    } 
//your codes 
} 
-1

Spróbuj:

dispose(); 
setUndecorated(true); 
setVisible(true); 

Sprawdź to. Mam nadzieję, że to pomoże !!

Powiązane problemy