2012-02-01 3 views
1

Моя проблема заключается в том, что когда я создаю окно диалога с помощьюФоновое изображение не отображается после JOptionPane.showMessageDialog

JOptionPane.showMessageDialog(...) 

На приложение, которое отображает JPanel, которая рисует изображение в качестве фона (взято из: java swing: how to add an image to a jpanel), обратное изображение не отображается, поэтому мне нужно минимизировать и максимизировать приложение, чтобы вернуть фоновое изображение.

До сих пор я могу только получить обратно фоновое изображение, делая что-то вроде этого:

app.getApplication().getMainFrame().repaint(); 

, но он работает только после того, как я закрыть окно сообщений.

Любые идеи?

+1

* «? Есть идеи» * Для лучшей помощи раньше, опубликовать [SSCCE] (http://sscce.org/). Для SSCCE, связанного с изображением (-ами), либо [сгенерируйте их в коде] (http://stackoverflow.com/questions/5621338/about-swing-and-jtable/5630271#5630271), либо [горячая ссылка] (http : //pscode.org/media/#image). –

+0

Я узнал, что эта ошибка происходит только тогда, когда JOptionPane является модальным. – user935581

+0

Измените 'null' на' this' и он должен работать для модального диалога. Если нет, отправьте сообщение SSCCE. –

ответ

3

Ссылка, которую вы опубликовали, в том, что он обращается к изображению с файлом, что кажется мне не таким хорошим способом доступа к ресурсам приложений, для чего вы должны использовать URL. Посмотрите на этот пример кода, и проверить, где вы собираетесь неправильно с этим:

import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.image.BufferedImage;  
import java.io.IOException; 
import java.net.MalformedURLException; 
import java.net.URL; 
import javax.imageio.ImageIO; 
import javax.swing.*; 

public class ImageTest extends JPanel 
{ 
    private BufferedImage image; 

    private void displayGUI() 
    { 
     JFrame frame = new JFrame("Image Test"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationRelativeTo(null); 

     try 
     { 
      setImage(new URL("http://gagandeepbali.uk.to/" + 
       "gaganisonline/images/planetbackground.jpg")); 
     } 
     catch(MalformedURLException mue)  
     { 
      mue.printStackTrace(); 
     } 


     frame.setContentPane(this); 
     frame.pack(); 
     frame.setVisible(true);   
     JOptionPane.showMessageDialog(frame, 
           "I am working.", 
           "Image Working ?", 
           JOptionPane.QUESTION_MESSAGE); 
    } 

    private void setImage(URL path) 
    { 
     try 
     {  
      System.out.println(path); 
      image = ImageIO.read(path); 
     } 
     catch(IOException ioe) 
     { 
      ioe.printStackTrace(); 
     } 
    } 

    @Override 
    public Dimension getPreferredSize() 
    { 
     return (new Dimension(image.getWidth(), image.getHeight())); 
    } 

    @Override 
    protected void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     g.drawImage(image, 0, 0, this); 
    } 

    public static void main(String... args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       new ImageTest().displayGUI(); 
      } 
     }); 
    } 
} 
+0

Недопустимая реализация paintComponent (помните: непрозрачное свойство JPanel по умолчанию истинно :-) – kleopatra

+0

'JPanel' действительно не непрозрачен для каждого' LookAndFeel'. Для некоторых LookAndFeel это не так. –

+0

, так что - потому что это случайно не нарушает его контракт в некоторых странных ЛАФ, правильно ли это нарушать в других? -1 – kleopatra

Смежные вопросы