2012-05-08 32 views
5

Duplicar posibles:
JDialog allow user to only change width of the dialogJDialog altura fija

Tengo un JDialog que me gustaría que el ancho sea de tamaño variable, pero la altura no.

Este es mi código actual:

addComponentListener(new ComponentAdapter() { 
    @Override 
    public void componentResized(ComponentEvent e) { 
     setLocation(getLocation().x, getLocation().y + (getHeight() - staticHeight)); 
     setSize(new Dimension(getWidth(), staticHeight)); 
     super.componentResized(e); 
    } 
}); 

El problema es que el código se llamará después de cambiar el tamaño de la ventana. Hacer que la ventana cambie de tamaño y luego retroceder.

Me gustaría que cuando el usuario intente arrastrar la altura de la ventana no haga nada.

+0

+1, que me hizo aprender algo hoy :-) –

Respuesta

3

parece que no puede. hay un método setResizable() pero es todo o nada.
puede intentar mitigar esto utilizando un diseño dentro de su JDialog para que su contenido permanezca igual altura independientemente de la altura JDialog
o quizás (un poco más radical) establecer como no redimensionable e implementar su propio oyente de mouse para cambiar el tamaño tú mismo ? de esa manera usted podría tener control total

3

Después de buscar por un tiempo, no pude encontrar ninguna solución realmente satisfactoria. Creo que el cambio de tamaño del cuadro de diálogo es algo que se maneja directamente en el nivel del sistema operativo y, por lo tanto, solo puede decir que lo quiere totalmente no redimensionable o totalmente redimensionable.

El código siguiente siempre evitará que el diálogo sea más grande, pero a medida que el usuario cambia el tamaño del cuadro de diálogo, los bordes del cuadro de diálogo se mueven.

La otra opción, también sugerida por radai, sería evitar el cambio de tamaño y establecer un panel de contenido personalizado con un detector de mouse que escuche el mouse y cambie el tamaño en consecuencia. Sin embargo, creo que esto no será muy natural para el usuario (no creo que puedas ver los eventos en el borde del diálogo).

import java.awt.Frame; 
import java.awt.event.ComponentAdapter; 
import java.awt.event.ComponentEvent; 

import javax.swing.JDialog; 
import javax.swing.JRootPane; 
import javax.swing.SwingUtilities; 

public class Test { 

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

    public static void init() { 
     final int staticHeight = 150; 
     final JDialog dialog = new JDialog((Frame) null) { 

      @Override 
      protected JRootPane createRootPane() { 
       JRootPane rp = new JRootPane() { 
        @Override 
        public void reshape(int x, int y, int w, int h) { 
         super.reshape(x, y, w, staticHeight); 
        } 
       }; 
       rp.setOpaque(true); 
       return rp; 
      } 

      @Override 
      public void reshape(int x, int y, int width, int height) { 
       super.reshape(x, y, width, staticHeight); 
      } 

     }; 
     dialog.addComponentListener(new ComponentAdapter() { 
      @Override 
      public void componentResized(ComponentEvent e) { 
       dialog.setSize(dialog.getWidth(), staticHeight); 
      } 
     }); 
     dialog.pack(); 
     dialog.setVisible(true); 

    } 
} 
+0

No, no hay ninguna solución adecuada, ComponetListener no es forma correcta, vi truco sucio que el ratón no-armada del contenedor después, por favor ver mi respuesta aquí – mKorbel

+0

aaaaaaaaaccch +1 – mKorbel

4
  • no se puede directamente para detener el cambio de tamaño,

  • no se puede bloquear propiedad básica de los contenedores,

  • contenedor becase del sistema operativo nativo y están construidas sobre sus propiedades ,

  • y limitaciones para cambiar el tamaño es el tamaño de pantalla

  • resto son (con código) Resizing Components by @camickr

  • hay truco sucio basado en AbsoluteLayout, y yo no sugieren el uso que

  • bloque de cambiar el tamaño, si hay alguna parpadeo o cambiar el tamaño de congelar durante

+0

+1 para la confirmación y la respuesta muy estructurada –

+0

Me acabo de enterar de que esto se puede hacer, por el código que he dado :-) Lo siento no por mí sino por "Darryl Burke": -) –

1

Aquí pruebe este ejemplo de código, así es como configura el JDialog para no tener el cambio de tamaño vertical.Aunque realmente no quiero tomar el crédito por esto, todo el mérito recae en el creador de este programa, que es "Darryl Burke", el enlace al programa es here.

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class WidthResizeableDialog { 

    Robot robot; 
    static final int HEIGHT = 400; 
    Point lastLocation; 

    public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 

     @Override 
     public void run() { 
     new WidthResizeableDialog().makeUI(); 
     } 
    }); 
    } 

    public void makeUI() { 
    try { 
     robot = new Robot(); 
    } catch (AWTException ex) { 
     ex.printStackTrace(); 
    } 
    final JDialog dialog = new JDialog(); 
    dialog.setSize(400, HEIGHT); 
    dialog.setLocationRelativeTo(null); 
    dialog.addWindowListener(new WindowAdapter() { 

     @Override 
     public void windowClosing(WindowEvent e) { 
     System.exit(0); 
     } 
    }); 
    dialog.addComponentListener(new ComponentAdapter() { 

     @Override 
     public void componentMoved(ComponentEvent e) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
      lastLocation = dialog.getLocation(); 
      } 
     }); 
     } 
    }); 
    dialog.getRootPane().addComponentListener(new ComponentAdapter() { 

     @Override 
     public void componentResized(ComponentEvent e) { 
     int height = dialog.getHeight(); 
     if (robot != null && height != HEIGHT) { 
      robot.mouseRelease(InputEvent.BUTTON1_MASK); 
      dialog.setLocation(lastLocation); 
      dialog.setSize(dialog.getWidth(), HEIGHT); 
     } 
     } 
    }); 
    dialog.setVisible(true); 
    } 
} 
+0

Darryl es genial mente +1, de nuevo no estoy de acuerdo con hacks sucios, ni con java.awt.Robot, porque es API para fines de prueba, no designado para el código de producciones, lo siento mi opinión, tal vez alguien podría ser satified con que – mKorbel

+0

Nah , más bien tu respuesta es tan buena como una y otra respuesta, demasiado cierta, ciertas cosas están destinadas a ser controladas por el sistema operativo, y deben tratarse como tales, sin ninguna interferencia :-) –

Cuestiones relacionadas