在一个维度中调整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)
。 我非常感谢有人向我解释我是如何正确使用setMinMaxResizeBoundaries
和getComponentHWND
,以及我是如何在我的代码中输入它的。 就像在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事件,并且故障就会消失。 这不是一项微不足道的工作,但根据您的使用情况,它可能是可行的。