2015-12-01 13 views
7

Come posso modificare il menu della finestra di un JFrame in Java? Quello è quello (in Windows) in alto a sinistra, dietro l'icona dell'applicazione, che contiene elementi come "Ripristina", "Sposta", "Riduci", "Ridimensiona" ...Modificare il menu della finestra in Java

+0

utilizzando alcuni dei (necessari alcuni metodi aggiuntivi, mucchio di codice) personalizzato L & F, la sostanza (e un altro, ad esempio, JGoodies) è un buon inizio, nota una parte di L & F può avere un problema con Java8 – mKorbel

risposta

1

Purtroppo ho trovato solo un modo per farlo con la "decorazione metallica" (con ciò intendo dire fare JFrame.setDefaultLookAndFeelDecorated(true);). Ovviamente aggiornerò la risposta se ne trovo una con il sistema LaF, ma penso che valga ancora la pena dare una risposta.

uscita:

enter image description here

Codice:

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