ventanas titulo the quitar poner mejorar displayable diseño deshabilitar como cerrar centrar cambiar boton barra swing jframe

swing - titulo - ¿Cómo crear una barra de título personalizada con el botón Cerrar en jFrame?



quitar barra de titulo jframe java (3)

Quiero crear personalizar la barra de título en jFrame. Puedo eliminar la barra de título predeterminada en jFrame con

JFrame.setUndecorated (true)

ahora necesito crear una barra de título personalizada en jFrame con el botón de cerrar.


Sin haber hecho eso alguna vez, creo que iría de esta manera:

  1. De hecho, establezca el JFrame como no decorado
  2. Extienda JRootPane para agregar un campo adicional titleBar
  3. Crea un componente TitleBar con el título, el botón de cerrar, etc.
  4. Establezca un nuevo LayoutManager en ese JRootPane (eche un vistazo a JRootPane.RootLayout) y distribuya los componentes en el orden apropiado (primero la barra de título, luego debajo de la barra de menú y luego debajo del panel de contenido)
  5. Establezca una instancia de eso amplía RootPane en su JFrame

Hay tal vez mejores formas.


El código según el enlace anterior: (Editado para Java 8)

import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.logging.Level; import java.util.logging.Logger; class Testing { public void buildGUI() throws UnsupportedLookAndFeelException { JFrame.setDefaultLookAndFeelDecorated(true); JFrame f = new JFrame(); f.setResizable(false); removeMinMaxClose(f); JPanel p = new JPanel(new GridBagLayout()); JButton btn = new JButton("Exit"); p.add(btn,new GridBagConstraints()); f.getContentPane().add(p); f.setSize(400,300); f.setLocationRelativeTo(null); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); btn.addActionListener((ActionEvent ae) -> { System.exit(0); }); } public void removeMinMaxClose(Component comp) { if (comp instanceof AbstractButton) { comp.getParent().remove(comp); } if (comp instanceof Container) { Component[] comps = ((Container)comp).getComponents(); for(int x = 0, y = comps.length; x < y; x++) { removeMinMaxClose(comps[x]); } } } public static void main(String[] args) { SwingUtilities.invokeLater(() -> { try { new Testing().buildGUI(); } catch (UnsupportedLookAndFeelException ex) { Logger.getLogger(Testing.class.getName()).log(Level.SEVERE, null, ex); } }); } }

puede funcionar bien, pero ¿y si el usuario también quiere establecer un L & F como nimbus


No estoy muy seguro de cómo desea personalizar el botón de cerrar, pero tal vez esto pueda apuntarle en la dirección correcta: ¿cómo puedo personalizar la barra de título en JFrame?

EDITAR: Aquí hay un enlace de trabajo actualizado a un foro sobre la personalización de su GUI y un código publicado por un usuario en su creación de una GUI simple: Aquí

Parece que puedes modificar su método removeComponents y crear un método addComponents para satisfacer tus necesidades.