我有一个使用 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/