Java JOptionPane.showMessageDialog()是否显示但不显示任何消息?

Java JOptionPane.showMessageDialog()是否显示但不显示任何消息?,java,swing,joptionpane,Java,Swing,Joptionpane,在下面的代码中,我在try/catch块中调用JOptionPane.showMessageDialog。但是当错误被捕获时,我的JOptionPane是可见的,但是没有任何消息!!!有人知道我为什么以及如何纠正这个问题吗 问候 MyBoardJPannel.java package experimentations.gui; import java.awt.Graphics; import java.awt.Image; import java.io.InputStream; import

在下面的代码中,我在try/catch块中调用JOptionPane.showMessageDialog。但是当错误被捕获时,我的JOptionPane是可见的,但是没有任何消息!!!有人知道我为什么以及如何纠正这个问题吗

问候

MyBoardJPannel.java

package experimentations.gui;

import java.awt.Graphics;
import java.awt.Image;
import java.io.InputStream;

import javax.imageio.ImageIO;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class MyBoardPannel extends JPanel {

@Override
public void paint(Graphics grahics) {
            if (imageToShow == null)
        imageToShow = loadImage("sampleImage");
}

/**
 * In fact, there are not any image in project => will go to catch clause.
 * @param imageName
 */
private void loadImage(String imageName) {
    InputStream imageStream = getClass().getResourceAsStream("/"+imageName+".png");
    try {
        imageToShow = ImageIO.read(imageStream);
    }
    catch (Exception e) {
        String errorMessage = "Failed to load image "+imageName;
        System.err.println(errorMessage);
        JOptionPane.showMessageDialog(this, errorMessage,
                "Image loading error", JOptionPane.ERROR_MESSAGE);
        imageToShow = null;
        System.exit(1);
    }
}

private Image imageToShow;



}
JOptionPaneErrorShowing.java

package experimentations.gui;

import javax.swing.JFrame;

public class JOptionPaneErrorShowing extends JFrame {

public JOptionPaneErrorShowing(){
    setTitle("JOptionPane experimentation");
    setSize(300, 300);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLocationRelativeTo(null);

    add(new MyBoardPannel());
}

/**
 * @param args
 */
public static void main(String[] args) {
    new JOptionPaneErrorShowing().setVisible(true);
}

}

这可能是一个Swing并发问题。但更重要的是,您应该永远不要从paint或paintComponent方法中加载图像。在构造器或其他地方阅读,但油漆/油漆组件需要精巧且速度极快

为了解决你的问题,考虑在SvigWorksObjor对象中读取图像。但是,如果从SwingWorker的doInBackground方法中调用JOptionPane,请确保使用SwingUtilities.invokeLater(Runnable)在Swing事件线程EDT上调用它

此外,除非你在画边框和孩子,否则你几乎不想用JPanel的画法画画。而是在paintComponent方法中绘制,并且不要忘记在该paintComponent覆盖中调用super.paintComponent(g)方法。您需要阅读Swing图形教程,因为这里已经详细说明了这些内容

例如:

import java.awt.Graphics;
import java.awt.Image;
import java.io.InputStream;
import java.util.concurrent.ExecutionException;

import javax.imageio.ImageIO;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;

public class MyBoardPannel extends JPanel {
   protected static final String SAMPLE_IMAGE = "sampleImage";
   Image imageToShow = null;

   public MyBoardPannel() {
      SwingWorker<Image, Void> mySW = new SwingWorker<Image, Void>() {

         @Override
         protected Image doInBackground() throws Exception {
            return loadImage(SAMPLE_IMAGE);
         }

         @Override
         protected void done() {
            try {
               imageToShow = get();
            } catch (InterruptedException e) {
               e.printStackTrace();
            } catch (ExecutionException e) {
               e.printStackTrace();
            }
         }
      };

      mySW.execute();
   }

   @Override
   public void paintComponent(Graphics grahics) {
      super.paintComponent(grahics);
      if (imageToShow != null) {
         grahics.drawImage(imageToShow, 0, 0, null);
      }
   }

   private Image loadImage(String imageName) {
      InputStream imageStream = getClass().getResourceAsStream(
            "/" + imageName + ".png");
      try {
         return ImageIO.read(imageStream);
      } catch (Exception e) {
         final String errorMessage = "Failed to load image " + imageName;
         System.err.println(errorMessage);
         SwingUtilities.invokeLater(new Runnable() {
            public void run() {
               JOptionPane.showMessageDialog(MyBoardPannel.this, errorMessage,
                     "Image loading error", JOptionPane.ERROR_MESSAGE);
               System.exit(1);
            }
         });
      }

      return null;
   }

}
导入java.awt.Graphics;
导入java.awt.Image;
导入java.io.InputStream;
导入java.util.concurrent.ExecutionException;
导入javax.imageio.imageio;
导入javax.swing.JOptionPane;
导入javax.swing.JPanel;
导入javax.swing.SwingUtilities;
导入javax.swing.SwingWorker;
公共类MyBoardPannel扩展了JPanel{
受保护的静态最终字符串SAMPLE\u IMAGE=“sampleImage”;
图像imageToShow=null;
公共MyBoardPannel(){
SwingWorker mySW=新SwingWorker(){
@凌驾
受保护的映像doInBackground()引发异常{
返回loadImage(示例图像);
}
@凌驾
受保护的void done(){
试一试{
imageToShow=get();
}捕捉(中断异常e){
e、 printStackTrace();
}捕获(执行例外){
e、 printStackTrace();
}
}
};
mySW.execute();
}
@凌驾
公共虚空绘制组件(图形图形){
超级油漆组件(grahics);
如果(imageToShow!=null){
grahics.drawImage(imageToShow,0,0,null);
}
}
私有映像加载映像(字符串imageName){
InputStream imageStream=getClass().getResourceAsStream(
“/”+imageName+“.png”);
试一试{
返回ImageIO.read(imageStream);
}捕获(例外e){
最终字符串errorMessage=“加载图像失败”+imageName;
System.err.println(errorMessage);
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
JOptionPane.showMessageDialog(MyBoardPannel.this,errorMessage,
“图像加载错误”,作业窗格。错误消息);
系统出口(1);
}
});
}
返回null;
}
}

我真的不知道,但可能您用作JOptionPane父级的面板(通过传递
this
)不可见,或者存在其他问题。尝试添加
pack()在JOptionPaneErrorShowing构造函数的末尾

我所知道的是,当我为我的GPU使用一个旧的Ubuntu和旧的Nvidia驱动程序时,当桌面效果打开时(今天的Compiz Fusion,我不知道它是否在很久以前就被称为Compiz),我遇到了这个问题



啊哈!我找到了,您正在重新绘制方法中显示错误。永远不要那样做!将您的映像加载到MyBoardPanel类的构造函数中,并在那里显示错误消息。

非常感谢:)我不知道此类Swing问题这不是Swing问题。很简单,你是不允许这样做的。这样做是完全错误的。当您学习Java和Swing编程时,您将了解:DYou实际上被允许下载绘画或绘画组件方法内部的图像;这只是一个非常非常糟糕的想法,因为它会使GUI的绘图变慢,并使GUI几乎没有响应。非常感谢:)虽然我知道将长任务与UI线程隔离是一个很好的做法,但在当前的情况下,我没有注意到这一点。