Java JOptionPane.showMessageDialog()是否显示但不显示任何消息?
在下面的代码中,我在try/catch块中调用JOptionPane.showMessageDialog。但是当错误被捕获时,我的JOptionPane是可见的,但是没有任何消息!!!有人知道我为什么以及如何纠正这个问题吗 问候 MyBoardJPannel.javaJava 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
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线程隔离是一个很好的做法,但在当前的情况下,我没有注意到这一点。