【问题标题】:Java - how to let jframe to resize to only something smaller than set sizeJava - 如何让 jframe 调整为仅小于设置大小的东西
【发布时间】:2013-07-05 16:21:50
【问题描述】:

我知道如何在 jFrame 中关闭调整大小

setResizable(false);

但我要做的是防止用户使框架尺寸大于特定的宽度和高度。 (调整到更小的窗口大小就可以了) 我该怎么做?

编辑: 刚试过这个,不要这样做:

  setSize(700,700);
  setVisible(true);
  setLocation(200,200);
  setMaximumSize(new Dimension(800, 800));

【问题讨论】:

  • 请问why你会这样做吗?这似乎是一个奇怪的要求。
  • 当然。假设我在 jFrame 内显示大小为 320X240 的视频,如果我最大化该帧,则视频必须最大化,这使得该低分辨率视频非常难看。我不希望用户能够放大 jFarem。
  • 然后将 JFrame 的视频播放器组件/部分保持在 320x240 并用“空白”空间填充额外的空间。适当的布局将毫不费力地为您解决这个问题。这与 PC/平板电脑/智能手机上的大多数媒体播放器的效果相同。
  • :) 谢谢,但出于某种原因,我想按照我描述的方式进行操作。

标签: java swing jframe


【解决方案1】:

您可以使用ComponentListener 并覆盖其componentResized() 方法。虽然不是完美的解决方案。但这可以让你实现你正在寻找的东西。 但是 GUI 会一直抖动...我想知道是否有其他更好的解决方案。

import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
public class MainClass1 {
    public static void main(String[] args) 
    {
        final JFrame frame = new JFrame("My Frame");
        frame.setMaximumSize(new Dimension(350,250));
        frame.addComponentListener( new ComponentAdapter()
        {
            public void componentResized(ComponentEvent evt)
            {
                Dimension size = frame.getSize();
                Dimension max = frame.getMaximumSize();
                if (size.getWidth() > max.getWidth())
                {
                    frame.setSize((int)max.getWidth() ,(int) size.getHeight());
                }
                if (size.getHeight() > max.getHeight())
                {
                    frame.setSize((int)size.getWidth() ,(int) max.getHeight());
                }
            }
        });
        frame.setSize(200,100);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

}

【讨论】:

    【解决方案2】:

    你可以使用

    setMaximumSize(new Dimension(100,100));
    

    或

    setMinimumSize(new Dimension(100,100));
    

    由于 Swing 中有一个已知的Bug,所以使用它来设置 MaxSize:

    @Override
        public void paint(Graphics g) {
            Dimension d = getSize();
            Dimension m = getMaximumSize();
            boolean resize = d.width > m.width || d.height > m.height;
            d.width = Math.min(m.width, d.width);
            d.height = Math.min(m.height, d.height);
    
            if (resize) {
                Point p = getLocation();
                setVisible(false);
                setSize(d);
                setLocation(p);
                setVisible(true);
            }
            super.paint(g);
        }
    

    覆盖 JFrame 的绘制方法。

    这是你想做的吗?

    【讨论】:

    • 谢谢,但由于某种原因没有这样做。请参考我编辑的问题
    • 这是一个已知的摇摆错误:bugs.sun.com/view_bug.do?bug_id=6464548,但我前段时间也遇到过这个问题,我不完全确定我是如何解决的,但我认为我重写了一个处理调整大小的方法jframe
    • 谢谢你,伙计,如果这是解决该错误的唯一方法,我会这样做。
    • setMaximumSize 是为布局管理器制作的,因为它不适用于 jframes。我认为这是解决这个错误的最简单方法,如果它有效,那就没问题;)
    【解决方案3】:

    创建ComponentListener 并在ComponentListener.componentResized() 中添加所需约束的逻辑。

    【讨论】:

      【解决方案4】:

      进入你的动作监听器方法,然后放

       xMax=700; yMax=700;
      
       if((xDim>=xMax)&&(xDim>=xMax))
       {
           setSize(xMax,yMax);
       }
       else
       {
           if(xDim>=xMax)
           {
               setSize(xMax,yDim);
           }
           if(yDim>=yMax)
           {
               setSize(xDim,yMax);
           }
       }
      

      【讨论】:

        【解决方案5】:

        您可以实现组件侦听器以检查框架是否已超出指定范围:

        addComponentListener(new ComponentAdapter() {
        
                @Override
                public void componentResized(ComponentEvent e) {
                    if (getSize().width > 400 || getSize().height > 400){
                        setVisible(false);
                        setSize(400, 400);
                        setVisible(true);
                    }
                }
            });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多