2015-12-01 13 views
7

Jak mogę zmodyfikować menu okna JFrame w Javie? To jest ten (w systemie Windows) w lewym górnym rogu, za ikoną aplikacji, który zawiera elementy takie jak "Przywróć", "Przenieś", "Minimalizuj", "Zmień rozmiar" ...Modyfikuj menu okna w Javie

+0

stosując część (wymaganych kilka dodatkowych metod, wiązka kodu) niestandardowej L & F, substancję (a inny, np JGoodies) to dobry początek, uwaga, że ​​część L & F może mieć problem z Javą8 – mKorbel

Odpowiedz

1

Niestety, znalazłem tylko sposobem na zrobienie tego z "metalową dekoracją" (mam na myśli wykonanie JFrame.setDefaultLookAndFeelDecorated(true);). Oczywiście zaktualizuję odpowiedź, jeśli znajdę taką z systemem LaF, ale myślę, że to wciąż jest warte odpowiedzi.

wyjściowa:

enter image description here

Kod:

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(); 
      } 
     }); 
    } 
} 
Powiązane problemy