【问题标题】:Forcing JFrame to not resize after setResizable(false). Command wont work强制 JFrame 在 setResizable(false) 之后不调整大小。命令不起作用
【发布时间】:2015-03-28 19:22:28
【问题描述】:

我有一个简单的 Atari 突破程序,长话短说,我的一个通电功能是允许用户在几秒钟内调整窗口大小,然后再次使窗口无法调整大小。一切正常,窗口从不可调整大小变为可调整大小几秒钟。应该发生的是,几秒钟后,窗口应该停止接受调整窗口大小的输入(IE:不应该调整大小)。唯一的问题是,每当它应该设置为不可调整大小时,如果您一直在窗口上拖动光标来调整它的大小,它就会不断调整大小。它只会在您放开窗口后激活窗口的不可调整大小状态。我的问题是,一旦计时器到时,我该如何在您放开窗口、取消调整大小的控制权之前实现这一点?

P.S:我想编程以在调用命令后立即阻止您调整窗口大小,而不是等待您放开鼠标。有什么建议吗?

这是一个简化的例子:(给你 6 秒的时间来调整窗口大小并进行操作)

package test;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.Timer;

public class Test {

    public static void main(String[] args) {        
        JFrame testFrame = new JFrame();
        testFrame.setResizable(true);
        testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        long endingTime = System.currentTimeMillis() + 6000;
        Timer testTimer = new Timer(100, new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if((endingTime - System.currentTimeMillis()) < 0){
                    testFrame.setResizable(false);
                }
            }
        });
        testFrame.setVisible(true);
        testTimer.start();
    }
}

【问题讨论】:

    标签: java swing resize jframe


    【解决方案1】:

    如果框架不可调整大小,我能想到的一种方法是在调整大小事件后重新设置大小。

    不确定它的效果如何。

    frame.addComponentListener(new ComponentAdapter() {
        @Override
        public void componentResized(ComponentEvent e) {
            if (!frame.isResizable()) {
                frame.setSize(...);
            }
        }
    });
    

    【讨论】:

    • 好电话,@Bubletan!
    【解决方案2】:

    使用 Java 的 Robot 类强制释放鼠标。我在下面修改了您的示例代码:

    public static void main(String[] args) {        
      JFrame testFrame = new JFrame();
      testFrame.setResizable(true);
      testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      Timer testTimer = new Timer(6000, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
                testFrame.setResizable(false);
          Robot r;
          try {
            r = new Robot();
            r.mouseRelease( InputEvent.BUTTON1_DOWN_MASK);
          } catch (AWTException ex) {
            ex.printStackTrace();
          }
        }
    
      });
      testFrame.setVisible(true);
      testTimer.start();
    }
    

    【讨论】:

    • 这工作完美@Quicksilver002!就强制控制鼠标而言,它似乎效率低下,而不是让程序简单地限制你调整它的大小,但到目前为止,这似乎是唯一可能的方法。不管怎样,它绝对有效。非常感谢!
    【解决方案3】:

    您是否尝试过在上电结束后立即重新验证 JFrame?这很可能会解决您的问题(尽管我不知道您既没有 SSCCE 也没有 MVCE)。我希望这会有所帮助,祝你好运。

    【讨论】:

      猜你喜欢
      • 2013-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多