如果您有JNI的经验,那么这是一个可能的解决方案。
在Windows和Oracle Hotspot中,此代码将允许窗口在最小和最大尺寸之间调整大小,而不会闪烁或引起任何令人讨厌的JFrame-post-resize副作用。如果该代码在JFrame创建并可见后被调用,则上面使用的componentResized()中捕获调整大小事件的代码可以完全取消,因为Windows具有防止用户能够调整大小到指定的最小/最大尺寸的功能。
// Java代码:
static {
if (System.getProperty("sun.arch.data.model").equals("32"))
{
System.loadLibrary("my32bitdll");
System.out.println("Running 32-bit JVM");
} else {
System.loadLibrary("my64bitdll");
System.out.println("Running 64-bit JVM");
}
}
public static native int setMinMaxResizeBoundaries(int hwnd, int minWidth, int minHeight, int maxWidth, int maxHeight);
// C++代码(包括标准的windows.h、winbase.h等头文件)
struct SHwndMinMax
;
SHwndMinMax gsHwndMinMax[2048];
int gsHwndMinMaxCount = 0;
LRESULT CALLBACK MinMaxWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
JNIEXPORT jint JNICALL Java_your_class_here_setMinMaxResizeBoundaries(JNIEnv* env, jclass cls,
jint hwnd,
jint minWidth, jint minHeight,
jint maxWidth, jint maxHeight)
else
} else
}
LRESULT CALLBACK MinMaxWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
else
}
}
return(0);
}
//以下是获取HWND的代码:
// Java代码(添加到上面的Java代码中)
public static native int getComponentHWND(Component c);
// C++ 代码
JNIEXPORT jint JNICALL Java_your_class_here_getComponentHWND(JNIEnv* env, jclass cls, jobject obj)
{
HWND hWnd = 0;
typedef jboolean (JNICALL *PJAWT_GETAWT)(JNIEnv*, JAWT*);
JAWT awt;
JAWT_DrawingSurface* ds;
JAWT_DrawingSurfaceInfo* dsi;
JAWT_Win32DrawingSurfaceInfo* dsi_win;
jboolean result;
jint lock;
HMODULE _hAWT = 0;
if (!_hAWT)
_hAWT = LoadLibrary(L"jawt.dll");
if (!_hAWT)
_hAWT = LoadLibrary(L"awt.dll");
if (_hAWT)
{
PJAWT_GETAWT JAWT_GetAWT = (PJAWT_GETAWT)GetProcAddress(_hAWT, "JAWT_GetAWT");
if (JAWT_GetAWT)
{
awt.version = JAWT_VERSION_1_4;
result = JAWT_GetAWT(env, &awt);
if (result != JNI_FALSE)
{
ds = awt.GetDrawingSurface(env, obj);
if (ds != NULL)
{
lock = ds->Lock(ds);
if ((lock & JAWT_LOCK_ERROR) == 0)
{
dsi = ds->GetDrawingSurfaceInfo(ds);
if (dsi)
{
dsi_win = (JAWT_Win32DrawingSurfaceInfo*)dsi->platformInfo;
if (dsi_win)
hWnd = dsi_win->hwnd;
else
hWnd = (HWND) -1;
ds->FreeDrawingSurfaceInfo(dsi);
} else {
hWnd = (HWND)-2;
}
ds->Unlock(ds);
} else {
hWnd = (HWND)-3;
}
awt.FreeDrawingSurface(ds);
} else {
hWnd = (HWND)-4;
}
} else {
hWnd = (HWND)-5;
}
} else {
hWnd = (HWND)-6;
}
} else {
hWnd = (HWND)-7;
}
return (jint)hWnd;
}