让一张快乐的脸出现在 Java
Getting a happy face to show up in Java
我在 Java GUI 中显示图像文件 src/happyFace.gif 时遇到问题。目标是显示一张笑脸图像,它似乎以一定角度滑过程序 window,从 window 边缘弹回。
我认为我的问题出在 src/ReboundPanel.java 中的图像变量(ImageIcon 类型),因为 ImageIcon class 可能与未来的 swing 版本不兼容(根据Oracle 的文档:https://docs.oracle.com/javase/7/docs/api/javax/swing/ImageIcon.html)。如果这是真的,我认为 ImageIcon class 可能无法得到 swing 库的支持。我不知道如何检查我的 swing 库。
src/happyFace.gif
我的输出Window
src/Rebound.java:
//********************************************************************
// Rebound.java Java Foundations
//********************************************************************
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Rebound{
//-----------------------------------------------------------------
// Displays the main frame of the program.
//-----------------------------------------------------------------
public static void main (String[] args){
JFrame frame = new JFrame ("Rebound");
frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new ReboundPanel());
frame.pack();
frame.setVisible(true);
}
}
src/ReboundPanel.java:
//********************************************************************
// ReboundPanel.java Java Foundations
//
// Represents the primary panel for the Rebound program.
//********************************************************************
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ReboundPanel extends JPanel{
private final int WIDTH = 300, HEIGHT = 100;
private final int DELAY = 20, IMAGE_SIZE = 35;
private ImageIcon image;
private Timer timer;
private int x, y, moveX, moveY;
//-----------------------------------------------------------------
// Sets up the panel, including the timer for the animation.
//-----------------------------------------------------------------
public ReboundPanel(){
timer = new Timer(DELAY, new ReboundListener());
image = new ImageIcon ("happyFace.gif");
x = 0;
y = 40;
moveX = moveY = 3;
setPreferredSize (new Dimension(WIDTH, HEIGHT));
setBackground (Color.black);
timer.start();
}
//-----------------------------------------------------------------
// Draws the image in the current location.
//-----------------------------------------------------------------
public void paintComponent (Graphics page){
super.paintComponent (page);
image.paintIcon (this, page, x, y);
}
//*****************************************************************
// Represents the action listener for the timer.
//*****************************************************************
private class ReboundListener implements ActionListener{
//-----------------------------------------------------------------
// Updates the position of the image and possibly the direction
// of movement whenever the timer fires an action event.
//-----------------------------------------------------------------
public void actionPerformed (ActionEvent event){
x += moveX;
y += moveY;
if (x <= 0 || x >= WIDTH-IMAGE_SIZE)
moveX = moveX * -1;
if (y <= 0 || y >= HEIGHT-IMAGE_SIZE)
moveY = moveY * -1;
repaint();
}
}
}
在ReboundPanel
class,
改变image = new ImageIcon("happyFace.gif");
到image = new ImageIcon("src/happyFace.gif");
请注意,这种解决方案只能用于测试目的。如 Andrew Thompson's comment, the correct way to store and load the image is using an embedded resource.
所述
我在 Java GUI 中显示图像文件 src/happyFace.gif 时遇到问题。目标是显示一张笑脸图像,它似乎以一定角度滑过程序 window,从 window 边缘弹回。
我认为我的问题出在 src/ReboundPanel.java 中的图像变量(ImageIcon 类型),因为 ImageIcon class 可能与未来的 swing 版本不兼容(根据Oracle 的文档:https://docs.oracle.com/javase/7/docs/api/javax/swing/ImageIcon.html)。如果这是真的,我认为 ImageIcon class 可能无法得到 swing 库的支持。我不知道如何检查我的 swing 库。
src/happyFace.gif
我的输出Window
src/Rebound.java:
//********************************************************************
// Rebound.java Java Foundations
//********************************************************************
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Rebound{
//-----------------------------------------------------------------
// Displays the main frame of the program.
//-----------------------------------------------------------------
public static void main (String[] args){
JFrame frame = new JFrame ("Rebound");
frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new ReboundPanel());
frame.pack();
frame.setVisible(true);
}
}
src/ReboundPanel.java:
//********************************************************************
// ReboundPanel.java Java Foundations
//
// Represents the primary panel for the Rebound program.
//********************************************************************
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ReboundPanel extends JPanel{
private final int WIDTH = 300, HEIGHT = 100;
private final int DELAY = 20, IMAGE_SIZE = 35;
private ImageIcon image;
private Timer timer;
private int x, y, moveX, moveY;
//-----------------------------------------------------------------
// Sets up the panel, including the timer for the animation.
//-----------------------------------------------------------------
public ReboundPanel(){
timer = new Timer(DELAY, new ReboundListener());
image = new ImageIcon ("happyFace.gif");
x = 0;
y = 40;
moveX = moveY = 3;
setPreferredSize (new Dimension(WIDTH, HEIGHT));
setBackground (Color.black);
timer.start();
}
//-----------------------------------------------------------------
// Draws the image in the current location.
//-----------------------------------------------------------------
public void paintComponent (Graphics page){
super.paintComponent (page);
image.paintIcon (this, page, x, y);
}
//*****************************************************************
// Represents the action listener for the timer.
//*****************************************************************
private class ReboundListener implements ActionListener{
//-----------------------------------------------------------------
// Updates the position of the image and possibly the direction
// of movement whenever the timer fires an action event.
//-----------------------------------------------------------------
public void actionPerformed (ActionEvent event){
x += moveX;
y += moveY;
if (x <= 0 || x >= WIDTH-IMAGE_SIZE)
moveX = moveX * -1;
if (y <= 0 || y >= HEIGHT-IMAGE_SIZE)
moveY = moveY * -1;
repaint();
}
}
}
在ReboundPanel
class,
改变image = new ImageIcon("happyFace.gif");
到image = new ImageIcon("src/happyFace.gif");
请注意,这种解决方案只能用于测试目的。如 Andrew Thompson's comment, the correct way to store and load the image is using an embedded resource.
所述