简单Java显示图像

简单Java显示图像,java,image,graphics,Java,Image,Graphics,我有一个使用netbeans编写的GUI,其中有一些简单的组件。 我希望能够在JFrame中的GUI组件旁边绘制图像(任何文件类型,任何最简单的) 不必调整它们的大小,只需在我选择的x和y位置按原样绘制它们即可。 每次更新时都会绘制多个图像,其中一些图像将被隐藏,另一些图像将被显示。更新只会每5秒左右发生一次,所以速度不是问题 如果可以将事件附加到正在单击的图像上,那将很好,但不是必需的 这是一项极其简单的任务,我至今无法得到一个简单的答案 我该怎么做呢 谢谢 package Pokertabl

我有一个使用netbeans编写的GUI,其中有一些简单的组件。 我希望能够在JFrame中的GUI组件旁边绘制图像(任何文件类型,任何最简单的)

不必调整它们的大小,只需在我选择的x和y位置按原样绘制它们即可。 每次更新时都会绘制多个图像,其中一些图像将被隐藏,另一些图像将被显示。更新只会每5秒左右发生一次,所以速度不是问题

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

这是一项极其简单的任务,我至今无法得到一个简单的答案

我该怎么做呢

谢谢

package Pokertable;
/* *要更改此模板,请选择工具|模板 *然后在编辑器中打开模板。 */

/* *ClientWindow.java * *创建于2009年9月12日晚上9:10:48 */

/** * *@作者罗伯特 */ 公共类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
/**创建新表单ClientWindow*/
公共客户端窗口(){
初始化组件();
}
/**此方法从构造函数中调用,以
*初始化表单。
*警告:请勿修改此代码。此方法的内容为
*始终由表单编辑器重新生成。
*/
@抑制警告(“未选中”)
// 
私有组件(){
jScrollPane1=newjavax.swing.JScrollPane();
jTextField1=newjavax.swing.JTextField();
jScrollPane2=newjavax.swing.JScrollPane();
jTextArea1=newjavax.swing.JTextArea();
JCheckBox=newjavax.swing.JCheckBox();
imagePanel1=新的Pokertable.ImagePanel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle(“未登录”);
getContentPane().setLayout(null);
jTextField1.addKeyListener(新java.awt.event.KeyAdapter(){
public void keyTyped(java.awt.event.KeyEvent evt){
JTextField1KeyType(evt);
}
});
jScrollPane1.setViewportView(jTextField1);
getContentPane().add(jScrollPane1);
jScrollPane1.setBounds(0540170,22);
jTextArea1.设置列(20);
jTextArea1.设置行(5);
jScrollPane2.setViewportView(jTextArea1);
getContentPane().add(jScrollPane2);
jScrollPane2.setBounds(044016696);
jCheckBox2.setText(“坐在旁边”);
jCheckBox2.addActionListener(新java.awt.event.ActionListener(){
public void actionPerformed(java.awt.event.ActionEvent evt){
jCheckBox2ActionPerformed(evt);
}
});
getContentPane().add(jCheckBox2);
jCheckBox2.setBounds(0410113,23);
getContentPane().add(imagePanel1);
图像面板1.立根(130130100100);
包装();
}// 
private void jCheckBox2ActionPerformed(java.awt.event.ActionEvent evt){
//TODO在此处添加您的处理代码:
}                                          
私有void jTextField1KeyTyped(java.awt.event.KeyEvent evt){
//TODO在此处添加您的处理代码:
}                                    
/**
*@param指定命令行参数
*/
公共静态void main(字符串参数[]){
invokeLater(new Runnable()){
公开募捐{
新建ClientWindow().setVisible(true);
}
});
}
//变量声明-不修改
private Pokertable.ImagePanel ImagePanel 1;
私有javax.swing.JCheckBox jCheckBox2;
私有javax.swing.JScrollPane-jScrollPane1;
私有javax.swing.JScrollPane-jScrollPane2;
私有javax.swing.JTextArea jTextArea1;
私有javax.swing.JTextField jTextField1;
//变量结束声明

}

创建自定义组件,并将其添加到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);
  }
}
我已经包括了一些简单的缩放,你可以删除它,如果你喜欢

现在我来解释一下:

  • 扩展JPanel使组件符合JavaBean规范。如果您希望能够通过NetBeans属性编辑器设置
    img
    属性,则应定义simpel getter
  • 否则,您可以手动调用
    setImage()
    并调用
    repaint()
    ,这将使图像绘制
  • 重写的
    paintComponent
    方法在组件的每次重新绘制时都会被调用,您可以看到,在当前
    JPanel
    的边界中绘制图像(
    ImagePanel

创建自定义组件,并将其添加到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);
  }
}
我已经包括了一些简单的缩放,你可以删除它,如果你喜欢

现在我来解释一下:

  • 扩展JPanel使组件符合JavaBean规范。如果您希望能够通过NetBeans属性编辑器设置
    img
    属性,则应定义simpel getter
  • 否则,您可以手动调用
    setImage()
    并调用
    repaint()
    ,这将使图像绘制
  • 重写的
    paintComponent
    方法在组件的每次重新绘制时都会被调用,您可以看到,在当前
    JPanel
    的边界中绘制图像(
    ImagePanel

我对netbeans没有太多经验,所以这看起来很棒,但我不确定如何利用它。如何将该类添加为自定义组件?如何/何时实例化这些对象?此外,图像本身无法知道是否应使其可见,如果是,每次更新时应在何处绘制。该信息位于另一个类中,该类将定期调用图形以更新自身,并提供有关显示内容和位置的信息。再次感谢您的帮助…这将是一个巨大的进步。我现在记不起“添加到托盘”按钮的确切位置,但寻找它,应该不难找到。然后你选择你的类并添加它。实际上,您可以将类向前拖动