2015-10-12 6 views
0

Я всегда ищу вопросы в StackOverflow, но, похоже, я не нашел ответа на этот вопрос.Java Canvas drawImage Flashes

Я использую Java для создания приложения с формами Swing. Я добавил компонент Canvas AWT в JFrame.

Предварительно загрузите изображение из БД, нарисуйте его на холсте, а затем установите JFrame как видимый.

Проблема заключается в том, что изображение будет мигать: оно отображается в течение нескольких миллисекунд, тогда JFrame перекрашивается.

Почему это происходит? Я также попытался переопределить метод paint() в JFrame и нарисовать изображение каждый раз, когда вызывается paint. Но это не работает.

Button Frame (основной кадр) - (заменить final String imgPath с образцом изображения по вашему выбору)

import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 

public class ButtonFrame extends javax.swing.JFrame { 

    public ButtonFrame() { 
     initComponents(); 
    } 

    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code">       
    private void initComponents() { 

     jButton1 = new javax.swing.JButton(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

     jButton1.setText("View Image"); 
     jButton1.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       jButton1ActionPerformed(evt); 
      } 
     }); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addGap(59, 59, 59) 
       .addComponent(jButton1) 
       .addContainerGap(44, Short.MAX_VALUE)) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addGap(54, 54, 54) 
       .addComponent(jButton1) 
       .addContainerGap(70, Short.MAX_VALUE)) 
     ); 

     pack(); 
    }// </editor-fold>       

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           
     final String imgPath = "/tmp/img.png"; 

     try 
     { 
      BufferedImage bi = ImageIO.read(new File(imgPath)); 

      ImgFrame imgFrame = new ImgFrame(); 
      imgFrame.setImage(bi); 
      imgFrame.setVisible(true); 

//   imgFrame.setImageInCanvas(bi); 

     } catch (IOException x) {} 
    }           

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String args[]) { 
     /* Set the Nimbus look and feel */ 
     //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> 
     /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. 
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */ 
     try { 
      for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
       if ("Nimbus".equals(info.getName())) { 
        javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
        break; 
       } 
      } 
     } catch (ClassNotFoundException ex) { 
      java.util.logging.Logger.getLogger(ButtonFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (InstantiationException ex) { 
      java.util.logging.Logger.getLogger(ButtonFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (IllegalAccessException ex) { 
      java.util.logging.Logger.getLogger(ButtonFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
      java.util.logging.Logger.getLogger(ButtonFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } 
     //</editor-fold> 

     /* Create and display the form */ 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new ButtonFrame().setVisible(true); 
      } 
     }); 
    } 

    // Variables declaration - do not modify      
    private javax.swing.JButton jButton1; 
    // End of variables declaration     
} 

ImageFrame (кадр, где отображается изображение)

import java.awt.Graphics; 
import java.awt.image.BufferedImage; 

public class ImgFrame extends javax.swing.JFrame { 

    BufferedImage bi; 

    public ImgFrame() { 
     initComponents(); 
    } 

    public void setImage(BufferedImage bi) 
    { 
     this.bi = bi; 
    } 

    public void setImageInCanvas(BufferedImage bi) 
    { 
     canvas1.getGraphics().drawImage(bi, 0, 0, null); 
    } 

    @Override 
    public void paint(Graphics g) 
    { 
     setImageInCanvas(bi); 
    } 

    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code">       
    private void initComponents() { 

     canvas1 = new java.awt.Canvas(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addComponent(canvas1, javax.swing.GroupLayout.PREFERRED_SIZE, 266, javax.swing.GroupLayout.PREFERRED_SIZE) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addComponent(canvas1, javax.swing.GroupLayout.PREFERRED_SIZE, 155, javax.swing.GroupLayout.PREFERRED_SIZE) 
     ); 

     pack(); 
    }// </editor-fold>       


    // Variables declaration - do not modify      
    private java.awt.Canvas canvas1; 
    // End of variables declaration     
} 

Видео пример: https://drive.google.com/file/d/0B53gOV_BD8J8Mm10LW5CN2E3M2M/view


Проблема была решена:

Я переопределен метод paint в JFrame так:

@Override 
public void paint(Graphics g) 
{ 
    g.drawImage(bi, 0, 0, null); 
} 

Где bi является BufferedImage.

Затем холст перекрывал форму, поскольку она была установлена ​​в соответствии с JFrame, и изображение не отображалось. Я удалил его (холст AWT), и изображение теперь отображается в фоновом режиме.

спасибо!

Особая благодарность Dodd10x и Andrew Thompson.

+1

1) Чтобы лучше помочь, опубликуйте [MCVE] или [Short, Self Contained, Correct Example] (http://www.sscce.org/). 2) Но 'canvasImagen.getGraphics() ..', который не сулит ничего хорошего. Это почти всегда неправильный способ рисовать компонент. –

+1

@AndrewThompson: Создание MCVE. –

+0

@AndrewThompson: созданный MCVE и пример видео (в более высоком качестве) проблемы добавлены. –

ответ

3

Не смешивайте Swing и AWT. Первое, что нужно изменить, - переключиться с Canvas на JComponent, если вы показываете в JFrame.

+0

Учитель курса требовал от нас только использования AWT Canvas вместе с Swing. Спасибо за это. –

+0

Вы в этом уверены? Можете ли вы использовать Frame вместо JFrame? – Dodd10x

+0

Да. Я уверен. Он хочет, чтобы изображение было нарисовано на холсте AWT. Я сейчас попробую использовать только Frame вместо JFrame и расскажу вам, что результат. –

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