JFrame表单边框状态不变

时间:2014-10-22 07:00:57

标签: java swing jframe

在Java中,我带了一个JFrame,里面有一个JButton, 当帧开始时,它通常以边框开始,

但我需要的是,当我点击按钮时,它会变成普通形式 (表示无标题/没有边框)再次当我点击我的按钮时,它再次显示边框(带标题),但它不像我上面写的那样简单。

我正在使用按钮ActionListener事件并在其中提到代码如下:

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

但我的框架边框状态没有改变,但抛出太多例外。

1 个答案:

答案 0 :(得分: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);
            }
        });
    }

}