Прежде всего, я знаю, что название немного двусмысленное, поэтому я попытаюсь объяснить проблемы, которые у меня возникли более четко.
Я создал программу, которая импортирует данные из csv.files, которые состоят из точек измерения, таких как дата, время, частота сердечных сокращений и т. Д. Пользователь сначала встречает экран входа в систему, который подключается к базе данных,который затем позволяет пользователю получить доступ к мэйнфрейму программы.
Программа состоит из класса Activity, у которого есть метод, который читает действие, наряду с некоторыми другими методами. Затем этому классу импонирует другой класс, называемый Datapoint, который разбивает различные значения из csv.files на точки измерения, такие как дата, время, долгота и широта.
Наконец, третий класс, который состоит только из данных,называется Статистика, которая берет значения и добавляет их в точки данных, такие как средняя, минимальная и максимальная скорость и т. д.
Теперь к моей проблеме. Для этого я создал графический интерфейс, который позволяет пользователю импортировать csv.files, а затем добавить точки данных из файла на карту, диаграмму и страницу, на которой отображаются значения из класса статистики. Это отлично работает, и все обновляется при импорте.
Выбранные действия затем добавляются в JList, из которого пользователь может выбрать определенную активность, которая предпочтительно является слушателем мыши. При двойном щелчке по активности в списке графики должны обновляться в соответствии с выбранными точками данных из списка, но я не знаю, как это сделать. Другая проблема заключается в том, что импортированное действие записывается поверх старого, поэтому JList содержит дубликат импортированных действий.
Вместо того, чтобы просто показывать графический интерфейс, я решил предоставить вам всю информациюЧто касается классов, которые обрабатываются в графическом интерфейсе, то вам будет проще точно определить, как я должен решить мою проблему. Я выложу классы ниже.
Активность:
package model;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Activity {
private String file;
private String title;
private String location;
private String note;
private String activityType;
private String category;
private List<DataPoint> dataPoints = new ArrayList<DataPoint>();
private String line = "";
//private String[] dataPoints;
public Activity (){
//csvFileReader("activity_103378385.csv");
}
public void csvFileReader(String file) {
try {
this.file = file;
BufferedReader in = new BufferedReader(new FileReader(file));
line = in.readLine(); // läser bort första raden av aktiviteten
while ((line = in.readLine()) != null) {
line = line.replaceAll(",", ".");
String[] data = line.split(";");
dataPoints.add(new DataPoint(data));
}
in.close();
/* for (DataPoint act : dataPoints)
System.out.println(act); */
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
public List<DataPoint> getData() {
return dataPoints;
}
public void clear() {
dataPoints.clear();
}
public String getTitle() {
return title;
}
public String getLocation() {
return location;
}
public String getNote() {
return note;
}
public String getActivityType() {
return activityType;
}
public String getCategory() {
return category;
}
@Override
public String toString(){
return file.substring(file.lastIndexOf("\\")+1, file.length()-4);
}
}
И графический интерфейс (где я сталкиваюсь с трудностями):
package view;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Vector;
import javax.swing.*;
import dao.UserDAO;
import db.DemoDB;
import model.Activity;
import model.DataPoint;
import model.Statistics;
public class LoginGUI extends JFrame{
DemoDB DemoDBSingleton = null;
JScrollPane scrollpane;
private JTabbedPane tabbedPane = new JTabbedPane();
UserDAO userDao = new UserDAO();
JFrame mainFrame = new JFrame("Välkommen till din app");
JFrame f = new JFrame("User Login");
JLabel l = new JLabel("Användarnamn:");
JLabel l1 = new JLabel("Lösenord:");
JTextField textfieldUsername = new JTextField(10);
JPasswordField textfieldPassword = new JPasswordField(10);
JButton loginButton = new JButton("Logga In");
JFileChooser fc = new JFileChooser();
JMenuBar mb = new JMenuBar();
JFrame jf;
JMenu menu;
JMenuItem importMenu, exitMenu;
JList<Activity> listAct = new JList<Activity>();
List<Activity> activityList = new ArrayList<Activity>();
//MyController controller = new MyController();
Activity activity = new Activity();
List<DataPoint> listOfDataPoints = activity.getData();
Statistics stats = new Statistics(listOfDataPoints);
public LoginGUI() throws IOException {
loginButton.addActionListener(n -> {
try {
ListenerLogIn();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
});
DemoDBSingleton = DemoDB.getInstance();
// logInframe();
}
private JFrame ProgramMainFrame() throws IOException {
mainFrame.setSize(800, 600);
mainFrame.setVisible(true);
mainFrame.setJMenuBar(mb);
mainFrame.getContentPane().setLayout(new BorderLayout());
mainFrame.getContentPane().add(tabbedPane, BorderLayout.CENTER);
JMenuBar mb = new JMenuBar();
menu = new JMenu("Meny");
importMenu = new JMenuItem("Importera aktivitet");
importMenu.addActionListener(importActionListener);
exitMenu = new JMenuItem("Avsluta program");
exitMenu.addActionListener(exitActionListener);
menu.add(importMenu);
menu.add(exitMenu);
mb.add(menu);
mainFrame.setJMenuBar(mb);
return mainFrame;
/*
* JPanel listholder = new JPanel();
* listholder.setBorder(BorderFactory.createTitledBorder("ListPanel"));
* mainFrame.add(listholder); listholder.setVisible(true);
* listholder.setSize(500,400);
*/
}
private JPanel createViewActPanel() {
JPanel analogM = new JPanel(new BorderLayout());
analogM.setBackground(new Color(224, 255, 255));
scrollpane = new JScrollPane(listAct);
scrollpane.setPreferredSize(new Dimension(400, 200));
analogM.add(scrollpane, BorderLayout.WEST);
return analogM;
}
private JPanel createViewDiagramPanel() {
JPanel panel = new JPanel(new GridLayout(4, 1));
if( activity.getData().size() > 0) {
panel.add(new PlotView("HR", activity, tp -> tp.getHeartRate()));
panel.add(new PlotView("Altitude", activity, tp -> tp.getAltitude()));
panel.add(new PlotView("Speed", activity, tp -> tp.getSpeed()));
panel.add(new PlotView("Cadence", activity, tp -> tp.getCadence()));
panel.setVisible(true);
}
return panel;
}
private JPanel createViewStatisticsPanel() {
stats.calculateStatistics();
JPanel statPanel = new JPanel(new GridLayout(2, 3));
statPanel.setPreferredSize(new Dimension(1000, 500));
// statPanel.setBorder(BorderFactory.createEmptyBorder(2,2,2,2));
JPanel timePanel = new JPanel();
timePanel.setBorder(BorderFactory.createTitledBorder("Tid/Distans"));
timePanel.setBackground(new Color(224, 255, 255));
JTextArea tdp = new JTextArea("\n Starttid: " + stats.getStartTime() + "\n Slutlig tid: " + stats.getEndTime()
+ "\n Total tid: " + stats.getTotalTime() + "\n Total distans" + stats.getTotalDistance());
tdp.setBackground(new Color(224, 255, 255));
timePanel.add(tdp);
statPanel.add(timePanel);
JPanel startTimepanel = new JPanel();
startTimepanel.setBorder(BorderFactory.createTitledBorder("Altitud"));
startTimepanel.setBackground(new Color(224, 255, 255));
JTextArea stp = new JTextArea("\n Lägsta altitud: " + stats.getMinAltitude() + "\n Högsta altitud : "
+ stats.getMaxAltitude() + "\n Genomsnittlig altitud: " + stats.getAvgAltitude());
stp.setBackground(new Color(224, 255, 255));
startTimepanel.add(stp);
statPanel.add(startTimepanel);
JPanel startTimepanel1 = new JPanel();
startTimepanel1.setBorder(BorderFactory.createTitledBorder("Hastighet"));
startTimepanel1.setBackground(new Color(224, 255, 255));
JTextArea stp1 = new JTextArea("\n Lägsta hastighet: " + stats.getMinSpeed() + "\n Högsta hastighet : "
+ stats.getMaxSpeed() + "\n Genomsnittlig hastighet: " + stats.getAvgSpeed());
stp1.setBackground(new Color(224, 255, 255));
startTimepanel1.add(stp1);
statPanel.add(startTimepanel1);
JPanel startTimepanel2 = new JPanel();
startTimepanel2.setBorder(BorderFactory.createTitledBorder("Puls"));
startTimepanel2.setBackground(new Color(224, 255, 255));
JTextArea stp2 = new JTextArea("\n Lägsta puls: " + stats.getMinHeartrate() + "\n Högsta puls : "
+ stats.getMaxHeartrate() + "\n Genomsnittlig puls: " + stats.getAvgHeartrate());
stp2.setBackground(new Color(224, 255, 255));
startTimepanel2.add(stp2);
statPanel.add(startTimepanel2);
JPanel startTimepanel3 = new JPanel();
startTimepanel3.setBorder(BorderFactory.createTitledBorder("Kadens"));
startTimepanel3.setBackground(new Color(224, 255, 255));
JTextArea stp3 = new JTextArea("\n Lägsta kadens: " + stats.getMinCandence() + "\n Högsta kadens : "
+ stats.getMaxCandence() + "\n Genomsnittlig kadens: " + stats.getAvgCandence());
stp3.setBackground(new Color(224, 255, 255));
startTimepanel3.add(stp3);
statPanel.add(startTimepanel3);
JPanel startTimepanel4 = new JPanel();
startTimepanel4.setBorder(BorderFactory.createTitledBorder("Lutning"));
startTimepanel4.setBackground(new Color(224, 255, 255));
JTextArea stp4 = new JTextArea("\n Lägsta lutning: " + stats.getMinTilt() + "\n Högsta lutning : "
+ stats.getMaxTilt() + "\n Genomsnittlig lutning: " + stats.getAvgTilt());
stp4.setBackground(new Color(224, 255, 255));
startTimepanel4.add(stp4);
statPanel.add(startTimepanel4);
return statPanel;
}
private JPanel createViewMapPanel() {
JPanel mapPane = new JPanel();
if(listOfDataPoints.size() > 0) {
mapPane.add(new PlotMap(listOfDataPoints));
}
mapPane.setBackground(new Color(224, 255, 255));
mapPane.setVisible(true);
return mapPane;
}
ActionListener importActionListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int returnValue = fc.showOpenDialog(mainFrame);
if(returnValue == JFileChooser.APPROVE_OPTION)
{
File file = fc.getSelectedFile();
if(file != null)
{
activity.clear();
String fileName = file.getAbsolutePath();
activity.csvFileReader(fileName);
listOfDataPoints = activity.getData();
activityList.add(activity);
listAct.setListData(new Vector<Activity>(activityList));
tabbedPane.removeAll();
tabbedPane.add("Dina Aktiviteter", createViewActPanel());
tabbedPane.add("Diagram för vald aktivitet", createViewDiagramPanel());
tabbedPane.add("Statistik för vald aktivitet", createViewStatisticsPanel());
tabbedPane.add("Kartbild över vald aktivitet", createViewMapPanel());
mainFrame.getContentPane().add(tabbedPane, BorderLayout.CENTER);
}
}
}
};
ActionListener exitActionListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
};
public static void main(String[] args) throws IOException {
new LoginGUI();
}
}