有什么方法可以根据输入显示和隐藏一些图像。
我正在使用“T”和“F”的字符数组,如果它是“T”那么它将显示图像,如果没有那么它将禁用。
我所做的只是使用JLabel
并将ImageIcon
设置为它。它显示和隐藏图像,但使用计时器,它只是刷新整个事情。就像有一个“T”值的图像,如果下一个定时器循环的arr [2]的“T”值如前一样,那么它应该只停留在那里而不是刷新整个事物,即它闪烁。
我的代码如下:
Timer timer = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run() {
// TODO Auto-generated method stub
frame.getContentPane().removeAll();
call();
}
};
timer.schedule(task, 0, 2000);
}
static void call() {
String S = "";
for (int i = 0; i < bool.length; i++) {
bool[i] = r.nextBoolean();
if (bool[i]) {
S = S + "T";
} else {
S = S + "F";
}
}
System.out.print(S + "\n");
char[] chars = S.toCharArray();
for (int i = 0; i < chars.length; i++) {
if ('T' == chars[i]) {
label[i] = new JLabel(img);
frame.getContentPane().add(label[i]);
} else {
label[i] = new JLabel(img1);
frame.getContentPane().add(label[i]);
}
frame.setVisible(true);
}
}
我想要的只是以特定时间间隔显示和隐藏图片的用户界面,例如在Android中,我可以setVisibility
使用TextView
。
答案 0 :(得分:2)
TimerTask
不适合此任务,因为它不遵守Swing的单线程规则(有关详细信息,请参阅Concurrency in Swing)。
相反,您应该使用javax.swing.Timer
,这将确保在事件调度线程中执行“tick”事件。
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Blinky01 {
public static void main(String[] args) {
new Blinky01();
}
public Blinky01() {
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 BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private JLabel label;
public TestPane() {
setLayout(new GridBagLayout());
label = new JLabel("0");
add(label);
Timer timer = new Timer(1000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
boolean value = (((int) Math.round(Math.random() * 1))) == 0 ? false : true;
System.out.println(value);
label.setText(value ? "1" : "0");
}
});
timer.setRepeats(true);
timer.setCoalesce(true);
timer.setInitialDelay(0);
timer.start();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
}
}