2013-03-06 9 views
5

ich für eine relativ auf einem einfachen kleinen Swing-Anwendung arbeite, aber ich habe Probleme Animationen auf deren Umsetzung ...Java Swing GridBagLayout Panel Probleme die Größe

Hier eine Beschreibung meines Layout ist:

Ich habe ein Hauptfenster (erstellt durch Instanziieren, Packen und Anzeigen eines JFrame). Ich habe das Inhaltsfenster des Hauptfensters angewiesen, GridBagLayout als Layout zu verwenden. Mein Raster ist 2 Raster breit und 3 Raster groß. In der ersten Spalte habe ich drei JButtons (A, B und C), die jeweils eine Zeile des vertikalen Gitterraums und eine Spalte des horizontalen Gitterraums einnehmen. In der zweiten Spalte habe ich ein weiteres JPanel, das eine Spalte breit und drei Zeilen hoch ist.

Dieses zweite JPanel ist auch so eingestellt, dass es GridBagLayout als Layout verwendet. In diesem Fall gibt es zwei Spalten und eine Zeile. Die linke Spalte hat eine breite Spalte, eine Zeile hoch JPanel mit Button 1 darin. Die rechte Spalte besteht aus nur einem einzigen JButton (Button 2), der ebenfalls eine Spalte breit und eine Zeile hoch ist.

Hier ist ein Screenshot von dem, was ich gerade beschrieben: Image of Layout

Nun, Sie verstehen, was das Layout ist, lassen Sie mich erklären, was ich zu tun versucht:

ich versucht habe um die Universal Tween Engine zu verwenden, um die JPanel, um die Größe, die jedoch 1. Taste enthält, in meinen Versuchen, erhalte ich dies als Ergebnis:

enter image description here

wie Sie kann wohl sehen, das JPanel mit Button 1 hat sich erfolgreich skaliert! Größe und Position von Button 2 ändern sich jedoch nicht, und tatsächlich wird Button 2 durch das JPanel mit Button 1 abgeschnitten!

Dies ist ein Problem, wie ich die Größe der JPanel erwarten würde, die Schaltfläche 1 enthält, um gleichzeitig die Zellengrößen von seiner GridBagLayout zu ändern. Ich habe mich in dieser Sache sehr geirrt, scheint es.

Das bringt mich zu meiner Frage ... Was muss ich tun, um mein GridBagLayout zu "aktualisieren", so dass es seine Grids ändert, um die Zunahme der Größe von der Jpanel mit Button 1 aufzunehmen? Ich habe versucht, GridBagLayout.invalidatelayout() auf meinem GridBaglayout aufzurufen, und ich habe auch versucht, JFrame.getContentPane().invalidate() auf meinem Hauptfenster aufzurufen. Beides schien nichts bewirkt zu haben. Hier

ist die übersetzbare Quellcode meines Projekts:

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")); 
    } 
} 

Wenn Sie den Code selbst kompilieren wollen, müssen Sie die folgenden drei Quellen:

  • Universal Tween Engine library jar
  • DrawingCanvas.java (Paket aurelienribon.utils.swing)
  • ComponentAccessor.java (Paket aurelienribon.tweenaccessors.Schaukel)
  • Wenn Sie mein Problem aus erster Hand erleben möchten, ohne komplizierte Projekt-Setup, können Sie das Eclipse Juno-Projekt, oder die runnable JAR-Datei herunterladen:

    Wenn Sie von Downloads fernzubleiben würde es vorziehen, hier ist eine Liste von dem, was vor sich geht:

    1. GUI-Struktur
    2. einrichten Anforderungen für Tweens (nichts Besonderes)
    3. einen Thread einrichten einrichten, die SwingUtilities.invokeAndWait verwendet eine Funktion aufzurufen Update() aufgerufen
    4. Wenn Update() aufgerufen wird, Es verwendet Container.setSize(), um die Größenänderung im JPanel zu animieren, das Button 1 enthält.
    5. Jede Hilfe mit diesem Problem wird sehr geschätzt! Danke :)

      P.S. Wenn es ein Duplikat dieser Frage gibt, tut es mir sehr leid. Ich habe ziemlich viel gegoogelt, aber ich konnte nichts finden, was mit meinem Problem zu tun hatte.

    Antwort

    3

    würde ich in Ihrem update() Methode sagen Sie bevorzugte Größe von Button1 und rufen

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

    die bevorzugte Größe und revalidate() Updates Layout spiegelt ändern ändern sollte und repaint() die Änderungen.

    Alternativ können Sie setSize() für Button1 zunehmende Breite aufrufen und in der gleichen Zeit Abnahme Breite von Button2 und wieder rufen repaint() (ohne revalidate() weil Revalidierung ursprüngliche Layout wiederherstellen würde).