6

可能重复:
JDialog 允许用户仅更改对话框的宽度

我有一个 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

4 回答 4

4
  • 你不能直接停止调整大小,

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

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

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

  • 其余是(带代码)@camickr 调整组件大小

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

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

于 2012-05-08T16:13:31.727 回答
3

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

于 2012-05-08T15:37:11.783 回答
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);

    }
}
于 2012-05-08T15:58:56.617 回答
1

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

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);  
  }  
} 
于 2012-05-08T16:46:50.563 回答