我无法从主类中获取我的JFrame来显示另一个类的JPanel.一切都编译没有错误.
JFrameTest.java:
package jframetest;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class JFrameTest extends JFrame {
public JFrameTest() {
FlowLayout mainLayout = new FlowLayout();
setSize(320, 480);
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(mainLayout);
JPanel panelMain = new JPanel(mainLayout);
JButton testButton = new JButton("Test12");
panelMain.add(testButton);
JPanelOne panel = new JPanelOne();
panelMain.add(panel);
panel.setVisible(true);
add(panelMain);
}
public static void main(String[] arguments) {
JFrameTest frame = new JFrameTest();
frame.setVisible(true);
}
}
Run Code Online (Sandbox Code Playgroud)
JPanelOne.java:
package jframetest;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JPanel;
public class JPanelOne extends JPanel { …Run Code Online (Sandbox Code Playgroud) (在带有Swing GUI的应用程序中)我想在以循环或方法执行的某些工作中显示GlassPane,这是在单击JButton之后调用的。
例如:(单击按钮后执行的操作)
if (item.equals(button)) {
glassPane.setVisible(true);
someTimeConsumingMethod();
glassPane.setVisible(false);
}
Run Code Online (Sandbox Code Playgroud)
运行此代码会导致在someTimeConsumingMethod()执行期间未显示glassPane-GUI仅冻结了片刻,然后显示结果。删除该循环中的最后一行(glassPane.setVisible(false);)会在方法完成后(GUI冻结时)显示glassPane。
有没有简单的方法可以在GUI冻结之前显示glassPane,还是在这里需要使用一些高级知识?(线程?)
UPDATE1:
我已经根据davidXYZ答案更新了我的代码(有两个更改):
(单击按钮后执行的操作)
if (item.equals(button)) {
glassPane.setVisible(true);
new Thread(new Runnable(){
public void run(){
someTimeConsumingMethod(); // 1st change: running the someTimeConsumingMethod in new Thread
// instead of setting glassPane to visible
}
}).start();
// 2nd change: moved glassPane.setVisible(false); inside the someTimeConsumingMethod(); (placed at the end of it).
}
Run Code Online (Sandbox Code Playgroud)
第一个更改的要点是,在我的GUI线程中运行someTimeConsumingMethod之前,立即在新线程中设置glassPane可见,这是在someTimeConsumingMethod完成后再次显示了glassPane(对此进行了双重检查)。
现在工作正常,谢谢您的所有回答。我一定会检查您提供的所有链接以真正理解线程!
UPDATE2: 更多信息:someTimeConsumingMethod(); 在我的应用程序中,是根据XML数据预装新的Swing组件(由JButtons和JLabel构建的卡,其中需要的JPanel很少,并将它们添加到正确的位置)。
UPDATE3:
我正在尝试使用SwingWorker的invokeLater方法使其工作。现在看起来像这样:
(单击按钮后执行的操作)
if (item.equals(button)) {
glassPane.setVisible(true);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() …Run Code Online (Sandbox Code Playgroud)