Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Netbeans的计时器中获取JFrame界限时出现问题_Java_Swing_Timer_Jframe_Bounds - Fatal编程技术网

Java 在Netbeans的计时器中获取JFrame界限时出现问题

Java 在Netbeans的计时器中获取JFrame界限时出现问题,java,swing,timer,jframe,bounds,Java,Swing,Timer,Jframe,Bounds,当我按下程序中的一个按钮时,我想将JFrame设置为一半大小的动画。我认为最简单的方法是将JFrame的当前边界放入一个计时器中,并在计时器运行时将边界1减1 Timer t = new Timer(5,new ActionListener() { public void actionPerformed(ActionEvent e) { //inside this I want to get my Jframe's bounds like th

当我按下程序中的一个按钮时,我想将JFrame设置为一半大小的动画。我认为最简单的方法是将JFrame的当前边界放入一个计时器中,并在计时器运行时将边界1减1

      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创建一个新对象。因为它会给我另一个窗口。有人能帮我解决这个问题吗?

试试看

int width = Foo.this.getWidth();
其中
Foo
子类
JFrame

当我按下程序中的一个按钮时,我想将JFrame的动画设置为一半大小

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

SwingUtilities.windowForComponent( theButton );
获取对框架的引用

现在,当您为计时器创建ActionListener时,您可以在窗口中作为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();
            }
        });
    }
}

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

尝试
frame.getWidth()
其中
frame
是您所指的JFrame。@Thusitha,用子类
JFrame
的类的名称替换
JFrame
。如果计时器代码是主类的内部代码,并且如果主类是JFrame的子类,则此操作应该有效(所以1+赞成这个答案),但不管这些限制如何,卡米克尔的建议都会起作用(所以1+赞成卡米克尔的答案)。@Thusitha,我给出的答案是“又快又脏”方法。这里还有一个问题可以解释为什么我给出的答案有效-。@Thusitha:再次,我建议您遵循camickr的建议。上述建议很好,但如果您重构代码并将控制代码(侦听器)与视图(gui)分开放在自己的类中,则会失败,如果这个程序增长,您可能会希望这样做。用程序员的话说,我想说camickr的解决方案“扩展”得更好。请您进一步解释一下……我对java有点陌生。