标签:jprogressbar game-development java image swing
我正在用Java制作游戏,我正在使用JProgressBar作为健康栏.我想为JProgressBar使用图像(而不是颜色),但我无法做到.我已经尝试使用paint方法,paintComponent方法,创建一个新类,但它不起作用.愿有人请帮帮我吗?
解决方法:
无需创建自己的ProgressBarUI实现,您只需创建自己的…
该示例基本上从单个部分图像中产生“魔药条”,然后基于当前进度呈现子图像.
它只需要显示整个魔药就不会花太多时间……
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.text.NumberFormat;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class ProgressPane {
public static void main(String[] args) {
new ProgressPane();
}
public ProgressPane() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new GridBagLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private float progress = 1f;
private BufferedImage potion;
private BufferedImage potionBar;
public TestPane() {
try {
potion = ImageIO.read(getClass().getResource("/Potion.png"));
} catch (IOException ex) {
ex.printStackTrace();
}
setOpaque(false);
setForeground(Color.BLUE);
setBackground(Color.GRAY);
Timer timer = new Timer(500, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
progress -= 0.01;
if (progress <= 0.001) {
((Timer) e.getSource()).stop();
}
repaint();
}
});
timer.setRepeats(true);
timer.setCoalesce(true);
timer.start();
}
@Override
public void invalidate() {
super.invalidate();
potionBar = null;
}
@Override
public Dimension getPreferredSize() {
FontMetrics fm = getFontMetrics(getFont());
return new Dimension(200, Math.max(50, fm.getHeight() + 4));
}
protected void createPotionBar() {
if (potionBar == null) {
if (getWidth() > 0 && getHeight() > 0) {
FontMetrics fm = getFontMetrics(getFont());
int height = Math.max(50, fm.getHeight() + 4);
potionBar = new BufferedImage(getWidth() - 4, height, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = potionBar.createGraphics();
int x = 0;
int y = (height - potion.getHeight()) / 2;
while (x < getWidth() - 4) {
g2d.drawImage(potion, x, y, this);
x += potion.getWidth();
}
g2d.dispose();
}
}
}
@Override
protected void paintComponent(Graphics g) {
createPotionBar();
super.paintComponent(g);
int width = getWidth() - 4;
int height = getHeight() - 4;
int x = 2;
int y = 2;
g.setColor(getBackground());
g.fillRect(x, y, width, height);
g.setColor(Color.BLACK);
g.drawRect(x, y, width, height);
int progressWidth = (int) (width * progress);
BufferedImage progressImage = potionBar.getSubimage(0, 0, progressWidth, potionBar.getHeight());
g.drawImage(progressImage, x, y, this);
FontMetrics fm = g.getFontMetrics();
String value = NumberFormat.getPercentInstance().format(progress);
x = x + ((width - fm.stringWidth(value)) / 2);
y = y + ((height - fm.getHeight()) / 2);
g.setColor(Color.WHITE);
g.drawString(value, x, y + fm.getAscent());
}
}
}
标签:jprogressbar,game-development,java,image,swing 来源: https://codeday.me/bug/20190825/1723416.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。