2014-10-22 2 views
0

В Java, я взял JFrame с одним JButton внутри него, , когда кадр начинается, он начинает работать нормально с границами,JFrame форма границы состояние не меняется

Но моя потребность в том, что при нажатии кнопки она превращается в обычную форму (означает безлимитный/без границ), и снова, когда я нажимаю кнопку, он снова показывает границы (с заголовком), но он не работает так просто, как я написал выше.

Я кнопку с помощью ActionListener события и упоминается в нем код выглядит следующим образом:

if (frame.isUndecorated()) 
    frame.setUndecorated(true); 
else 
    frame.setUndecorated(false); 

Но мой границы кадра состояние не меняется, но бросать слишком много исключений.

+0

Чтобы лучше помочь, отправьте сообщение [MCVE] (http://stackoverflow.com/help/mcve) (минимальный полный проверяемый пример). –

+1

Вы не можете изменить состояние границы кадра, который уже отображается на экране. Я думаю, вам нужно создать новый кадр. – MadProgrammer

ответ

3

Вы не можете изменить обрамление состояние окна, которое уже было сделано отображаемым (прилагается к родному партнеру)

Обычно, я хотел бы предложить утилизации старого окна и воссоздающий, но есть маленькая хитрость вы можете использовать ...

Установка defaultCloseOperation кадра в JFrame.DISPOSE_ON_CLOSE вы можете вызвать dispose на раме, и он будет выпускать все это собственные ресурсы, позволяющие изменять состояние границы и повторно отобразить его, пример ...

import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test { 

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

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JButton btn = new JButton("Change"); 
       btn.addActionListener(new ActionListener() { 

        @Override 
        public void actionPerformed(ActionEvent e) { 
         JFrame frame = (JFrame) SwingUtilities.windowForComponent((JButton)e.getSource()); 
         frame.dispose(); 
         if (frame.isUndecorated()) { 
          frame.setUndecorated(false); 
         } else { 
          frame.setUndecorated(true); 
         } 
         frame.setVisible(true); 
        } 

       }); 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       frame.add(btn); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

} 
+0

Вы только что научили старую собаку опрятной новой трюке. :) –

+3

@AndrewThompson Да, меня тоже испугало, я был готов удалить панель содержимого и добавить ее в другой фрейм ... – MadProgrammer

+1

+1 Прошло много времени с тех пор, как я увидел 'dispose()' используется;) –

Смежные вопросы