小编TV.*_*TV.的帖子

在JFrame中将另一个类的JPanel添加到JPanel

我无法从主类中获取我的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)

java user-interface swing jpanel jframe

9
推荐指数
3
解决办法
7万
查看次数

进入循环前显示GlassPane

(在带有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)

java swing glasspane order-of-execution

3
推荐指数
1
解决办法
1219
查看次数