нарисуйте цвет в определенной области на основе условия в jframe - PullRequest
0 голосов
/ 25 декабря 2018

Я хочу указать статус станции, пометив цвет над регионом.Класс Graphics2D используется для рисования цвета.Он должен постоянно обновляться.Я использую таймер, но он не работает.Любая помощь приветствуется.

import javax.swing.*;
import java.awt.*;
import redis.clients.jedis.Jedis;

public class Station1 {

    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"));
        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();
            }
        });   
    }

    class Gradient extends JPanel{
    public Graphics2D g2D ;
    @Override
    public void paintComponent(Graphics g){

        g2D = (Graphics2D)g;
        AlphaComposite alphaComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f);
        g2D.setComposite(alphaComposite);

        new Timer(1000, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                    try{
                        Jedis jedis = new Jedis("localhost");

                        if(jedis.get("b1").equals("1"))
                        {
                          g2D.setColor(Color.GREEN); 
                          g2D.fillRect(208, 172, 47, 75);
                        }
                        else if(jedis.get("b1").equals("e"))
                        {
                          g2D.setColor(Color.RED); 
                          g2D.fillRect(208, 172, 47, 75);
                        }

                        }
                        catch(Exception e)
                        {
                        }  
            }
        }).start();

     }

    }    

}

Если я запускаю код без таймера, он работает.Если я использую таймер, он не будет рисовать любой цвет.Пожалуйста, предложите мне решение этой проблемы.

1 Ответ

0 голосов
/ 25 декабря 2018

У вас есть несколько вопиющих проблем с этим кодом:

  1. Запуск таймера в методе рисования, метод, который часто вызывается много раз, большинство из которых вы не можете контролировать
  2. Вызов, который выглядит как потенциально блокирующий код в методе рисования (и в потоке событий Swing).Это может сделать ваш код совершенно бесполезным, поскольку это может потенциально заморозить графический интерфейс

Предложения:

  1. Создайте таймер и запустите его один раз , а не внутрилюбой метод покраски.Возможно, сделайте это в конструкторе класса
  2. Таймер должен изменить поля класса и вызвать перерисовку
  3. Ваш метод рисования должен затем использовать состояние этих полей, чтобы решить, что рисовать и где
  4. Не забудьте вызвать super.paintComponent(g); в вашем переопределении, обычно в первой строке.
  5. Если создание Jedis означает создание продолжительного кода, сделайте это в фоновом потоке, напримеркак SwingWorker
  6. Метод рисования предназначен только для рисования и рисования, и ваш код должен это учитывать.

Например, ознакомьтесь с кодом ниже.Обратите внимание, что у меня нет доступа к вашему классу 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 "";
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...