Java图像显示

标签 java user-interface image swing graphics

我正在尝试创建一个与多个图像共存的 GUI。

有一张背景图像会占用最多的空间。 在背景图像之上,其他几个图像将显示在不同的位置。 这些位置将每 5 秒左右更新一次,因此速度并不是一个重要因素。

因此,我所需要的只是能够在每次更新时按照我选择的坐标显示图像或从显示中删除图像。

我正在使用 netbeans 将它们组合在一起。

这是迄今为止我遇到的完成工作的最合理的代码,但我不知道如何将其付诸实践,也不知道它是否可以完成我所需要的。

对 JPanel 的含义进行简短的解释也会很有帮助。

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);
  }
}

这是迄今为止我拥有的主类的代码。我可以轻松添加代码来确定是否应显示给定图像以及它们需要显示在哪里,但我不知道在哪里放置什么。

public class ClientWindow extends javax.swing.JFrame {

/** Creates new form ClientWindow */
public ClientWindow() {
    initComponents();
    imagePanel1.setImage("C:\\Documents and Settings\\Robert\\Desktop\\ClientServer\\Poker Table Art\\TableAndChairs.png");
}

/** 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();
    imagePanel3 = new Pokertable.ImagePanel();
    jPanel1 = new javax.swing.JPanel();

    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);

    imagePanel1.add(imagePanel3);
    imagePanel1.add(jPanel1);

    getContentPane().add(imagePanel1);
    imagePanel1.setBounds(0, 0, 520, 370);

    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 Pokertable.ImagePanel imagePanel3;
private javax.swing.JCheckBox jCheckBox2;
private javax.swing.JPanel jPanel1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JTextArea jTextArea1;
private javax.swing.JTextField jTextField1;
// End of variables declaration

}

为简单起见,假设我希望将 TableAndChairs.png 作为稳定的背景图像,并让 Button.png 图像(周围有一个圆圈的 D)经常移动到新位置。

alt text http://img706.imageshack.us/img706/908/tableandchairs.png alt text http://img189.imageshack.us/img189/796/buttonvd.png

最佳答案

只是一个想法:使用一个附加类来保存图像和相应的坐标,并将它们放入列表中。

public class MyImage {    // or SubImage?
    private Image image;
    private int x;
    private int y;

    public MyImage(Image image, int x, int y) {
        this.image = image;
        this.x = x;
        this.y = y;
    }

    public void paint(Graphics g, ImageObserver obs) {
        g.drawImage(image, x, y, obs);
    }

    // getters and setters
} 


public class ImagePanel extends JPanel {

    private Image img;
    private final List<MyImage> images = new ArrayList<MyImage>();

    // setImage methods

    public void addMyImage(MyImage image) {
        images.add(image);
    }
    // or/and
    public void addMyImage(Image image, int x, int y) {
        images.add(new MyImage(image, x, y));
    }

    @Override
    public void paintComponent(Graphics g) {
        g.drawImage(img, 0, 0, this);    // check if img is null?
        for (MyImage image : images) {
            image.paint(g, this);
    }
}

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

相关文章:

php - 如何显示存储在 MySQL 数据库中的图像?

java - WireMock 性能和负载测试

java - 使 JavaFX 应用程序窗口外部元素在所有操作系统中保持相似

iphone - 使用自己的按钮(不是预定义的按钮)创建自己的 UI。它们是什么类型的物体?

c# - 适用于 iOS 和 .Net 的类似 UI

java - Java Graphics2D Rotate 中的图像质量遭到破坏

linux - GNU BASH 命令更改图像大小和 DPI?

java - 从应用程序类中获取主题属性

java - spring中使用的代码信息

java - 尽管出现错误,如何继续循环中的测试