5

当我在程序中按下按钮时,我想将 JFrame 设置为半尺寸。我认为最简单的方法是将 JFrame 的当前边界放入定时器中,并在定时器运行时将边界 1 减 1。但是当我在 netbeans IDE 中声明一个新定时器时,它看起来像这样。

      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

           }

        }
    });

但问题在于这里的“this”不是指 JFrame。而且我什至无法创建我的 JFrame 的新对象。因为它会给我另一个窗口。有人可以帮我解决这个问题吗?

4

2 回答 2

5

尝试

int width = Foo.this.getWidth();

Foo子类在哪里JFrame

于 2011-08-07T15:12:46.850 回答
5

当我在程序中按下按钮时,我想将 JFrame 设置为半尺寸

因此,当您单击按钮时,您可以访问该按钮。然后你可以使用:

SwingUtilities.windowForComponent( theButton );

获取对框架的引用。

因此,现在当您为 Timer 创建 ActionListener 时,您可以将 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();
            }
        });
    }
}

当然,当窗口达到某个最小大小时,您会希望停止计时器。我将把代码留给你。

于 2011-08-07T15:14:29.343 回答