在一个维度中调整JFrame的大小

我试图只在一个维度(在这种情况下是宽度)重新调整我的JFrame的大小,我发现这个问题JFrame只有相当大的高度 ,这给了我一个很好的答案;

addComponentListener(new ComponentAdapter() { @Override public void componentResized(ComponentEvent e) { setSize(new Dimension(preferredWidth, getHeight())); super.componentResized(e); } }); 

然后我稍微编辑了一下,这样它不是锁定宽度,而是将高度锁定到一定的大小,并允许宽度重新resize。

 import java.awt.*; import java.awt.event.*; import java.awt.Dimension; import java.awt.Component; import javax.swing.*; import java.io.*; import java.lang.*; public class mcve { JFrame numberConversionWindow = new JFrame("Number Conversion"); public void numberConvertGUI() { numberConversionWindow.setBounds(10, 10, 420, 300); numberConversionWindow.addComponentListener(new ComponentAdapter() { @Override public void componentResized(ComponentEvent e) { numberConversionWindow.setSize(new Dimension(numberConversionWindow.getWidth(), 300)); super.componentResized(e); numberConversionWindow.repaint(); } }); numberConversionWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); numberConversionWindow.setLayout(new GridLayout(1,1)); numberConversionWindow.setVisible(true); } public static void main(String[] args) { mcve mc = new mcve(); mc.numberConvertGUI(); } } 

但是此代码存在问题。 它经常出现故障。 当我开始重新调整它以使其变宽时,会出现一条黑线,在帧重新resize之前会闪烁。 闪烁的黑线

重新调整高度时会导致下一个故障。 它可能只是留下一个大的黑色区域,而不是捕捉回300,有时它根本不会反弹。 黑色区域没有回弹

所以我的问题是如何改进这些代码以防止这些故障发生,而不是只有一个高度,它会重新回到我可以禁用重新调整高度的能力? 如果我可以禁用此function,我该怎么做?

编辑

我也尝试了以下代码

 numberConversionWindow.setMinimumSize(new Dimension(420, 300)); numberConversionWindow.setMaximumSize(new Dimension(numberConversionWindow.getWidth(), 300)); 

但是,这仍然允许我重新调整JFrame的高度。

任何帮助将不胜感激

编辑2

我试图尝试使用JFrame重新调整高度的另一个答案。 我这次尝试的问题是找不到符号问题。 我有代码

 public class NumberConverter { ... static { if (System.getProperty("sun.arch.data.model").equals("32")) { // 32-bit JVM System.loadLibrary("my32bitdll"); System.out.println("Running 32-bit JVM"); } else { // 64-bit JVM System.loadLibrary("my64bitdll"); System.out.println("Running 64-bit JVM"); } } //public static native int getComponentHWND(numberConversionWindow); //public static native int setMinMaxResizeBoundaries(getComponentHWND, 420, 300, numberConversionWindow.getWidth(), 300); public void numberConvertGUI() { numberConversionWindow.setBounds(10, 10, 420, 300); int hwndForJFrame = getComponentHWND(numberConversionWindow); numberConversionWindow.setMinMaxResizeBoundaries(hwndForJFrame, 420, 300, numberConversionWindow.getWidth(), 300); ... } public static void main(String[] args) { NumberConverter nC = new NumberConverter(); nC.numberConvertGUI(); } } 

当我编译时我得到的错误cannot find symbol - method setMinMaxResizeBoundaries(int,int,int,int,int)并且cannot find symbol - getComponentHWND(numberConversionWindow) 。 我非常感谢有人向我解释我是如何正确使用setMinMaxResizeBoundariesgetComponentHWND ,以及我是如何在我的代码中输入它的。 就像在wether中我打算使用public static native int或者我打算把它放在void numberConvertGUI()

关于JFrame重新调整高度的原始答案是

 static { if (System.getProperty("sun.arch.data.model").equals("32")) { // 32-bit JVM System.loadLibrary("my32bitdll"); System.out.println("Running 32-bit JVM"); } else { // 64-bit JVM System.loadLibrary("my64bitdll"); System.out.println("Running 64-bit JVM"); } } // Sets a window to never be resized above or below these minimum widths/heights public static native int setMinMaxResizeBoundaries(int hwnd, int minWidth, int minHeight, int maxWidth, int maxHeight); 

额外的代码

 // Returns the HWND for the specified component, or -1 if does not exist public static native int getComponentHWND(Component c); 

简短的回答是你不能。 在Swing中,所有事件都转到Java代码,然后更新屏幕图形…除了调整窗口大小。 窗口本身是本机控件。 事件首先进入窗口,然后进入Java端。 您的原始代码在Java端工作,因此在您resize时窗口已经resize。 这就是造成这种毛刺行为的原因。

解决这个问题的唯一方法(没有深入挖掘C ++本机代码)是禁用本机窗口装饰并渲染自己的resize句柄。 然后你的代码会本机窗口之前收到resize事件并且故障就会消失。 这不是一项微不足道的工作,但根据您的使用情况,它可能是可行的。