JDialog 只在程序结束时加载

问题描述

我正在为一个项目使用 jdialog,当我单击位于 JFrame 内的按钮时会加载该项目。

这个jdialog本来是要显示一个图片的,但是这个图片只有在JFrame类调用代码执行的时候才会出现。我的问题是我希望图像在调用显示,而不是在程序结束时显示

这是我的 jdialog 代码

public class LoadingWindow {

    private jdialog dialog;
    
    public LoadingWindow() {
        this.dialog = new jdialog();
        this.dialog.setDefaultCloSEOperation(jdialog.disPOSE_ON_CLOSE);
        this.dialog.setTitle("Veuillez patienter");
        this.dialog.setSize(300,200);
        URL url = LoadingWindow.class.getResource("/images/wait.gif");
        ImageIcon icon = new ImageIcon(url);
        JLabel imageLabel = new JLabel();
        imageLabel.setIcon(icon);
        imageLabel.setHorizontalAlignment(JLabel.CENTER);
        imageLabel.setVerticalAlignment(JLabel.CENTER);
        this.dialog.getContentPane().add(imageLabel);
        this.dialog.setLocationRelativeto(null);
        this.dialog.setVisible(true);
    }
    
    public void stop() {
        this.dialog.dispose();
    }
}

在我的 JFrame 中,我以这种方式调用 jdialog :

Myjdialog mjd = new Myjdialog ();
[CODE]
mjd.stop();

谢谢!

解决方法

这是一个打开 JDialog 的 GUI 示例。

JDialog GUI

这是我使用的图像。

Car Image

我创建了一个 JFrame 和一个带有 JPanelJButtonJButton 具有打开 ActionListenerJDialogJDialog 显示汽车图像。

这是我使用的完整的可运行代码。

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class JDialogTest implements Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new JDialogTest());
    }

    private JFrame frame;

    @Override
    public void run() {
        frame = new JFrame("JDialog Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.add(createMainPanel());

        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private JPanel createMainPanel() {
        JPanel panel = new JPanel(new BorderLayout());
        panel.setBorder(BorderFactory.createEmptyBorder(
                150,100,150,100));
        panel.setPreferredSize(new Dimension(400,400));

        JButton button = new JButton("Open JDialog");
        button.addActionListener(new ButtonListener());
        panel.add(button);

        return panel;
    }

    public class ButtonListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            new CalculateDecor(frame,"Spash Screen");
        }

    }

    public class CalculateDecor extends JDialog {

        private static final long serialVersionUID = 1L;

        public CalculateDecor(JFrame frame,String title) {
            super(frame,true);
            Image image = getImage();
            
            setDefaultCloseOperation(DISPOSE_ON_CLOSE);
            setTitle(title);

            JPanel panel = new JPanel(new BorderLayout());

            JLabel label = new JLabel();
            label.setHorizontalAlignment(JLabel.CENTER);
            label.setIcon(new ImageIcon(image));
            panel.add(label);

            add(panel);
            pack();
            setLocationRelativeTo(frame);
            setVisible(true);

            System.out.println(getDecorationSize());
        }

        private Dimension getDecorationSize() {
            Rectangle window = getBounds();
            Rectangle content = getContentPane().getBounds();
            int width = window.width - content.width;
            int height = window.height - content.height;
            return new Dimension(width,height);
        }
        
        private Image getImage() {
            try {
                return ImageIO.read(getClass().getResourceAsStream(
                        "/car.jpg"));
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }
        }

    }

}