java - 简单的Java显示图像

标签 java image graphics

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

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

如果可以将事件附加到被单击的图像上,那就太好了,但不是必需的。

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

我该如何去做呢?

谢谢

package Pokertable;

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

/* * 客户端窗口.java * * 创建于 2009 年 9 月 12 日晚上 9:10:48 */

/** * * @作者罗伯特 */ 公共(public)类 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

}

最佳答案

创建自定义组件,并将其添加到 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)

关于java - 简单的Java显示图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1962910/

相关文章:

java - 如何模拟在仅使用mockito而不是powermockito测试的方法中创建的对象?

css - 图像适合窗口

Java 图形库,具有捕获绘制对象上的鼠标事件的方法

xcode - 在 swift 中使用解析填充图像数组

Java 图形多个类

python - 无法在 Python 上导入 nodebox.graphics

java - Apache 耶拿 : SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder"

java - SWT 组合 MouseDown 事件未正确触发

JVM 实现 JRE

java - 从一维数组构建图像