GIF 在 JDialog 上未正确显示

Posted

技术标签:

【中文标题】GIF 在 JDialog 上未正确显示【英文标题】:GIF not appearing correctly on JDialog 【发布时间】:2017-10-10 18:29:27 【问题描述】:

好吧,我开发了一个带有JDialog 的等待屏幕,但它只在隔离时才有效。

这是我的代码:

/**
 *
 * @author krisnamourtscf
 */
public class TelaDeProcessamento extends Thread 

    private String titulo;
    private String mensagem;
    private JDialog dialog;

    public TelaDeProcessamento(String titulo, String mensagem) 
        this.titulo = titulo;
        this.mensagem = mensagem;
        dialog = new JDialog(new JFrame(), true);
    



     public static TelaDeProcessamento iniciaTela(String titulo, String mensagem) 
        TelaDeProcessamento tela = new TelaDeProcessamento(titulo, mensagem);

        tela.start();
        return tela;
    


    @Override
    public void run() 
        try 

            dialog.setTitle(titulo);
            dialog.getContentPane().setBackground(Color.WHITE);
            dialog.setSize(new Dimension(300, 150));
            dialog.getContentPane().setLayout(new BorderLayout());

            ImageIcon ii = new ImageIcon(getClass().getResource("/imagens/4.gif"));
            JLabel imageLabel = new JLabel();
            imageLabel.setLocation(70, 0);
            imageLabel.setText("         " + mensagem);
            imageLabel.setIcon(ii);

            dialog.getContentPane().add(imageLabel, java.awt.BorderLayout.CENTER);

            dialog.setLocationRelativeTo(null);
            dialog.validate();
            dialog.setVisible(true);

         catch (Exception ex) 
            ex.printStackTrace();
        
    

    public void paraTela() 
        dialog.dispose();
    

    public static void main(String[] args) 
        TelaDeProcessamento tela=TelaDeProcessamento.iniciaTela("Aguarde....", "isso é um teste");
        try 
            Thread.sleep(5000);
         catch (Exception ex) 

        
        tela.paraTela();

    


结果如下:

虽然,当我从另一个类调用它时,GIF 没有出现

从另一个 JDialog 类示例调用

this.setTitle(title);
        this.setModal(true);
        this.setLocationRelativeTo(null);
        TelaDeProcessamento tela = TelaDeProcessamento.iniciaTela("Aguarde", "carregando dados");
        this.initiateScreenComponets();
        tela.paraTela();
        JTableUtil.addEventosSelecaoBusca(this);
        this.setVisible(true);

结果:

我做错了什么?

【问题讨论】:

我怀疑这是因为您在 AWT 事件调度线程之外执行您的操作。几乎所有的 Swing 和 AWT 方法都必须只在该线程中运行,而不能在其他线程中运行。违反此规则将导致奇怪和不可预测的行为。见docs.oracle.com/javase/tutorial/uiswing/concurrency。 感谢@VGR 我用 SwingWorker 解决了问题 【参考方案1】:

在路径中查找 gif 时可能有问题...验证一下!!

尝试您的代码后,我可以确认您的代码必须有效!

【讨论】:

不是路径问题 阅读上面的评论,这可能是一个 Theading 问题@Krismorte 我都尝试过并且正在工作......它必须与路径相关【参考方案2】:

我不需要改变我的 Class 只是调用方法

旧电话

@Override
            public void initiate(String title) 
    this.setTitle(title);
    this.setModal(true);
    this.setLocationRelativeTo(null);
    TelaDeProcessamento tela = TelaDeProcessamento.iniciaTela("Aguarde", "carregando dados");
    this.initiateScreenComponets();
    tela.paraTela();
    JTableUtil.addEventosSelecaoBusca(this);
    this.setVisible(true);

新电话

       @Override
        public void initiate(String title) 
            this.setTitle(title);
            this.setModal(true);
            this.setLocationRelativeTo(null);
            procedimentoDeEspera();   
        

  private void procedimentoDeEspera() 
        SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() 
            @Override
            protected Void doInBackground() throws Exception 
                TelaDeProcessamento.iniciaTela("Aguarde", "carregando dados");
                initiateScreenComponets();
                return null;
            


            @Override
            protected void done() 
                TelaDeProcessamento.paraTela();
                finalizaTela();
            


        ;

        worker.execute();
    

这个链接帮助了我 https://www.javacodegeeks.com/2012/12/multi-threading-in-java-swing-with-swingworker.html

【讨论】:

以上是关于GIF 在 JDialog 上未正确显示的主要内容,如果未能解决你的问题,请参考以下文章

Java中JDialog如何调整大小,要可行

调整大小的 opencv 图像在 QWidget C++ 上未正确显示

Unicode 字体在 Chrome 上未正确显示

UISearchController 中的 searchBar 在 iPad 上的拆分视图上未正确显示

实例化的预制比例在客户端上未正确显示

iPhone 上未正确显示预格式化文本