проблема с получением границ JFrame внутри таймера в Netbeans - PullRequest
5 голосов
/ 07 августа 2011

Я хочу анимировать JFrame, чтобы он стал наполовину меньше, когда я нажимаю кнопку в моей программе.Я думаю, что самый простой способ - поместить текущие границы JFrame в таймер и уменьшить границы 1 на 1, когда таймер работает. Но когда я объявляю новый таймер в IDE NetBeans, он будет выглядеть следующим образом.

      Timer t = new Timer(5,new ActionListener() {

        public void actionPerformed(ActionEvent e) {

          //inside this I want to get my Jframe's bounds like this
           //    int width = this.getWidth();---------here,"this" means the Jframe

           }

        }
    });

Но проблема в том, что здесь «это» не относится к JFrame. И также я не могу даже создать новый объект моего JFrame. Потому что это даст мне другое окно. Может ли кто-нибудь помочь мне решить эту проблему?.

Ответы [ 2 ]

5 голосов
/ 07 августа 2011

Я хочу анимировать 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();
            }
        });
    }
}

Конечно, вы захотите остановить таймер, когда окно достигнет определенного минимального размера.Я оставлю этот код на ваше усмотрение.

5 голосов
/ 07 августа 2011

Попробуйте

int width = Foo.this.getWidth();

, где Foo подклассы JFrame.

...