![]() |
1
2
你的问题引起了我的兴趣。经过一些调查,我想我确认了一些我记得的关于设置窗口状态(最大化、还原等)的事情,即设置状态是对操作系统的请求,由操作系统的突发奇想来处理请求。这意味着它是异步的,或者至少是在设置之后完成的。我确认使用了日志记录和添加resize监听器,您可以在其中看到在代码块退出后调整了框架的大小。因此,pack()会将组件布局为其首选大小。所以想象一下框架的大小是800x600,组件的位置是这样的(按钮水平居中在400左右)。然后,操作系统将帧的大小更改为全屏(例如1024x768)-一会儿,您将看到按钮仍为400。然后,帧处理新的大小,重新布局组件,并将按钮居中在512左右。所以在这个过程中你会看到闪烁的转变。也许一个解决方案是不要pack()—它将保持0的大小,用户将看到最小的闪烁。 请先尝试此更改:
如果这看起来不错,那么你可能会遇到下一个问题……如果用户单击restore按钮,整个帧就会缩小成一个黑洞。因此,请尝试在帧由于最大化而可预测地调整大小后调用pack。像这样的:
因此,如果用户稍后单击还原按钮,框架将有一个很好的包装尺寸准备去。 ——更新 好的,最后一次尝试。虽然我认为我对这个问题的描述有些道理,但我提供的解决方案却毫无用处。这是最后一次尝试。remove pack()和setPreferredSize()并替换为将大小设置为屏幕大小。这似乎大大减少了我的系统闪烁。这是因为初始布局和以后完成的最大化布局之间应该没有区别。如果在“还原”和“最大化”之间切换,可以看到这一点。虽然在切换这两个选项时,我仍然可以看到非常轻微的闪烁,但至少在第一次显示时看起来更好。
-迈克 |
![]() |
2
1
也许你错过了
|
![]() |
3
1
好吧,如果它与sscce一起工作,那么你已经证明了问题不在于基本逻辑。在sscce和你的真实代码之间一定有些不同。因为我们无法访问您的真实代码,所以您需要自己进行调试,看看有什么不同。 不过,在这种情况下,更好的解决方案是使用CardLayout,它的设计是让您可以轻松交换面板。阅读swing教程以获得一个工作示例。 或者另一种方法是使用“登录对话框”。登录成功后,您将显示带有应用程序面板的主框架。 |
![]() |
4
1
我猜你需要先调用pack(),然后才能使你的帧可见。 如果你要调用上面的代码 不 在事件线程上,然后您有一个竞争条件,并且所有的下注都是关闭的-您只能从edt(事件分派线程)操作gui。 编辑:我在我的系统上试过你的sscce,但它没有显示你看到的行为。我试了大约50次,还试着通过循环代码创建10个窗口。我在windows xp sp3上运行1.6.0u18。 |
![]() |
5
1
“然后在几毫秒内”部分听起来像是你需要打电话给
|
![]() |
6
0
如果我复制了你的代码,我也有同样的问题,但没有那么重。 我在包装前给你的镜框定了一个合适的尺寸。所以:
我在Linux上运行。 真奇怪…我敢肯定它和秋千树上所有的容器差不多大。 |
![]() |
7
0
我希望在显示帧之前将其最大化,但在检查之后,我确信在linux上,在显示帧之后将其最大化。在调用setvisible之前,可以使框架大小等于屏幕大小,或者可以使组件不可见,直到知道它具有首选的初始大小。下面是修改后的示例,它显示了框架被激活后的元素(在Linux上,激活的事件来得太晚,以至于没有显示“跳转按钮”):
导入javax.swing.jframe; 导入javax.swing.jpanel; 导入javax.swing.swinguilities; 公共类测试{
} |
![]() |
8
0
看起来像是一个Java错误。我已经报告过了(但出于某种原因,它仍然没有显示在bug报告中)。 |
![]() |
Ummayair Ahmad · 如何从另一个类添加到JPanel 2 年前 |
![]() |
Klopo22 · 如何将插入符号移动到另一个JTextField 2 年前 |
![]() |
Kirito · 如何将焦点设置为图像或标签?[Java Swing] 2 年前 |
![]() |
Didi1995 · 在swing java中传递文件路径 3 年前 |
![]() |
dl784 · Java Swing登录窗口未关闭 3 年前 |
![]() |
user16911064 · 在JTable中创建组 3 年前 |
![]() |
Jessie Smetts · 它不会划清界限 3 年前 |
![]() |
shrimpwidget · 如何对齐并排面板,Java swing 3 年前 |