图形用户界面(GUI),用于上传图像并动态显示到面板(GUI内)

问题描述:

我对GUI构建相对比较陌生。图形用户界面(GUI),用于上传图像并动态显示到面板(GUI内)

我想用一个按钮(我已经拥有)让一个用户可以按下并选择一个图像然后动态地将该图像加载到面板的GUI中。 我希望图像在用户每次浏览图像时动态更改。

到目前为止我的代码是....但我无法将按钮连接到JPanel或其他东西。

import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import javax.swing.*; 

public class WebAppImg extends javax.swing.JFrame { 
    private int image_height; 
    private int image_aspect_ratio; 
    private Graphics2D engine; 
    private JLabel photoComponent;  

    /** 
    * Creates new form WebAppImg 
    */ 
    public WebAppImg() { 
     initComponents(); 
    } 

    /** 
    * This method is called from within the constructor to initialize the form. 
    * WARNING: Do NOT modify this code. The content of this method is always 
    * regenerated by the Form Editor. 
    */ 
    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code"> 
    private void initComponents() { 

     jButton1 = new javax.swing.JButton(); 
     jTextField1 = new javax.swing.JTextField(); 
     jLabel1 = new javax.swing.JLabel(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
     setPreferredSize(new java.awt.Dimension(600, 480)); 

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

     jTextField1.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       jTextField1ActionPerformed(evt); 
      } 
     }); 

     jLabel1.setText("label2"); 

     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(21, 21, 21) 
       .addComponent(jButton1) 
       .addGap(154, 154, 154) 
       .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 239, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addContainerGap(133, Short.MAX_VALUE)) 
      .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() 
       .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
       .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 199, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addGap(120, 120, 120)) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() 
       .addGap(57, 57, 57) 
       .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 163, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 141, Short.MAX_VALUE) 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
        .addComponent(jButton1) 
        .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) 
       .addGap(35, 35, 35)) 
     ); 

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

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { 
     JFileChooser chooser = new JFileChooser(); 
     JLabel label2 = new JLabel(); 
     JInternalFrame jInternalFrame1 = new JInternalFrame(); 
     chooser.showOpenDialog(null); 
     File f = chooser.getSelectedFile(); 
     String filename = f.getAbsolutePath(); 
     jTextField1.setText(filename); 
     jInternalFrame1.getDesktopIcon(); 
    } 

    private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt) { 
     // TODO add your handling code here: 
    } 

    /** 
    * @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(WebAppImg.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (InstantiationException ex) { 
      java.util.logging.Logger.getLogger(WebAppImg.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (IllegalAccessException ex) { 
      java.util.logging.Logger.getLogger(WebAppImg.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
      java.util.logging.Logger.getLogger(WebAppImg.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 WebAppImg().setVisible(true); 
      } 
     }); 
     //Create a file chooser 

    } 
    // Variables declaration - do not modify 
    private javax.swing.JButton jButton1; 
    private javax.swing.JLabel jLabel1; 
    private javax.swing.JTextField jTextField1; 
    // End of variables declaration 
} 
+0

*,但我不能按钮连接到一个JPanel或东西*代码没有如预期的吧...请你报oborate。 JInternalFrame是什么? –

我想你想的是要显示,如果是这样jButton1ActionPerformed方法改变你对这个选择的图像:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { 
    JFileChooser chooser = new JFileChooser(); 
    chooser.showOpenDialog(null); 
    File f = chooser.getSelectedFile(); 
    String filename = f.getAbsolutePath(); 
    jTextField1.setText(filename); 
    try { 
     ImageIcon ii=new ImageIcon(scaleImage(120, 120, ImageIO.read(new File(f.getAbsolutePath()))));//get the image from file chooser and scale it to match JLabel size 
     jLabel1.setIcon(ii); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
} 

public static BufferedImage scaleImage(int w, int h, BufferedImage img) throws Exception { 
    BufferedImage bi; 
    bi = new BufferedImage(w, h, BufferedImage.TRANSLUCENT); 
    Graphics2D g2d = (Graphics2D) bi.createGraphics(); 
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
    g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY)); 
    g2d.drawImage(img, 0, 0, w, h, null); 
    g2d.dispose(); 
    return bi; 
} 

一个更好的解决方案,你会使用SwingWorker加载图像看所以UI犯规变得反应迟钝(如果图像是大):

private ImageIcon ii; 

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { 
    JFileChooser chooser = new JFileChooser(); 
    chooser.showOpenDialog(null); 
    final File f = chooser.getSelectedFile(); 
    String filename = f.getAbsolutePath(); 
    if (f == null) { 
     return; 
    } 
    jTextField1.setText(filename); 

    SwingWorker sw = new SwingWorker() { 
     @Override 
     protected Object doInBackground() throws Exception { 
      Thread.sleep(5000);//simulate large image takes long to load 
      ii = new ImageIcon(scaleImage(120, 120, ImageIO.read(new File(f.getAbsolutePath())))); 
      return null; 
     } 

     @Override 
     protected void done() { 
      super.done(); 
      jLabel1.setIcon(ii); 
     } 
    }; 
    sw.execute(); 

} 
+1

谢谢大卫。很简单。 ;) 各位新年快乐! –

+0

和大卫。您添加了名为'scaleImage'的这个类的目的是什么?谢谢。 –

+0

@GeorgeKourou看到我的更新。此外,该方法仅用于缩放图像以适应JLabel,而不是使用具有已知问题的'getScaledInstance'。见[这里](http://*.com/questions/12660122/image-resizing-and-displaying-in-a-jpanel-or-a-jlabel-without-loss-of-quality/12660146#12660146)for更多 –