我正在尝试创建一个与多个图像共存的 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/