gpt4 book ai didi

java - JLabel 中的刷新图像不起作用

转载 作者:行者123 更新时间:2023-11-30 06:20:45 24 4
gpt4 key购买 nike

您好,我在刷新添加到 JLabel 的图像时遇到问题。它类似于控制灯,为我们提供有关在线/离线状态的信息。当我们启动应用程序并且服务器打开时,它将调用此方法并将灯变为绿色。我们当然可以点击“下线”按钮,让它一直下线。然后灯是红色的。现在一切正常,但是当我们点击“上线”时,程序上线了,但图像仍然是红色的。在每个地方,它都用相同的方法调用。只是这个灯不亮,因为连接和断开连接都正常。

我给你一些代码:

只改变图片的方法:

 public void changeLight(String name){
BufferedImage imgtmp;
try {
System.out.println("CHANGE LIGHT: "+name);
imgtmp = ImageIO.read(new File(name));
panelMenuOnline.remove(panelMenuOnlineLight);
panelMenuOnlineLight = new JLabel(new ImageIcon(imgtmp));
panelMenuOnline.add(panelMenuOnlineLight);
} catch (IOException e) {
e.printStackTrace();
}
}

同一类中的按钮定义:

panelMenuButOn = new Guzik("GO ONLINE"){
@Override
public void actionPerformed(ActionEvent e) {
if(!Pang.game.online){
Pang.game.haveToBeOffline = false;
if(Client.checkConnection()) {
JOptionPane.showMessageDialog(this,
"Successfully connected");
Pang.game.online=true;
changeLight(imgGREEN);

} else {
JOptionPane.showMessageDialog(this,
"Connection refused");
}
} else {
JOptionPane.showMessageDialog(this,
"Successfully disconnected");
setText("GO ONLINE");
Pang.game.haveToBeOffline = true;
Pang.game.online=false;
changeLight(imgRED);

}
}
};

我也有线程(如果我不让他离线)测试连接和改变控制灯:

public void run() {
while(true){
Pang.game.online=Client.checkConnection();
if(Pang.game.online){
Pang.game.frame.panelMenuButOn.setText("GO OFFLINE");
Pang.game.frame.changeLight(Pang.game.frame.imgGREEN);
} else {
Pang.game.frame.panelMenuButOn.setText("GO ONLINE");
Pang.game.frame.changeLight(Pang.game.frame.imgRED);
}
//System.out.println("Checked = "+Pang.game.online);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}

}
}

最佳答案

您不仅要更改 JLabel 显示的图标,而且要完全更改 JLabel,我建议您不要这样做。相反,...

  • 读入您的图像并在程序创建时创建您的 ImageIcons,而不是每次您需要改变灯光时。
  • 只使用一个 JLabel 来保存图标。
  • 当你想改变灯光时,调用一个不需要字符串的方法。如果光仅处于两种状态,则 boolean 值可能会很好。然后换出一个 JLabel 中的 ImageIcons。不要在不需要时交换 JLabels 中间程序。
  • 像这样的代码行:Pang.game.frame.panelMenuButOn.setText("GO OFFLINE");,表明您正在使用静态字段和方法。如果是这样,您将需要重新配置您的程序,使其不执行此操作,以便它对大多数所有内容都使用实例方法和字段。
  • 我同意 Ross Drew 的观点——您的所有 Swing 调用都应该仅在 Swing 事件调度线程(或 EDT)上进行。 1+ 他的回答。

例如,

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.EnumMap;

import javax.imageio.ImageIO;
import javax.swing.*;

@SuppressWarnings("serial")
public class StopLightApp extends JPanel {
private static final String IMG_PATH = "http://urbannight.files.wordpress.com/2012/09/"
+ "red-orange-green-traffic-lights.jpg?w=300&h=240";
private static final int PAD = 13;
private JLabel stopLightLabel = new JLabel();
private EnumMap<LightColor, Icon> lightIconMap = new EnumMap<LightColor, Icon>(
LightColor.class);
private LightColor lightColor = LightColor.RED;

public StopLightApp() throws IOException {
URL stopLightImgUrl = new URL(IMG_PATH);
BufferedImage stopLightImg = ImageIO.read(stopLightImgUrl);
for (int i = 0; i < LightColor.values().length; i++) {
BufferedImage smlLightImg = specializedForThisImageGetSubImage(
stopLightImg, i);
Icon smlIcon = new ImageIcon(smlLightImg);
lightIconMap.put(LightColor.values()[i], smlIcon);
}
add(stopLightLabel);
stopLightLabel.setIcon(lightIconMap.get(lightColor));
stopLightLabel.setText(lightColor.getName());
stopLightLabel.setHorizontalTextPosition(SwingConstants.CENTER);
stopLightLabel.setVerticalTextPosition(SwingConstants.BOTTOM);
setBackground(Color.white);
setBorder(BorderFactory.createEmptyBorder(10, 60, 10, 60));
}

private BufferedImage specializedForThisImageGetSubImage(
BufferedImage stopLightImg, int i) {
int x = PAD + (i * (stopLightImg.getWidth() - 2 * PAD)) / 3;
int y = PAD;
int w = (stopLightImg.getWidth() - 2 * PAD) / 3;
int h = stopLightImg.getHeight() - 2 * PAD;
BufferedImage smlLightImg = stopLightImg.getSubimage(x, y, w, h);
return smlLightImg;
}

public void setLightColor(LightColor lightColor) {
this.lightColor = lightColor;
stopLightLabel.setIcon(lightIconMap.get(lightColor));
stopLightLabel.setText(lightColor.getName());
}

private static void createAndShowGui() {
try {
final StopLightApp stopLight = new StopLightApp();
JFrame frame = new JFrame("Stop Light App");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(stopLight);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
int delay = 1000;
new Timer(delay, new ActionListener() {
int index = 0;

@Override
public void actionPerformed(ActionEvent e) {
index++;
index %= LightColor.values().length;
stopLight.setLightColor(LightColor.values()[index]);
}
}).start();
} catch (IOException e) {
e.printStackTrace();
}
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}

enum LightColor {
RED("Red"), YELLOW("Yellow"), GREEN("Green");
private String name;

private LightColor(String name) {
this.name = name;
}

public String getName() {
return name;
}
}

它创造了一个可以改变的光:

red light yellow light green light

关于java - JLabel 中的刷新图像不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21343384/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com