【问题标题】:JDialog fixed height [duplicate]JDialog固定高度[重复]
【发布时间】:2012-05-17 02:39:19
【问题描述】:

可能重复:
JDialog allow user to only change width of the dialog

我有一个 JDialog,我希望宽度可以调整,但高度不能。

这是我当前的代码:

addComponentListener(new ComponentAdapter() {
    @Override
    public void componentResized(ComponentEvent e) {
        setLocation(getLocation().x, getLocation().y + (getHeight() - staticHeight));
        setSize(new Dimension(getWidth(), staticHeight));
        super.componentResized(e);
    }
});

问题是,在调整窗口大小后调用该代码。调整窗口大小,然后闪烁。

我想这样当用户试图拖动窗口的高度时它什么都不做。

【问题讨论】:

  • +1,你让我今天学到了一些东西 :-)

标签: java swing jdialog


【解决方案1】:
  • 你不能直接停止调整大小,

  • 你不能阻止容器的基本属性,

  • 容器因为来自 Native OS 并且是建立在它的属性之上的,

  • 调整大小的限制是屏幕大小

  • 其余为(带代码)Resizing Components by @camickr

  • 有基于 AbsoluteLayout 的肮脏 hack,我不建议使用它

  • 如果在调整大小期间出现任何闪烁或冻结,则阻止调整大小

【讨论】:

  • +1 用于确认和非常结构化的答案
  • 我刚刚发现这可以通过我提供的代码来完成 :-) 对不起,不是我,而是“Darryl Burke” :-)
【解决方案2】:

这里试试这个代码示例,这就是你如何将JDialog 设置为没有垂直调整大小。虽然我真的不想因此而受到赞扬,但整个功劳归于这个程序的创建者“Darryl Burke”,该程序的链接是here

import java.awt.*;  
import java.awt.event.*;  
import javax.swing.*;  

public class WidthResizeableDialog {  

  Robot robot;  
  static final int HEIGHT = 400;  
  Point lastLocation;  

  public static void main(String[] args) {  
    SwingUtilities.invokeLater(new Runnable() {  

      @Override  
      public void run() {  
        new WidthResizeableDialog().makeUI();  
      }  
    });  
  }  

  public void makeUI() {  
    try {  
      robot = new Robot();  
    } catch (AWTException ex) {  
      ex.printStackTrace();  
    }  
    final JDialog dialog = new JDialog();  
    dialog.setSize(400, HEIGHT);  
    dialog.setLocationRelativeTo(null);  
    dialog.addWindowListener(new WindowAdapter() {  

      @Override  
      public void windowClosing(WindowEvent e) {  
        System.exit(0);  
      }  
    });  
    dialog.addComponentListener(new ComponentAdapter() {  

      @Override  
      public void componentMoved(ComponentEvent e) {  
        SwingUtilities.invokeLater(new Runnable() {  

          @Override  
          public void run() {  
            lastLocation = dialog.getLocation();  
          }  
        });  
      }  
    });  
    dialog.getRootPane().addComponentListener(new ComponentAdapter() {  

      @Override  
      public void componentResized(ComponentEvent e) {  
        int height = dialog.getHeight();  
        if (robot != null && height != HEIGHT) {  
          robot.mouseRelease(InputEvent.BUTTON1_MASK);  
          dialog.setLocation(lastLocation);  
          dialog.setSize(dialog.getWidth(), HEIGHT);  
        }  
      }  
    });  
    dialog.setVisible(true);  
  }  
} 

【讨论】:

  • Darryl 是伟大的头脑 +1,我再次不同意肮脏的黑客,也不同意 java.awt.Robot,因为是用于测试目的的 API,而不是指定用于生产代码,对不起我的看法,也许有人可以对此感到满意
  • 不,你的答案和其他答案一样好,太真实了,某些事情是由操作系统控制的,它们应该被这样对待,没有任何干扰:-)
【解决方案3】:

找了一阵子,没找到真正满意的解决方案。我认为对话框的大小调整是直接在操作系统级别处理的,因此您只能说您希望它完全不可调整大小或完全调整大小。

下面的代码总是会阻止对话框变大,但是当用户调整对话框大小时,对话框的边框仍然会移动。

另一个选项,也是 radai 建议的,是防止调整大小并设置一个自定义内容窗格,其中包含一个鼠标侦听器,该侦听器侦听鼠标并相应地调整大小。但是,我认为这对用户来说并不是很自然(我认为您无法捕捉到对话框边框上的事件)。

import java.awt.Frame;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;

import javax.swing.JDialog;
import javax.swing.JRootPane;
import javax.swing.SwingUtilities;

public class Test {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                init();
            }
        });
    }

    public static void init() {
        final int staticHeight = 150;
        final JDialog dialog = new JDialog((Frame) null) {

            @Override
            protected JRootPane createRootPane() {
                JRootPane rp = new JRootPane() {
                    @Override
                    public void reshape(int x, int y, int w, int h) {
                        super.reshape(x, y, w, staticHeight);
                    }
                };
                rp.setOpaque(true);
                return rp;
            }

            @Override
            public void reshape(int x, int y, int width, int height) {
                super.reshape(x, y, width, staticHeight);
            }

        };
        dialog.addComponentListener(new ComponentAdapter() {
            @Override
            public void componentResized(ComponentEvent e) {
                dialog.setSize(dialog.getWidth(), staticHeight);
            }
        });
        dialog.pack();
        dialog.setVisible(true);

    }
}

【讨论】:

  • 不,没有任何合适的解决方案,ComponetListener 方法不正确,我看到肮脏的黑客从容器中取出未武装的鼠标,请在此处查看我的答案
【解决方案4】:

看起来你不能。有一个 setResizable() 方法,但它全有或全无。
您可以尝试通过在 JDialog 中使用布局来缓解此问题,以便无论 JDialog 高度如何,您的内容都保持相同的高度
或者也许(更激进一点)将其设置为不可调整大小并实现您自己的鼠标侦听器来调整自己的大小?这样你就可以完全控制

【讨论】:

    猜你喜欢
    • 2016-12-23
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    • 2011-09-13
    相关资源
    最近更新 更多