У меня была идея построить что-то вроде системы квитанций, которая показывает сумму расходов, сделанных в любое время, и график того, как расходы менялись с течением времени. Данные сохраняются в базе данных MySQL.
Моя проблема касается части графика. Я построил один (который имеет метки для отображения значений в этой указанной c точке) и думал добавить опцию наведения, которая работает следующим образом:
когда пользователь наводит курсор на значение, время ввода отображается как другая метка (у меня есть тип DATETIME этого столбца в MySQL, поэтому он всегда дает правильное время).
Я прочитал несколько статей об использовании MouseListener
, MouseEvent
и т.д. c и реализовал их, но ни одна из них не дала результата (новый ярлык просто не появился на экране).
Вот мой вывод, не берите в голову последнее значение, появляющееся в конце: я все еще пытаюсь обойти это самостоятельно:
И вот мой код:
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
детали, так как было так много реализаций, я не знал, что вставлять.
Вопрос в том, есть ли у кого-нибудь подсказка или фрагмент кода для решения этой проблемы?