2013-03-06 14 views
5

Pracuję nad zwykłą małą aplikacji kołyszącego dla krewnego, ale mam problemy z animacji na nim wykonawczego ...Java Swing Panel GridBagLayout rozmiaru problemów

Oto opis mojego układu:

Mam główne okno (utworzone przez tworzenie instancji, pakowanie i wyświetlanie ramki JFrame). Powiedziałem panelowi zawartości głównego okna, aby użyć GridBagLayout jako jego układu. Moja siatka ma szerokość 2 siatki i wysokość 3 siatki. W pierwszej kolumnie mam trzy JButtony (A, B i C), z których każdy zajmuje jeden rząd pionowej siatki, i jedną kolumnę poziomej siatki. W drugiej kolumnie mam kolejny JPanel, który ma szerokość jednej kolumny i trzy rzędy wysokości.

Ten drugi JPanel jest również ustawiony do używania GridBagLayout jako jego układu. W takim przypadku są dwie kolumny i jeden wiersz. Lewa kolumna ma jeden szeroki słupek i jeden wiersz wysoki JPanel z przyciskiem 1 w środku. Prawa kolumna składa się z pojedynczego JButton (przycisk 2), który ma również szerokość jednej kolumny i jeden rząd wysokości.

Oto zrzut ekranu, co właśnie opisano: Image of Layout

Teraz, że rozumie co układ jest, pozwól mi wyjaśnić, co starałem się zrobić:

Próbowałam używać Universal Tween Engine aby zmienić rozmiar JPanel, który zawiera przycisk 1. jednak w moich próbach, mam to w wyniku:

enter image description here

jak ty prawdopodobnie zobaczę, że przycisk 1 zawierający JPanela został pomyślnie zmieniony! Jednak rozmiar i pozycja przycisku 2 nie zmieniły się w ogóle, a przycisk 2 jest odcinany przez przycisk 1 zawierający JPanel!

To jest problem, ponieważ spodziewałem się zmiany rozmiaru JPanelu zawierającego przycisk 1, aby jednocześnie zmienić rozmiary komórek z zawartością GridBagLayout. Wydaje mi się, że bardzo się pomyliłem w tej sprawie.

To doprowadza mnie do mojego pytania ... Co muszę zrobić, aby "zaktualizować" moje GridBagLayout tak, aby zmienił rozmiary swoich sieci, aby dostosować się do wzrostu rozmiaru z przycisku 1 zawierającego Jpanel? Próbowałem wywoływać GridBagLayout.invalidatelayout() na moim GridBaglayout, a także próbowałem wywoływać JFrame.getContentPane().invalidate() w moim głównym oknie. Żaden z nich nie przyniósł żadnego efektu.

Oto kod źródłowy compilable mojego projektu:

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

Jeśli chcesz skompilować kod siebie, trzeba będzie trzy następujące zasoby:

  1. Universal Tween Engine library jar
  2. DrawingCanvas.java (pakiet aurelienribon.utils.swing)
  3. ComponentAccessor.java (pakiet aurelienribon.tweenaccessors.huśtawka)

Jeśli chciałbyś doświadczyć mój problem z pierwszej ręki, bez skomplikowanej konfiguracji projektu, można pobrać projekt Eclipse Juno, lub runnable pliku jar:

Jeśli wolisz trzymać się z dala od pobrania, tutaj jest lista tego, co się dzieje:

  1. Konfigurowanie STRUKTURA GUI
  2. Skonfiguruj wymagania dla animacji (nic specjalnego)
  3. Skonfiguruj wątek, który używa SwingUtilities.invokeAndWait wywołać funkcję o nazwie update()
  4. Ilekroć update() jest wywoływana, korzysta z Container.setSize() do animacji zmiany rozmiaru na JPanelu, który zawiera przycisk 1.

Każda pomoc w tym problemie jest bardzo cenna! Dziękuję :)

P.S. Jeśli istnieje duplikat tego pytania, bardzo mi przykro. Trochę googlowałem, ale nie byłem w stanie znaleźć niczego nawet związanego z moim problemem.

Odpowiedz

3

powiedziałbym w swojej metodzie update() należy zmienić domyślny rozmiar Button1 i nazywają

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

Zmiana preferowany rozmiar i revalidate() aktualizacji układ i repaint() odzwierciedla zmiany.

Alternatywnie można nazwać setSize() Button1 rosnącej szerokości i jednocześnie zmniejszenie szerokości Button2 i ponownie wywołać repaint() (bez revalidate() ponieważ przedłużanie by przywrócić pierwotny układ).