首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java,Swing - JPanel没有像预期的那样出现在JFrame中

Java,Swing - JPanel没有像预期的那样出现在JFrame中
EN

Stack Overflow用户
提问于 2016-11-20 00:10:01
回答 1查看 228关注 0票数 1

我得到了一个名为PleaseWait的java类,希望在执行繁重任务时调用它。当我的程序执行繁重的任务时,在我的actionListener的第一行中,我设置了这个类的变量setVisible(true),然后在actionListener的末尾设置setVisible(true)

不知何故,这个类中的JPanel在我调用它时不出现,它只是一个窗口,标题为set,白色为空白内容。这是我的密码:

代码语言:javascript
运行
复制
public class PleaseWait extends JFrame{

public PleaseWait(){

    Toolkit toolkit = Toolkit.getDefaultToolkit();

    Dimension screenDimensions = toolkit.getScreenSize();
    setSize(300,100); //set size based on screen size
    setTitle("Please wait");
    Container container = getContentPane();
    setLocation(new Point(screenDimensions.width*1/4+200, screenDimensions.height*1/4+200)); //set location based on screen size

    JPanel panel = new JPanel();
    JLabel wait = new JLabel("Please wait");
    Dimension buttonsSize = new Dimension(300,100);
    panel.setPreferredSize(buttonsSize);
    wait.setPreferredSize(buttonsSize);
    panel.setLayout(new BorderLayout());
    panel.add(wait, BorderLayout.CENTER);
    container.add(panel);

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setResizable(false); //unresizable
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-20 00:21:05

关键不在您发布的代码中,而是在下面一行:

当一项繁重的任务正在进行时,想要调用它。

您正在运行一个“繁重”的任务,在运行它时,Swing没有绘制这个GUI,因为您可能在Swing事件线程上运行该任务,这样做会冻结线程、和GUI

解决方案:使用可以通过SwingWorker获得的后台线程来运行“繁重”任务。

其他方面的问题:

  • 这似乎是主应用程序之外的“依赖”或“子”窗口。如果是这样的话,它不应该是JFrame,因为应用程序应该只有一个主应用程序窗口,而是应该是一个JDialog。
  • 您正在使用setPreferredSize(...)并对组件大小进行硬编码,这是一个充满问题的问题。

例如,

代码语言:javascript
运行
复制
import java.awt.*;
import java.awt.Dialog.ModalityType;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

import javax.swing.*;

public class TestPleaseWait {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            MainPanel mainPanel = new MainPanel();
            JFrame frame = new JFrame("Application");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(mainPanel);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        });
    }
}

@SuppressWarnings("serial")
class MainPanel extends JPanel {
    private static final int PREF_W = 600;
    private static final int PREF_H = 450;

    public MainPanel() {
        add(new JButton(new AbstractAction("Without Background Thread") {
            {
                putValue(MNEMONIC_KEY, KeyEvent.VK_O);
            }

            @Override
            public void actionPerformed(ActionEvent e) {
                final PleaseWait wait = new PleaseWait();
                wait.setVisible(true);
                try {
                    Thread.sleep(4000);
                } catch (InterruptedException e1) {
                }
                wait.setVisible(false);
            }
        }));
        add(new JButton(new AbstractAction("With Background Thread") {
            private JDialog waitDialog = null;
            private MyWaitPanel myWaitPanel = new MyWaitPanel();

            {
                putValue(MNEMONIC_KEY, KeyEvent.VK_W);
            }

            @Override
            public void actionPerformed(ActionEvent e) {
                if (waitDialog == null) {
                    Component component = MainPanel.this;
                    Window win = SwingUtilities.getWindowAncestor(component);
                    waitDialog = new JDialog(win, "Please Wait", ModalityType.APPLICATION_MODAL);
                    waitDialog.add(myWaitPanel);
                    waitDialog.pack();
                    waitDialog.setLocationRelativeTo(win);
                }

                new Thread(() -> {
                    try {
                        Thread.sleep(4000);
                    } catch (InterruptedException e1) {
                    }
                    SwingUtilities.invokeLater(() -> {
                        waitDialog.setVisible(false);
                    });

                }).start();
                waitDialog.setVisible(true);
            }
        }));
    }

    @Override
    public Dimension getPreferredSize() {
        if (isPreferredSizeSet()) {
            return super.getPreferredSize();
        }
        return new Dimension(PREF_W, PREF_H);
    }
}

@SuppressWarnings("serial")
class MyWaitPanel extends JPanel {
    private JProgressBar progressBar = new JProgressBar();

    public MyWaitPanel() {
        progressBar.setIndeterminate(true);

        JLabel waitLabel = new JLabel("Please Wait", SwingConstants.CENTER);
        waitLabel.setFont(waitLabel.getFont().deriveFont(Font.BOLD, 40));

        int ebGap = 10;
        setBorder(BorderFactory.createEmptyBorder(ebGap, ebGap, ebGap, ebGap));
        setLayout(new BorderLayout(ebGap, ebGap));
        add(waitLabel, BorderLayout.PAGE_START);
        add(progressBar);
    }
}

@SuppressWarnings("serial")
class PleaseWait extends JFrame {

    public PleaseWait() {

        Toolkit toolkit = Toolkit.getDefaultToolkit();

        Dimension screenDimensions = toolkit.getScreenSize();
        setSize(300, 100); // set size based on screen size
        setTitle("Please wait");
        Container container = getContentPane();
        setLocation(new Point(screenDimensions.width * 1 / 4 + 200,
                screenDimensions.height * 1 / 4 + 200));

        JPanel panel = new JPanel();
        JLabel wait = new JLabel("Please wait");
        Dimension buttonsSize = new Dimension(300, 100);
        panel.setPreferredSize(buttonsSize);
        wait.setPreferredSize(buttonsSize);
        panel.setLayout(new BorderLayout());
        panel.add(wait, BorderLayout.CENTER);
        container.add(panel);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false); // unresizable
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40699320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档