JDialog固定高度

时间:2012-05-08 15:21:03

标签: java swing jdialog

  

可能重复:
  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);
    }
});

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

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

4 个答案:

答案 0 :(得分:4)

  • 您无法直接停止调整大小,

  • 您无法阻止容器的基本属性,

  • 容器来自Native OS,并基于其属性

  • 构建
  • 调整大小的限制是屏幕尺寸

  • 休息是(带代码)Resizing Components by @camickr

  • 有基于AbsoluteLayout的脏黑客,我不建议使用

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

答案 1 :(得分:3)

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

答案 2 :(得分: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);

    }
}

答案 3 :(得分:1)

在这里尝试这个代码示例,就是如何将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);  
  }  
}