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:
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:
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:
- Universal Tween Engine library jar
- DrawingCanvas.java (pakiet aurelienribon.utils.swing)
- 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:
- Konfigurowanie STRUKTURA GUI
- Skonfiguruj wymagania dla animacji (nic specjalnego)
- Skonfiguruj wątek, który używa SwingUtilities.invokeAndWait wywołać funkcję o nazwie update()
- 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.