Я хочу анимировать JFrame, чтобы он стал наполовину меньше, когда я нажимаю кнопку в моей программе
Поэтому, когда вы нажимаете кнопку, у вас есть доступ к кнопке.Затем вы можете использовать:
SwingUtilities.windowForComponent( theButton );
, чтобы получить ссылку на фрейм.
Так что теперь, когда вы создаете ActionListener для Timer, вы можете передать в Window в качестве аргумента для ActionListener.
Редактировать:
Предложение mre является простым и понятным, и его легко использовать во многих случаях (и, вероятно, в этом случае лучшее решение).
Мое предложение немного сложнее, но оно познакомило вас с методом SwingUtilities, который в конечном итоге позволит вам написать более многократно используемый код, который потенциально может быть использован любым фреймом или диалогом, который вы можете создать.
Простым примером будет что-то вроде:
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();
}
});
}
}
Конечно, вы захотите остановить таймер, когда окно достигнет определенного минимального размера.Я оставлю этот код на ваше усмотрение.