繁体   English   中英

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

[英]How to remove minimize button and keep maximize and close button in JFrame

我只想从JFrame中删除最小化按钮,但是想要JFrame标题栏中的最大化和关闭按钮。

在这里我说的是删除不禁用。

我认为删除最小化按钮不是一件好事。 但是也许您可以使用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 帖子 ,它提供了一个将此类与Jframe一起使用的好例子。

这是一个非常大的hack,仅与Synthetica L&F一起使用,因为它提供了一个绘制的标题栏。 注意:此L&F不能免费使用。 因此,如果您使用它,则必须获得许可证。

使用此L&F时,可以从根窗格开始迭代所有组件,以找到SyntheticaTitlePane的实例。 成功后,您可以尝试使用反射框架访问字段iconifyAction并对其使用方法Action.setEnabled(false)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM