mouseEntered не отображается для JLabel - PullRequest
0 голосов
/ 18 марта 2020

У меня была идея построить что-то вроде системы квитанций, которая показывает сумму расходов, сделанных в любое время, и график того, как расходы менялись с течением времени. Данные сохраняются в базе данных MySQL.

Моя проблема касается части графика. Я построил один (который имеет метки для отображения значений в этой указанной c точке) и думал добавить опцию наведения, которая работает следующим образом:
когда пользователь наводит курсор на значение, время ввода отображается как другая метка (у меня есть тип DATETIME этого столбца в MySQL, поэтому он всегда дает правильное время).

Я прочитал несколько статей об использовании MouseListener, MouseEvent и т.д. c и реализовал их, но ни одна из них не дала результата (новый ярлык просто не появился на экране).

Вот мой вывод, не берите в голову последнее значение, появляющееся в конце: я все еще пытаюсь обойти это самостоятельно: enter image description here

И вот мой код:

public class ReviewBalance extends JComponent {

    private static final long serialVersionUID = 1L;

    private static JFrame frame; 

    public void paintComponent(Graphics g) {

        //these are the positions where i am placing the coord axes
        int width = this.getWidth() / 10;
        int height = this.getHeight() / 10; 

        //these are the actual lines
        Graphics2D g1 = (Graphics2D) g; 

        g1.setStroke(new BasicStroke(3, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
        g1.setColor(Color.BLACK);
        g1.drawLine(0, 9 * height, 10 * width, 9 * height);
        g1.drawLine(width, 0, width, 10 * height); 

        //and this is supposed to be the graph
        Graphics2D g2 = (Graphics2D) g; 
        g2.setStroke(new BasicStroke(3, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
        g2.setColor(new Color(235, 142, 42));

        Polygon p = new Polygon();  

        int scale = 75; //this is the factor that determines how much you see from the graph
        int i = 1; //this is the pos where the first coord is placed

        double test = 0; 

        try {
            String driver = "com.mysql.cj.jdbc.Driver";
            String url = "jdbc:mysql://127.0.0.1:3306/logindb?serverTimezone=CET";
            String username = "root"; 
            String password = ""; 
            Class.forName(driver); 

            Connection connect = DriverManager.getConnection(url, username, password);

            PreparedStatement statement1 = connect.prepareStatement("SELECT * FROM `logindb`.`receipts_helper`"); 
            ResultSet data = statement1.executeQuery();  

            while(data.next()) { 

                p.addPoint(width + scale*i, (int) (this.getHeight() / 2 - data.getDouble("sum")));

                JLabel label = new JLabel(Double.toString(data.getDouble("sum")));
                label.setFont(new Font("Calibri", Font.ITALIC, 20));
                label.setBounds(width + scale*i, (int) (this.getHeight() / 2 - data.getDouble("sum")), 90, 25);
                label.setVisible(true);
                frame.getContentPane().add(label);

                i = i + 1; 

                test = data.getDouble("sum"); //this line is here for the last-value-issue

            }

            statement1.close();
            connect.close();

        } catch(Exception e) {
            System.out.println(e);
        }

        g2.drawPolyline(p.xpoints, p.ypoints, p.npoints);

        JLabel label2 = new JLabel(Double.toString(test));
        label2.setFont(new Font("Calibri", Font.ITALIC, 20));
        label2.setBounds(width + scale*i, (int) (this.getHeight() / 2 - test), 90, 25);
        label2.setVisible(true);
        frame.getContentPane().add(label2);

    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        frame = new JFrame(); 
        frame.setSize(1000, 800);
        frame.setTitle("Review Balance");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);

        ReviewBalance reviewBalance = new ReviewBalance(); 

        frame.add(reviewBalance); 
        frame.setVisible(true);
    }
}

Я исключил эти MouseListener детали, так как было так много реализаций, я не знал, что вставлять.

Вопрос в том, есть ли у кого-нибудь подсказка или фрагмент кода для решения этой проблемы?

...