Java图像显示
我正在尝试创建一个与多个图像共存的GUI 有一个背景图像将占据大部分空间。 在背景图像的顶部,其他几个图像将显示在不同的位置。 这些位置大约每5秒更新一次,所以速度不是一个很大的因素 因此,我所需要的就是能够在每次更新时在我选择的坐标处显示或删除显示的图像 我正在使用netbeans将所有内容组合在一起 这是迄今为止我为完成这项工作所遇到的最合理的代码,但我不知道如何将其付诸实践,也不知道它是否能实现我所需要的 简单地解释一下JPanel是什么也会有帮助Java图像显示,java,user-interface,image,swing,graphics,Java,User Interface,Image,Swing,Graphics,我正在尝试创建一个与多个图像共存的GUI 有一个背景图像将占据大部分空间。 在背景图像的顶部,其他几个图像将显示在不同的位置。 这些位置大约每5秒更新一次,所以速度不是一个很大的因素 因此,我所需要的就是能够在每次更新时在我选择的坐标处显示或删除显示的图像 我正在使用netbeans将所有内容组合在一起 这是迄今为止我为完成这项工作所遇到的最合理的代码,但我不知道如何将其付诸实践,也不知道它是否能实现我所需要的 简单地解释一下JPanel是什么也会有帮助 public class ImagePa
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
公共类ClientWindow扩展了javax.swing.JFrame{
/**创建新表单ClientWindow*/
公共客户端窗口(){
初始化组件();
imagePanel1.setImage(“C:\\Documents and Settings\\Robert\\Desktop\\ClientServer\\Poker Table Art\\TableAndChairs.png”);
}
/**此方法从构造函数中调用,以
*初始化表单。
*警告:请勿修改此代码。此方法的内容为
*始终由表单编辑器重新生成。
*/
@抑制警告(“未选中”)
//
私有组件(){
jScrollPane1=newjavax.swing.JScrollPane();
jTextField1=newjavax.swing.JTextField();
jScrollPane2=newjavax.swing.JScrollPane();
jTextArea1=newjavax.swing.JTextArea();
JCheckBox=newjavax.swing.JCheckBox();
imagePanel1=新的Pokertable.ImagePanel();
imagePanel3=新Pokertable.ImagePanel();
jPanel1=newjavax.swing.JPanel();
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);
imagePanel1.添加(imagePanel3);
imagePanel1.add(jPanel1);
getContentPane().add(imagePanel1);
图像面板1.立根(0,0520370);
包装();
}//
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;
private Pokertable.ImagePanel ImagePanel 3;
私有javax.swing.JCheckBox jCheckBox2;
私有javax.swing.JPanel jPanel1;
私有javax.swing.JScrollPane-jScrollPane1;
私有javax.swing.JScrollPane-jScrollPane2;
私有javax.swing.JTextArea jTextArea1;
私有javax.swing.JTextField jTextField1;
//变量结束声明
}
为简单起见,假设我希望TableAndChairs.png作为稳定的背景图像,Button.png图像(周围有一个圆圈的D)每隔一段时间移动到一个新位置
如果您的每个面板都是这些ImagePanel中的一个,并且您只是让它以另一对INT作为参数,那么您的最终绘制方法只需将n个不同的图像面板绘制到主图形对象上:
public class Example extends JApplet{
ImagePanel[] images;
//whatever code you want for the rest of your applet
public void paint(){
for(ImagePanel i : images)
images.paintComponent();
}
}
}
您可以将ImagePanel修复为:
@Override
public void paintComponent(Graphics g) {
g.drawImage(img, x, y, this);
}
使用图像面板显示背景图像 然后将面板设置为使用空布局管理器。现在,您可以将ImageIcon添加到JLabel并将JLabel添加到面板。确保您使用: label.setSize(label.getPreferredSize()) 否则标签将不会出现。默认情况下,标签将显示在位置(0,0)处,尽管您可以使用setLocation(…)方法对此进行更改 要制作动画,可以使用Swing计时器,并将其设置为每5秒启动一次。当计时器启动时,您可以通过更改图像的位置来移动图像
如果您不知道如何使用计时器,请阅读Swing教程中关于“如何使用计时器”的部分。更好的方法是扩展JComponent并重写paintComponent方法来绘制自定义桌椅组件 可以使用圆的基础动态计算每个圆。我已经做了一个简单的例子,向您展示了如何使用Java2D简单地实现这一点。可以进行很多性能调整,例如缓存、剪辑等 之所以编写此代码,是为了让您了解自己绘制它们是多么简单。这样做的原因是,您可以更好地控制正在绘制的内容及其绘制位置
我希望你学到了一两件事:x只是一个想法:使用一个额外的类来保存图像和相应的内容
public class JTableChairs extends JComponent {
private final int TABLE_DIAMETER = 300;
private final int CHAIR_DIAMETER = 50;
private final int CHAIR_TABLE_BOUND = 50;
private final int CANVAS_WIDTH = 500;
private final int NUMBER_OF_CHAIRS = 10;
private final int TABLE_X = (CANVAS_WIDTH - TABLE_DIAMETER) / 2;
private final int TABLE_Y = TABLE_X;
private final double TABLE_CENTER_X = TABLE_DIAMETER / 2.0 + TABLE_X;
private final double TABLE_CENTER_Y = TABLE_DIAMETER / 2.0 + TABLE_Y;
private final double TABLE_RADIUS = TABLE_DIAMETER / 2.0 + CHAIR_TABLE_BOUND;
public JTableChairs() {
super();
}
@Override
public void paintComponent(Graphics g) {
g.setColor(Color.WHITE);
g.fillRect(0, 0, getSize().width, getSize().height);
// Draw Table.
g.setColor(Color.BLACK);
g.fillOval(TABLE_X, TABLE_Y, TABLE_DIAMETER, TABLE_DIAMETER);
// Draw each chair using normal circle trig functions.
for (int i = 1; i <= NUMBER_OF_CHAIRS; i++) {
Rectangle r = getSeatCoordinates(i);
g.drawOval(r.x, r.y, r.width, r.height);
g.drawString(String.valueOf(i), r.x, r.y);
}
}
public Rectangle getSeatCoordinates(int seat) {
// Clamp from 0 to number of chairs to make sure it doesn't
// go over/under bounds.
seat = seat < 1 ? 1 :
(seat > NUMBER_OF_CHAIRS ? NUMBER_OF_CHAIRS : seat) - 1;
// Calculate the coordinates using trig functions.
double arcAngle = Math.toRadians(360 / NUMBER_OF_CHAIRS * seat);
int x = (int)(TABLE_CENTER_X + TABLE_RADIUS * Math.cos(arcAngle) -
CHAIR_DIAMETER / 2.0);
int y = (int)(TABLE_CENTER_Y + TABLE_RADIUS * Math.sin(arcAngle) -
CHAIR_DIAMETER / 2.0);
return new Rectangle(new Point(x, y),
new Dimension(CHAIR_DIAMETER, CHAIR_DIAMETER));
}
}
public boolean setSeat(Point coord) {
// Quick collision detection. This is bad performance since its
// checking each point.
for (int i = 1; i <= NUMBER_OF_CHAIRS; i++) {
Rectangle r = getSeatCoordinates(i);
if (r.contains(coord)) {
Graphics g = getGraphics();
g.setColor(Color.RED);
g.drawRect(r.x, r.y, r.width, r.height);
g.dispose();
return true;
}
}
return false;
}
addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
setSeat(e.getPoint());
}
});
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);
}
}