如何在Java中修改JFrame的窗口菜单?那是(在Windows中)在应用程序图标后面的左上角,其中包含诸如“恢复”,“移动”,“最小化”,“调整大小”之类的项...

最佳答案

不幸的是,我只找到了一种用“金属装饰”来做到这一点的方法(我的意思是做JFrame.setDefaultLookAndFeelDecorated(true);)。如果我使用系统LaF找到一个答案,我当然会更新答案,但是我认为这仍然是一个答案。

输出:

java - 修改Java中的窗口菜单-LMLPHP

代码:

import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.io.BufferedReader;
import java.io.UnsupportedEncodingException;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;

public class Example {

    public Example() {

        JFrame.setDefaultLookAndFeelDecorated(true);

        JFrame frame = new JFrame();

        JMenu systemMenu = getSystemMenu(frame);
        systemMenu.add(new JMenuItem("New JMenuItem"), 0);

        for (Component component : systemMenu.getPopupMenu().getComponents()) {
            if (component.toString().contains("JMenu")) {
                ((JMenuItem) component).setForeground(Color.RED);
            }
        }

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 200);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private JMenu getSystemMenu(JFrame frame) {
        for (Component c1 : frame.getLayeredPane().getComponents()) {
            if (c1.toString().contains("MetalTitlePane")) {
                for (Component c2 : ((Container) c1).getComponents()) {
                    if (c2.toString().contains("SystemMenuBar")) {
                        return (JMenu) ((Container) c2).getComponent(0);
                    }
                }
            }
        }
        return null;
    }

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Example();
            }
        });
    }
}

09-25 21:05