Chcę animować JFrame stać pół rozmiaru po naciśnięciu przycisku w moim programie
Więc po kliknięciu przycisku masz dostęp do przycisku. Następnie możesz użyć:
SwingUtilities.windowForComponent(theButton);
, aby uzyskać odniesienie do ramki.
Teraz, gdy tworzysz ActionListener dla Timera, możesz przekazać w oknie jako argument dla ActionListener.
Edit:
Sugestia przez MRE jest proste i prosto do przodu i łatwy w użyciu w wielu przypadkach (i chyba lepszym rozwiązaniem w tym przypadku).
Moja sugestia jest trochę bardziej skomplikowana, ale wprowadzono cię do metody SwingUtilities, która pozwoli ci na napisanie większego kodu wielokrotnego użytku, który mógłby potencjalnie zostać użyty przez dowolną ramkę lub okno dialogowe, które możesz utworzyć.
Prostym przykładem może być coś takiego:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class AnimationSSCCE extends JPanel
{
public AnimationSSCCE()
{
JButton button = new JButton("Start Animation");
button.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
JButton button = (JButton)e.getSource();
WindowAnimation wa = new WindowAnimation(
SwingUtilities.windowForComponent(button));
}
});
add(button);
}
class WindowAnimation implements ActionListener
{
private Window window;
private Timer timer;
public WindowAnimation(Window window)
{
this.window = window;
timer = new Timer(20, this);
timer.start();
}
@Override
public void actionPerformed(ActionEvent e)
{
window.setSize(window.getWidth() - 5, window.getHeight() - 5);
// System.out.println(window.getBounds());
}
}
private static void createAndShowUI()
{
JFrame frame = new JFrame("AnimationSSCCE");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new AnimationSSCCE());
frame.setSize(500, 400);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowUI();
}
});
}
}
Oczywiście, że chcesz zatrzymać stoper kiedy Winów osiągnie pewną minimalną wielkość. Zostawię ci ten kod.
Wypróbuj 'frame.getWidth()' gdzie 'frame' to nazwa JFrame, do której się odwołujesz. – fireshadow52