如何删除最小化按钮并在JFrame中保持最大化和关闭按钮

时间:2014-08-07 08:09:10

标签: java swing jframe

我想从JFrame中仅删除最小化按钮 但是想在JFrame标题栏中使用最大化和关闭按钮。

我在谈论删除不禁用。

2 个答案:

答案 0 :(得分:4)

我不认为删除最小化按钮是一件好事。但您可以使用setUndecorated()方法删除标题栏和窗口边缘。而且你必须添加自己的关闭和最大化按钮来执行这些操作。

以下是一个例子:

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.AbstractAction;
import javax.swing.JButton;

public class Example {

    public Example() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setUndecorated(true);//<---- this will disable the frame decorations
        JPanel panel = new JPanel();
        panel.add(new JLabel("titlebar"));
        //Add button maximize
        JButton button_max=new JButton("Maximize");
        button_max.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                if(frame.getExtendedState() == JFrame.NORMAL) {
                    frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
                } else {
                    frame.setExtendedState(JFrame.NORMAL);
                }
            }
        });
        panel.add(button_max);
        //Add button close
        JButton button_close = new JButton(new AbstractAction("Close") {
            private static final long serialVersionUID = -4901571960357967734L;
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });
        panel.add(button_close);
        frame.add(panel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

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

修改:

正如@peeskillet在评论中所说的那样,即使使用这种方法,窗口仍然可以被用户调整大小和拖动。 ComponentResizer 类允许这样做。

这是一个SO post,它提供了一个将此类与Jframe一起使用的好例子。

答案 1 :(得分:1)

这是一个非常大的黑客攻击,只适用于Synthetica L&F,因为它提供了一个绘制的标题栏。注意:此L&amp; F不能免费使用。因此,如果您使用它,您必须获得许可。

当您使用此L&amp; F时,您可以从根窗格开始迭代所有组件以查找SyntheticaTitlePane的实例。成功后,您可以尝试使用Reflection Framework访问字段iconifyAction,并在其上使用Action.setEnabled(false)方法。

我不知道如何访问标准标题栏,因为它是原生的。可能这是不可能的。