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

时间:2015-05-08 22:20:52

标签: java swing jframe

我试图仅在一个维度(本例中为宽度)重新调整我的JFrame大小,我发现这个问题JFrame re-sizable height ONLY给了我一个很好的答案;

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

我稍微编辑了一下,因此它不是锁定宽度,而是将高度锁定到一定的大小,并允许宽度重新调整大小。

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();
    }
}

但是此代码存在问题。它经常出现故障。当我开始重新调整大小以使其更宽时,有一条黑线在帧重新调整大小之前闪烁。 Flickering black line

重新调整高度时会出现下一个故障。它可能只留下一个大的黑色区域,而不是回到300,有时它根本不会反弹。 Black area No snap back

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

修改

我也尝试过以下代码

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

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

非常感谢任何帮助

修改2

我试图尝试使用JFrame re-sizable height ONLY中的另一个答案。我对这次尝试的问题是找不到符号问题。 我有代码

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正确,以及我打算如何在我的代码中输入它。就像在我说的那样,我打算使用public static native int,或者我打算把它放在虚空中numberConvertGUI()

JFrame re-sizable height ONLY上的原始答案是

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);

1 个答案:

答案 0 :(得分:1)

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

解决这个问题的唯一方法是(无需深入研究C ++本机代码)是禁用本机窗口装饰并渲染自己的调整大小句柄。然后您的代码会在本机窗口之前收到调整大小事件,并且毛刺就会消失。这不是一项微不足道的工作,但根据您的使用情况,这可能是可行的。