简单的Java显示图像

Rob*_*Rob 0 java graphics image

我有一个使用netbeans编写的GUI,其中包含一些简单的组件.我希望能够在JFrame内部绘制GUI组件的同时绘制图像(任何文件类型,最简单).

不必调整它们的大小,只需按原样绘制它们,在我选择的x和y位置.每次更新时都会绘制几张图像,一些图像将被隐藏,另一些图像将被显示.更新只会每5秒左右发生一次,因此速度快并不是真正的问题.

如果可以将事件附加到被点击的图像上,那将是很好的,但不是必需的.

这是一个非常简单的任务,我还没有得到一个简单的答案.

我该怎么做呢?

谢谢

package Pokertable;
Run Code Online (Sandbox Code Playgroud)

/**要更改此模板,请选择"工具"| 模板*并在编辑器中打开模板.*/

/**ClientWindow.java**创建于2009年9月12日,下午9:10:48*/

/****@author Robert*/public class ClientWindow扩展javax.swing.JFrame {

/** Creates new form ClientWindow */
public ClientWindow() {
    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() {

    jScrollPane1 = new javax.swing.JScrollPane();
    jTextField1 = new javax.swing.JTextField();
    jScrollPane2 = new javax.swing.JScrollPane();
    jTextArea1 = new javax.swing.JTextArea();
    jCheckBox2 = new javax.swing.JCheckBox();
    imagePanel1 = new Pokertable.ImagePanel();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    setTitle("Not Logged In");
    getContentPane().setLayout(null);

    jTextField1.addKeyListener(new java.awt.event.KeyAdapter() {
        public void keyTyped(java.awt.event.KeyEvent evt) {
            jTextField1KeyTyped(evt);
        }
    });
    jScrollPane1.setViewportView(jTextField1);

    getContentPane().add(jScrollPane1);
    jScrollPane1.setBounds(0, 540, 170, 22);

    jTextArea1.setColumns(20);
    jTextArea1.setRows(5);
    jScrollPane2.setViewportView(jTextArea1);

    getContentPane().add(jScrollPane2);
    jScrollPane2.setBounds(0, 440, 166, 96);

    jCheckBox2.setText("Sit Out Next Hand");
    jCheckBox2.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jCheckBox2ActionPerformed(evt);
        }
    });
    getContentPane().add(jCheckBox2);
    jCheckBox2.setBounds(0, 410, 113, 23);
    getContentPane().add(imagePanel1);
    imagePanel1.setBounds(130, 130, 100, 100);

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

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

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


/**
* @param args the command line arguments
*/
public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new ClientWindow().setVisible(true);
        }
    });
}

// Variables declaration - do not modify
private Pokertable.ImagePanel imagePanel1;
private javax.swing.JCheckBox jCheckBox2;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JTextArea jTextArea1;
private javax.swing.JTextField jTextField1;
// End of variables declaration
Run Code Online (Sandbox Code Playgroud)

}

Boz*_*zho 5

创建自定义组件,并将其添加到NetBeans托盘中:

public class ImagePanel extends JPanel {

  private Image img;

  public void setImage(String img) {
    setImage(new ImageIcon(img).getImage());
  }

  public void setImage(Image img) {
    int width = this.getWidth();
    int height = (int) (((double) img.getHeight(null) / img.getWidth(null)) * width);
    this.img = img.getScaledInstance(width, height, Image.SCALE_SMOOTH);
  }

  @Override
  public void paintComponent(Graphics g) {
    g.drawImage(img, 0, 0, this);
  }
}
Run Code Online (Sandbox Code Playgroud)

我已经包含了一些简单的缩放,你可以删除它,如果你愿意.

现在解释一下:

  • 扩展JPanel使组件符合JavaBean规范.如果您希望能够img通过NetBeans属性编辑器设置属性,则应该定义一个simpel getter;
  • 否则你可以手动调用setImage()和调用repaint(),这将使图像绘制
  • paintComponent组件的每个重绘上调用重写的方法,在那里,您可以看到,您在current JPanel(ImagePanel)的边界中绘制图像