如何从JFrame中移除最大化和最小化按钮?

18

我需要从 JFrame 中移除最大化和最小化按钮,请建议如何实现。


请查看 http://stackoverflow.com/questions/2527021/how-to-disable-minimize-button-in-frame,看它是否回答了你的问题。 - Matthew T. Staebler
关于使用JDialog,我在MyEclipse中导入了java.awt.*,但是JDialog无法识别。有什么帮助吗? - silverkid
JDialog тњї JFrame жЃйтюе java.swing тїЁСИГсђѓСйажюђУдЂ import java.swing.*сђѓ - Matthew T. Staebler
@Aeth:实际上应该是 javax.swing.* - Joachim Sauer
4个回答

15

这是一个相关示例,使用setUndecorated()来禁用框架装饰。

alt text

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class FrameTest implements Runnable {

    public static void main(String[] args) {
        EventQueue.invokeLater(new FrameTest());
    }

    @Override
    public void run() {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setUndecorated(true);
        JPanel panel = new JPanel();
        panel.add(new JLabel("Stackoverflow!"));
        panel.add(new JButton(new AbstractAction("Close") {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        }));
        f.add(panel);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
}

10

注意:我最初编辑了stacker的答案,但建议我创建一个新的回答。

有几种方法可以自定义可用于用户的窗口控件。

目前唯一删除最大化和最小化按钮,同时保留标题栏和关闭按钮的方法是使用 JDialog 而不是 JFrame

import java.awt.Dimension;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class DialogDemo {

    public static void main(String[] args) {
        JDialog dialog = new JDialog(new JFrame(), "No min max buttons");
        // necessary as setDefaultCloseOperation(EXIT_ON_CLOSE) is 
        // not available for JDialogs.
        dialog.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent evt) {
                System.exit(0);
            }
        });

        JLabel label = new JLabel("blah blah");
        JPanel panel = new JPanel();
        panel.setPreferredSize(new Dimension(400, 400));
        panel.add(label);

        dialog.add(panel);
        dialog.pack();
        dialog.setVisible(true);
    }
}

使用对话框解决方案会使用户无法通过快捷键来最小化和最大化窗口,但不会移除调整窗口大小的能力。

使用setResizable(false)仅会移除最大化按钮,但不能调整窗口大小。

最后,正如trashgod所提到的那样,setUndecorated(true)方法将禁用窗体装饰,包括标题栏和窗口边界。这使得用户更难以拖动、调整大小和关闭窗口,虽然这些操作仍可以使用快捷键执行。


这是唯一一个真正回答了问题的答案。 - Loduwijk

5
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Dlg extends JDialog {
    public Dlg(JFrame frame, String str) {
        super(frame, str);
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent evt) {
                System.exit(0);
            }
        });
    }

    public static void main(String[] args) {
        try {
            Dlg frame = new Dlg(new JFrame(), "No min max buttons");
            JPanel panel = new JPanel();
            panel.setSize(200, 200);
            JLabel lbl = new JLabel("blah blah");
            panel.add(lbl);
            frame.add(panel);
            frame.setSize(400, 400);
            frame.setVisible(true);
        } catch (IllegalArgumentException e) {
            System.exit(0);
        }
    }
}

这有什么缺点吗? - iKlsR
4
你的答案是什么?你没有解释你正在做什么,我也没看到你在哪里从JFrame中移除最小/最大化按钮。虽然我现在看出你的意图了,但是我一开始还纳闷这怎么算是答案。 - Loduwijk
注意,这个解决方案使得窗口焦点要更难集中。它是一个对话框,这意味着它不会出现在Windows中作为一个开放的程序。如果用户将焦点放在另一个窗口上,比如一个Web浏览器,重新聚焦对话框,用户就得最小化所有其他程序。 - Tom Burris

-1
你可以尝试这个:
JFrame loadingDialog = new JFrame();

JLabel label = new JLabel("blah blah");
JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(400, 400));
panel.add(label);

loadingDialog.add(panel);
loadingDialog.setUndecorated(true);

loadingDialog.getRootPane().setWindowDecorationStyle(JRootPane.NONE);
                    loadingDialog.pack();

loadingDialog.setVisible(true);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接