У вас есть несколько вопиющих проблем с этим кодом:
- Запуск таймера в методе рисования, метод, который часто вызывается много раз, большинство из которых вы не можете контролировать
- Вызов, который выглядит как потенциально блокирующий код в методе рисования (и в потоке событий Swing).Это может сделать ваш код совершенно бесполезным, поскольку это может потенциально заморозить графический интерфейс
Предложения:
- Создайте таймер и запустите его один раз , а не внутрилюбой метод покраски.Возможно, сделайте это в конструкторе класса
- Таймер должен изменить поля класса и вызвать перерисовку
- Ваш метод рисования должен затем использовать состояние этих полей, чтобы решить, что рисовать и где
- Не забудьте вызвать
super.paintComponent(g);
в вашем переопределении, обычно в первой строке. - Если создание Jedis означает создание продолжительного кода, сделайте это в фоновом потоке, напримеркак SwingWorker
- Метод рисования предназначен только для рисования и рисования, и ваш код должен это учитывать.
Например, ознакомьтесь с кодом ниже.Обратите внимание, что у меня нет доступа к вашему классу Jedis (и почему вы его не используете), поэтому я создал «фиктивный» класс.Кроме того, у меня нет доступа к вашему изображению, поэтому я использовал общедоступное изображение для этой демонстрационной программы.Я также ускорил ваш таймер.
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
// import redis.clients.jedis.Jedis;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
public class Station1 {
private static final String IMG_PATH = "https://upload.wikimedia.org/wikipedia/"
+ "commons/thumb/f/f4/LINCOLN%2C_Abraham-President_%28BEP_engraved_portrait%29.jpg"
+ "/800px-LINCOLN%2C_Abraham-President_%28BEP_engraved_portrait%29.jpg";
public Station1() {
Gradient gradient = new Gradient();
JFrame f = new JFrame("Input Carousel");
f.setLayout(new BorderLayout());
JLabel label = new JLabel();
// ImageIcon icon = new ImageIcon(getClass().getResource("images/input carousel.jpg"));
BufferedImage img = null;
try {
URL imgUrl = new URL(IMG_PATH);
img = ImageIO.read(imgUrl);
} catch (IOException e) {
e.printStackTrace();
}
Icon icon = new ImageIcon(img);
label.setIcon(icon);
gradient.add(label);
f.add(gradient);
f.pack();
f.setResizable(false);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
public static void main(String args[]) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new Station1();
}
});
}
@SuppressWarnings("serial")
class Gradient extends JPanel {
private JedisMock jedisMock = new JedisMock("localhost");
private String jedisValue = "";
public Gradient() {
int timerDelay = 200;
new Timer(timerDelay, new TimerListener()).start();
}
private class TimerListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
// may need to wrap this within a try/catch
jedisValue = jedisMock.get("b1");
repaint();
}
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2D = (Graphics2D) g;
AlphaComposite alphaComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
0.5f);
g2D.setComposite(alphaComposite);
if (jedisValue.equals("1")) {
g2D.setColor(Color.GREEN);
g2D.fillRect(208, 172, 47, 75);
} else if (jedisValue.equals("e")) {
g2D.setColor(Color.RED);
g2D.fillRect(208, 172, 47, 75);
}
}
}
}
public class JedisMock {
private String host;
public JedisMock(String host) {
this.host = host;
}
public String getHost() {
return host;
}
// method to mock your method
public String get(String text) {
double randomValue = Math.random();
if (randomValue < 0.333) {
return "1";
} else if (randomValue < 0.667) {
return "e";
} else {
return "";
}
}
}