tamaño redimensionar posicion mover estilo como color cambiar boton java user-interface swing jpanel jbutton

java - redimensionar - ¿Por qué BoxLayout no me permite cambiar el ancho de un JButton pero me permite cambiar la altura?



redimensionar jpanel java (6)

Como se mencionó en los comentarios sobre la pregunta, pudo solucionarlo cambiando a setMaximumSize() . Sin embargo, como notó, setPreferredSize() no funciona. Entonces, ¿qué pasa con eso?

Con muchas cosas de Swing, las propiedades utilizadas para determinar el tamaño real del componente cuando se utiliza el BoxLayout son algo aleatorias (en mi opinión). Al determinar cómo renderizar los componentes, Swing invoca layoutComponent() en el administrador de diseño, que determina dónde layoutComponent() todo.

La implementación de layoutComponent() de layoutComponent() implica una llamada a un método que crea objetos SizeRequirements para el ancho y el alto de cada uno de los componentes que agrega al JPanel , según sus getMinimum/Preferred/MaximumSize() .

Más tarde, llama a SizeRequirements.calculateAlignedPositions() para determinar los valores de ancho correctos para cada componente, porque tu orientación es BoxLayout.Y_AXIS (Las alturas se calculan utilizando un método diferente). Tomando fragmentos de la fuente, la implementación relevante de este método es la siguiente:

for (int i = 0; i < children.length; i++) { SizeRequirements req = children[i]; //... int maxAscent = (int)(req.maximum * alignment); int maxDescent = req.maximum - maxAscent; //... int descent = Math.min(totalDescent, maxDescent); //... spans[i] = (int)Math.min((long) ascent + (long)descent, Integer.MAX_VALUE); }

Tenga en cuenta que totalDescent es el ancho disponible, por lo que el descent siempre se establece en maxDescent , que se basa en SizeRequirements.maximum , que se tomó de JButton.getMaximumSize() . El valor de spans[i] se usa luego en una llamada a JButton.setBounds() como el ancho. Como verás, getPreferredSize() nunca estuvo involucrado aquí, por lo que establecerlo no tiene impacto en este caso.

Estoy tratando de lograr que el diseño de un JDialog mío se ajuste a un aspecto particular que tiene un programa en el que me estoy portando a Java. He utilizado varios LayoutManagers anteriormente con gran éxito, pero por alguna razón parece que no consigo esto funciona en absoluto. Mi objetivo es que el lado derecho (este) de JDialog contenga los JDialog "Buscar siguiente" y "Cancelar" en orden descendente y luego cualquier espacio adicional debajo para que los dos botones estén siempre en la parte superior de JDialog Sin embargo, por alguna razón, BoxLayout está continuamente ignorando cualquier intento de cambiar (aquí es donde estoy perdido) el ancho de un JButton . El código sigue.

JButton findNext = new JButton("Find Next"); JButton cancel = new JButton("Cancel"); cancel.setPreferredSize(new Dimension((int)findNext.getPreferredSize().getWidth(), (int)cancel.getPreferredSize().getHeight())); JPanel example = new JPanel(); example.setLayout(new BoxLayout(example, BoxLayout.Y_AXIS)); example.add(findNext); example.add(cancel); example.add(Box.createGlue());

No importa lo que intente, cancel siempre conserva su tamaño normal. He intentado setMinimumSize() y setMaximumSize() con los mismos parámetros que setPreferredSize sin suerte. Incluso he intentado cancel.setPreferredSize(new Dimension(500, 500)); y la altura de los botones fue la única cosa ajustada, AÚN conservó el ancho predeterminado que se le dio.

Para resolver cualquier duda, esto es lo que parece (ahora que lo he terminado) y verá que los botones "Buscar siguiente" y "Cancelar" no tienen el mismo tamaño.


Es posible que no desee Box.createGlue() , que " crece según sea necesario para absorber cualquier espacio extra en su contenedor". En su lugar, use Box.createVerticalStrut() entre los botones, como se muestra a continuación y en el ControlPanel de ControlPanel de esta simulation .

example.setLayout(new BoxLayout(example, BoxLayout.Y_AXIS)); example.add(findNext); Box.createVerticalStrut(10); example.add(cancel);

Apéndice:

añadiendo setMaximumSize() hizo funcionar.

Este es el comportamiento esperado para los componentes que tienen anchos máximos idénticos en un BoxLayout vertical, como se describe en Características de diseño de cuadro . El ancho preferido del contenedor se convierte en el de los hijos (igualmente anchos), y la alineación X se vuelve irrelevante.

example.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); JButton findNext = new JButton("Find Next"); JButton cancel = new JButton("Cancel"); Dimension d = findNext.getMaximumSize(); cancel.setMaximumSize(new Dimension(d)); example.add(findNext); example.add(cancel);


Por lo general, si desea asegurar un tamaño del componente en Swing, debe llamar a setMinimumSize() , setMaximumSize() y SetPrefferedSize() con el mismo valor.


Sé que esta es una vieja pregunta pero realmente no veo una buena explicación. Entonces, por el bien de los buscadores que se topan con esto, agregaré mis dos centavos.

Hay tres métodos asociados con los componentes de tamaño en Swing: setPreferredSize (), setMinimumSize (), y setMaximumSize (). Sin embargo, el punto importante es que depende del administrador de diseño particular que se use en cuanto a si respeta o no alguno de estos métodos.

Para BoxLayout (el diseño que usa el póster original):

  • setMinimumSize () - BoxLayout honra esto
  • setMaximumSize () - BoxLayout respeta esto
  • setPreferredSize (): si se usa X_AXIS, se acepta el ancho, si se usa Y_AXIS, se respeta la altura

El OP está utilizando un Y_AXIS BoxLayout por lo que solo se modificó su altura.

Actualización: armé una página con esta misma información para todos los administradores de diseño. Esperemos que pueda ayudar a algunos buscadores a salir: http://thebadprogrammer.com/swing-layout-manager-sizing/


Si pones tus botones en un panel de GridLayout, tendrán el mismo ancho.


button.setMaximumSize(getMaximumSize());