2015-12-01 4 views
7

Wie kann ich das Fenstermenü eines JFrame in Java ändern? Das ist das (in Windows) oben links, hinter dem Anwendungssymbol, das Dinge wie 'Wiederherstellen', 'Verschieben', 'Minimieren', 'Größe ändern' ... hatÄndern Sie das Fenstermenü in Java

+0

von einigen (erforderlich einigen zusätzlichen Methoden, Haufen Code) custom L & F, Substanz (und einer anderen, zB JGoodies) ist ein guter Anfang, beachten Sie Teil von L & F kann ein Problem mit Java8 – mKorbel

Antwort

1

Leider habe ich nur gefunden eine Möglichkeit, dies mit der "Metalldekoration" zu tun (damit meine ich JFrame.setDefaultLookAndFeelDecorated(true);). Ich werde natürlich die Antwort aktualisieren, wenn ich eine mit dem System LaF finde, aber ich denke das ist immer noch eine Antwort wert.

Ausgang:

enter image description here

Code:

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(); 
      } 
     }); 
    } 
}