uso tutorial predeterminad paneles gridlayout ejemplo dividir cómo cuál cambiaría borderlayout alineación acomodar java swing animation resize tween
Biblioteca de Universal Tween Engine jar

predeterminad - java grid bag layout tutorial



Problemas de cambio de tamaño del panel de Java Swing GridBagLayout (1)

Yo diría en tu método update() que debes cambiar el tamaño preferido de Button1 y llamar

container.revalidate(); container.repaint();

Cambiar el tamaño preferido y revalidate() diseño de las actualizaciones y revalidate() repaint() refleja los cambios.

Alternativamente, puede llamar a setSize() para que Button1 incremente el ancho y al mismo tiempo disminuya el ancho de Button2 y vuelva a llamar a repaint() (sin revalidate() porque la revalidación restauraría el diseño original).

Estoy trabajando en una aplicación pequeña y sencilla para un familiar, pero estoy teniendo problemas para implementar animaciones en ella ...

Aquí hay una descripción de mi diseño:

Tengo una ventana principal (creada al crear instancias, empaquetar y mostrar un JFrame). Le dije al panel de contenido de la ventana principal que use GridBagLayout como su diseño. Mi cuadrícula tiene 2 cuadrículas de ancho y 3 cuadrículas de alto. En la primera columna tengo tres JButtons (A, B y C), cada uno ocupando una fila de espacio de grilla vertical, y una columna de espacio de grilla horizontal. En la segunda columna, tengo otro JPanel, que tiene una columna de ancho y tres filas de alto.

Este segundo JPanel también está configurado para usar GridBagLayout como su diseño. En este caso, hay dos columnas y una fila. La columna de la izquierda tiene una columna de ancho, una fila de alto de JPanel con el Botón 1 dentro de ella. La columna de la derecha se compone de un solo JButton (botón 2), que también tiene una columna de ancho y una fila de alto.

Aquí hay una captura de pantalla de lo que acabo de describir:

Ahora que comprende cuál es el diseño, permítame explicar lo que he estado tratando de hacer:

He intentado usar Universal Tween Engine para cambiar el tamaño del Jpanel que contiene el Botón 1. Sin embargo, en mis intentos, obtengo esto como resultado:

Como probablemente pueda ver, ¡el botón JP1 que contiene el botón 1 se ha redimensionado correctamente! Sin embargo, el tamaño y la posición del Botón 2 no han cambiado en absoluto, y, de hecho, el botón 2 está siendo cortado por el JPanel que contiene el Botón 1.

Esto es un problema, ya que esperaba redimensionar el JPanel que contiene el Botón 1 para cambiar simultáneamente los tamaños de celda de su GridBagLayout. Me parece que estaba muy equivocado sobre este asunto.

Entonces eso me lleva a mi pregunta ... ¿Qué debo hacer para "Actualizar" mi GridBagLayout para que cambie el tamaño de sus cuadrículas para acomodar el aumento en el tamaño del Jpanel que contiene el Botón 1? Intenté llamar a GridBagLayout.invalidatelayout() en mi GridBaglayout, y también intenté llamar a JFrame.getContentPane().invalidate() en mi ventana principal. Ninguno parecía haber tenido ningún efecto.

Aquí está el código fuente compilable de mi proyecto:

ImageManager.java:

import java.awt.*; import java.awt.event.*; import javax.swing.*; import aurelienribon.tweenaccessors.swing.*; import aurelienribon.utils.swing.*; import aurelienribon.tweenengine.*; import aurelienribon.tweenengine.equations.*; public class ImageManager { /** * @param args */ public static JFrame mainwindow; public static TweenManager tweenManager; public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(new Runnable() //For thread safety! { public void run() { InitGUI(); InitTween(); } }); } private static void InitTween() { ((Window)mainwindow).addWindowListener(new WindowAdapter() { @Override public void windowOpened(WindowEvent e) { new DrawingCanvas() { @Override protected void update(int elapsedMillis) { tweenManager.update(elapsedMillis); } }.start(); } }); } private static void InitGUI() { //Init the window and layout systems mainwindow = new JFrame("Imaffect"); Container pane = mainwindow.getContentPane(); pane.setLayout(new GridBagLayout()); //Begin creating the UI! pane.add(new JButton("Button A"), new GridBagConstraints(0, 0, 1, 1, 0, 1, GridBagConstraints.PAGE_START, GridBagConstraints.VERTICAL, new Insets(0,0,0,0), 100, 0)); pane.add(new JButton("Button B"), new GridBagConstraints(0, 1, 1, 1, 0, 0, GridBagConstraints.PAGE_START, GridBagConstraints.VERTICAL, new Insets(0,0,0,0), 100, 100)); pane.add(new JButton("Button C"), new GridBagConstraints(0, 2, 1, 1, 0, 0, GridBagConstraints.PAGE_START, GridBagConstraints.VERTICAL, new Insets(0,0,0,0), 100, 20)); pane.add(InitPreviewGUI(), new GridBagConstraints(1, 0, 1, 3, 1, 1, GridBagConstraints.PAGE_START, GridBagConstraints.BOTH, new Insets(0,0,0,0), 0, 0)); //Finalize the window mainwindow.pack(); mainwindow.setVisible(true); } private static JPanel InitPreviewGUI() { JPanel panel = new JPanel(new GridBagLayout()); panel.add(InitSettingsGUI(), new GridBagConstraints(0, 0, 1, 1, 0, 1, GridBagConstraints.PAGE_START, GridBagConstraints.BOTH, new Insets(0,0,0,0), 0, 0)); panel.add(new JButton("Button 2"), new GridBagConstraints(1, 0, 1, 1, 1, 1, GridBagConstraints.PAGE_START, GridBagConstraints.BOTH, new Insets(0,0,0,0), 0, 0)); return panel; } private static JPanel InitSettingsGUI() { JPanel panel = new JPanel(); SetupSettingsTweens(panel); SetupSettingsContent(panel); return panel; } private static void SetupSettingsTweens(JPanel panel) { Tween.registerAccessor(Component.class, new ComponentAccessor()); tweenManager = new TweenManager(); Tween.to(panel, ComponentAccessor.WIDTH, 1000) .target(200) .ease(Cubic.INOUT) .repeatYoyo(-1, 200) .delay(500) .start(tweenManager); } private static void SetupSettingsContent(JPanel panel) { panel.add(new JButton("Button 1")); } }

Si quiere compilar el código usted mismo, necesitará los siguientes tres recursos:

  1. Biblioteca de Universal Tween Engine jar
  2. DrawingCanvas.java (paquete aurelienribon.utils.swing)
  3. ComponentAccessor.java (paquete aurelienribon.tweenaccessors.swing)

Si desea experimentar mi problema de primera mano, sin la complicada configuración del proyecto, puede descargar el proyecto Eclipse Juno o el archivo jar ejecutable:

Si prefiere mantenerse alejado de las descargas, aquí hay una lista de lo que está sucediendo:

  1. Configurar la estructura de GUI
  2. Configurar los requisitos para la interpolación (nada especial)
  3. Configure un hilo que use SwingUtilities.invokeAndWait para llamar a una función llamada update ()
  4. Cuando se llama a update (), usa Container.setSize () para animar el cambio de tamaño en el JPanel que contiene el Botón 1.

¡Cualquier ayuda con este problema es muy apreciada! Gracias :)

PD: Si hay un duplicado de esta pregunta, lo siento mucho. Busqué en Google un poco, pero no pude encontrar nada relacionado con mi problema.