I implemented a Java application (for learning purposes) that should visualize the scheduling of some employees doing tasks for customers. I have a starting JFrame that is my main Frame with 1) buttons that open new JFrames and 2) visualizes the tasks of the current day with a Jfreechart:
The first button is to manage employees (inserting new employees or deleting employees)
The second button is to manage tasks (Assign new tasks to employees):
The next one is to search for tasks and the last one is to visualize the task of one day (a new Frame where you pick the date you want to visualize and after that open a new Frame that visualizes this day's tasks:
I have a MySQL Database where all the employee and task information are stored and fetched. Everything works fine, just some visualisation problems that I don't know how to fix. Now my problems:
After I clicked a button on the main Frame, do my work and close the frame to get to my main frame again, the button I first clicked stays clicked. But not only that, after I hover over the other buttons they also look as if they are clicked:

On my gantt chart I configured Tooltips that sometimes are shown and sometimes not. I don't understand when it shows and why this is happening.
Here are some of my classes. I assume that it has to do with the way I have implemented everything. I also don't know if it is right to do so much stuff in a button clicked event and if maybe this is causing it. I am waiting for your suggestions:
main Frame class:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.*;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import javax.swing.*;
import info.clearthought.layout.TableLayout;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.labels.CategoryItemLabelGenerator;
import org.jfree.chart.labels.IntervalCategoryItemLabelGenerator;
import org.jfree.chart.labels.ItemLabelAnchor;
import org.jfree.chart.labels.ItemLabelPosition;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.IntervalCategoryDataset;
import org.jfree.data.gantt.Task;
import org.jfree.data.gantt.TaskSeries;
import org.jfree.data.gantt.TaskSeriesCollection;
import org.jfree.ui.TextAnchor;
public class Schichtplanner extends JFrame {
private static final long serialVersionUID = 1L;
double busX[] = new double[]{SchichtplannerConstants.GUI_BORDER, 250, TableLayout.FILL};
double busY[] = new double[]{SchichtplannerConstants.GUI_BORDER, 35, SchichtplannerConstants.DISTANCE_BUTTONS, 35, SchichtplannerConstants.DISTANCE_BUTTONS, 35, SchichtplannerConstants.DISTANCE_BUTTONS, 35, TableLayout.FILL};
ArrayList<Calendar> auftragsBeginn, auftragsEnde;
ArrayList<String> auftragsAdresse, auftragsPLZ, mitarbeiterVorname, mitarbeiterNachname;
ArrayList<Integer> liegenschaftsnummer;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
//System.setProperty("https.protocols", "TLSv1");
try {
Schichtplanner frame = new Schichtplanner();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public Schichtplanner() throws ParseException {
//JFrame frame = new JFrame("Schichtplanner");
this.setTitle("Schichtplanungs-App");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setExtendedState(JFrame.MAXIMIZED_BOTH);
JPanel panelMain = new JPanel();
add(panelMain);
panelMain.setLayout(new TableLayout(new double[][]{busX, busY}));
JButton buttonMitarbeiterVerwalten = new JButton("Mitarbeiter verwalten");
panelMain.add(buttonMitarbeiterVerwalten, "1,1,1,1"); // Adds Button to content pane of frame
buttonMitarbeiterVerwalten.addActionListener( new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
MitarbeiterVerwalten mitarbeiterVerwaltenFrame = new MitarbeiterVerwalten();
}
});
JButton buttonAuftragVerwalten = new JButton("Auftrag verwalten");
panelMain.add(buttonAuftragVerwalten, "1,3,1,3"); // Adds Button to content pane of frame
buttonAuftragVerwalten.addActionListener( new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
AuftragVerwalten auftragVerwaltenFrame = new AuftragVerwalten();
}
});
JButton buttonSucheAuftrag = new JButton("Auftrag suchen");
panelMain.add(buttonSucheAuftrag, "1,5,1,5"); // Adds Button to content pane of frame
buttonSucheAuftrag.addActionListener( new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
SucheAuftrag SucheAuftragFrame = new SucheAuftrag();
}
});
JButton buttonKalenderAnsicht = new JButton("Kalenderansicht");
panelMain.add(buttonKalenderAnsicht, "1,7,1,7"); // Adds Button to content pane of frame
buttonKalenderAnsicht.addActionListener( new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
KalenderAnsicht kalenderAnsichtFrame = new KalenderAnsicht();
}
});
auftragsBeginn = new ArrayList<>();
auftragsEnde = new ArrayList<>();
auftragsAdresse = new ArrayList<>();
auftragsPLZ = new ArrayList<>();
mitarbeiterVorname = new ArrayList<>();
mitarbeiterNachname = new ArrayList<>();
liegenschaftsnummer = new ArrayList<>();
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
String dateToday = dateFormat.format(new Date());
IntervalCategoryDataset dataset = getCategoryDataset(dateToday);
// Create chart
JFreeChart chart = ChartFactory.createGanttChart(dateToday, "Mitarbeiter", "Zeitachse", dataset, false, true, false);
chart.setBackgroundPaint(Color.white);
//chart.setBorderVisible(false);
CategoryPlot plot = (CategoryPlot) chart.getPlot();
plot.setDomainGridlinePaint(Color.white);
plot.setOutlinePaint(Color.white);
plot.setBackgroundPaint(Color.white);
//plot.setOutlineVisible(false);
CategoryItemRenderer renderer = plot.getRenderer();
renderer.setBaseItemLabelGenerator( new IntervalCategoryItemLabelGenerator());
renderer.setBaseItemLabelsVisible(true);
renderer.setBaseItemLabelPaint(Color.BLACK);
renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.CENTER, TextAnchor.CENTER));
renderer.setBaseItemLabelGenerator( new CategoryItemLabelGenerator(){
@Override
public String generateRowLabel(CategoryDataset dataset, int row) {
return "Your Row Text " + row;
}
@Override
public String generateColumnLabel(CategoryDataset dataset, int column) {
return "Your Column Text " + column;
}
@Override
public String generateLabel(CategoryDataset dataset, int row, int column) {
if(row == 0 && column == 0){
return "" + getAuftragsAdresseList().get(0) + ", " + getAuftragsPLZList().get(0) + ", LiegenschaftsNr: " + getLiegenschaftsnummerList().get(0);
}else if(row == 0 && column == 1){
return "" + getAuftragsAdresseList().get(1) + ", " + getAuftragsPLZList().get(1) + ", LiegenschaftsNr: " + getLiegenschaftsnummerList().get(1);
}else if(row == 0 && column == 2){
return "" + getAuftragsAdresseList().get(2) + ", " + getAuftragsPLZList().get(2) + ", LiegenschaftsNr: " + getLiegenschaftsnummerList().get(2);
}else if(row == 0 && column == 3){
return "" + getAuftragsAdresseList().get(3) + ", " + getAuftragsPLZList().get(3) + ", LiegenschaftsNr: " + getLiegenschaftsnummerList().get(3);
}else if(row == 0 && column == 4){
return "" + getAuftragsAdresseList().get(4) + ", " + getAuftragsPLZList().get(4) + ", LiegenschaftsNr: " + getLiegenschaftsnummerList().get(4);
}else if(row == 0 && column == 5){
return "" + getAuftragsAdresseList().get(5) + ", " + getAuftragsPLZList().get(5) + ", LiegenschaftsNr: " + getLiegenschaftsnummerList().get(5);
}else if(row == 0 && column == 6){
return "" + getAuftragsAdresseList().get(6) + ", " + getAuftragsPLZList().get(6) + ", LiegenschaftsNr: " + getLiegenschaftsnummerList().get(6);
}else{
return "" + getAuftragsAdresseList().get(0);
}
}
});
renderer.setSeriesPaint(0, Color.GREEN);
ChartPanel chartPanel = new ChartPanel(chart);
panelMain.add(chartPanel, "2,2,2,8");
panelMain.validate();
setVisible(true);
panelMain.setVisible(true);
}
private IntervalCategoryDataset getCategoryDataset(String date) throws ParseException {
date = date + " 00:00:00.00000";
Timestamp timestamp = Timestamp.valueOf(date);
Timestamp timestamp2 = addDays(timestamp,1);
getDBData(timestamp, timestamp2);
TaskSeries series1 = new TaskSeries("Aufträge");
for (int i = 0; i < auftragsAdresse.size(); i++) {
series1.add(new Task(getMitarbeiterVornameList().get(i) + " " + getMitarbeiterNachnameList().get(i), getAuftragsBeginnList().get(i).getTime(), getAuftragsEndeList().get(i).getTime()));
System.out.println(getMitarbeiterVornameList().get(i) + " " + getMitarbeiterNachnameList().get(i) + " BeginnZeit: " + getAuftragsBeginnList().get(i).getTime() + " EndeZeit: " + getAuftragsEndeList().get(i).getTime());
}
TaskSeriesCollection dataset = new TaskSeriesCollection();
dataset.add(series1);
return dataset;
}
public Timestamp addDays(Timestamp date, int days) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);// w ww. j ava 2 s .co m
cal.add(Calendar.DATE, days); //minus number would decrement the days
return new Timestamp(cal.getTime().getTime());
}
public ArrayList<Calendar> getAuftragsBeginnList() {
return auftragsBeginn;
}
public ArrayList<Calendar> getAuftragsEndeList() {
return auftragsEnde;
}
public ArrayList<String> getAuftragsAdresseList() {
return auftragsAdresse;
}
public ArrayList<String> getAuftragsPLZList() {
return auftragsPLZ;
}
public ArrayList<String> getMitarbeiterVornameList() {
return mitarbeiterVorname;
}
public ArrayList<String> getMitarbeiterNachnameList() {
return mitarbeiterNachname;
}
public ArrayList<Integer> getLiegenschaftsnummerList() {
return liegenschaftsnummer;
}
public void getDBData(Timestamp timestamp, Timestamp timestamp2){
try {
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3307/schichtplanung", "root", "admin");
PreparedStatement st = (PreparedStatement) connection.prepareStatement("SELECT schichtplanung.auftrag.auftragsbeginn, schichtplanung.auftrag.auftragsende, schichtplanung.auftrag.auftragsadresse, schichtplanung.auftrag.auftragsplz, schichtplanung.auftrag.liegenschaftsnummer, schichtplanung.mitarbeiter.vorname, schichtplanung.mitarbeiter.nachname FROM schichtplanung.auftrag INNER JOIN schichtplanung.mitarbeiter ON schichtplanung.auftrag.mitarbeiterid=schichtplanung.mitarbeiter.mitarbeiterid WHERE schichtplanung.auftrag.auftragsbeginn >= ? AND schichtplanung.auftrag.auftragsbeginn < ?");
st.setTimestamp(1, timestamp);
st.setTimestamp(2, timestamp2);
ResultSet rs = st.executeQuery();
while (rs.next()) {
Calendar calendar1 = Calendar.getInstance();
calendar1.setTimeInMillis(rs.getTimestamp(1).getTime());
getAuftragsBeginnList().add(calendar1);
Calendar calendar2 = Calendar.getInstance();
calendar2.setTimeInMillis(rs.getTimestamp(2).getTime());
getAuftragsEndeList().add(calendar2);
getAuftragsAdresseList().add(rs.getString(3));
getAuftragsPLZList().add(rs.getString(4));
getLiegenschaftsnummerList().add(rs.getInt(5));
getMitarbeiterVornameList().add(rs.getString(6));
getMitarbeiterNachnameList().add(rs.getString(7));
}
rs.close();
st.close();
} catch (SQLException sqlException) {
sqlException.printStackTrace();
}
}
}
this is from the last with the jfreechart:
import com.github.lgooddatepicker.components.DatePicker;
import info.clearthought.layout.TableLayout;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.block.BlockBorder;
import org.jfree.chart.labels.*;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
import org.jfree.chart.renderer.category.StandardBarPainter;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.IntervalCategoryDataset;
import org.jfree.data.gantt.Task;
import org.jfree.data.gantt.TaskSeries;
import org.jfree.data.gantt.TaskSeriesCollection;
import org.jfree.ui.RectangleInsets;
import org.jfree.ui.TextAnchor;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.*;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.List;
import org.jfree.chart.renderer.category.StandardBarPainter;
public class AuftragsÜbersicht extends JFrame {
private ArrayList<Calendar> auftragsBeginn, auftragsEnde;
private ArrayList<String> auftragsAdresse, auftragsPLZ, mitarbeiterVorname, mitarbeiterNachname;
private ArrayList<Integer> liegenschaftsnummer;
public AuftragsÜbersicht(String date) throws ParseException {
double busX[] = new double[]{SchichtplannerConstants.GUI_BORDER, 250, TableLayout.FILL, TableLayout.FILL, SchichtplannerConstants.GUI_BORDER};
double busY[] = new double[]{SchichtplannerConstants.GUI_BORDER, 35, 40, 35, SchichtplannerConstants.DISTANCE_BUTTONS, 35, 35, SchichtplannerConstants.DISTANCE_BUTTONS, 35, 35};
auftragsBeginn = new ArrayList<>();
auftragsEnde = new ArrayList<>();
auftragsAdresse = new ArrayList<>();
auftragsPLZ = new ArrayList<>();
mitarbeiterVorname = new ArrayList<>();
mitarbeiterNachname = new ArrayList<>();
liegenschaftsnummer = new ArrayList<>();
this.setTitle("Tagesübersicht Aufträge");
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
this.setSize(screenSize.width, screenSize.height);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
try
{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
e.printStackTrace();
}
/********************************/
// Create dataset
IntervalCategoryDataset dataset = getCategoryDataset(date);
// Create chart
JFreeChart chart = ChartFactory.createGanttChart(date, "Mitarbeiter", "Zeitachse", dataset, false, true, false);
chart.setBackgroundPaint(Color.white);
//chart.setBorderVisible(false);
CategoryPlot plot = (CategoryPlot) chart.getPlot();
plot.setDomainGridlinePaint(Color.white);
plot.setOutlinePaint(Color.white);
plot.setBackgroundPaint(Color.white);
//plot.setOutlineVisible(false);
CategoryItemRenderer renderer = plot.getRenderer();
renderer.setBaseItemLabelGenerator( new IntervalCategoryItemLabelGenerator());
renderer.setBaseItemLabelsVisible(true);
renderer.setBaseItemLabelPaint(Color.BLACK);
renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.CENTER, TextAnchor.CENTER));
renderer.setBaseItemLabelGenerator( new CategoryItemLabelGenerator(){
@Override
public String generateRowLabel(CategoryDataset dataset, int row) {
return "Your Row Text " + row;
}
@Override
public String generateColumnLabel(CategoryDataset dataset, int column) {
return "Your Column Text " + column;
}
@Override
public String generateLabel(CategoryDataset dataset, int row, int column) {
if(row == 0 && column == 0){
return "" + getAuftragsAdresseList().get(0) + ", " + getAuftragsPLZList().get(0) + ", LiegenschaftsNr: " + getLiegenschaftsnummerList().get(0);
}else if(row == 0 && column == 1){
return "" + getAuftragsAdresseList().get(1) + ", " + getAuftragsPLZList().get(1) + ", LiegenschaftsNr: " + getLiegenschaftsnummerList().get(1);
}else if(row == 0 && column == 2){
return "" + getAuftragsAdresseList().get(2) + ", " + getAuftragsPLZList().get(2) + ", LiegenschaftsNr: " + getLiegenschaftsnummerList().get(2);
}else if(row == 0 && column == 3){
return "" + getAuftragsAdresseList().get(3) + ", " + getAuftragsPLZList().get(3) + ", LiegenschaftsNr: " + getLiegenschaftsnummerList().get(3);
}else if(row == 0 && column == 4){
return "" + getAuftragsAdresseList().get(4) + ", " + getAuftragsPLZList().get(4) + ", LiegenschaftsNr: " + getLiegenschaftsnummerList().get(4);
}else if(row == 0 && column == 5){
return "" + getAuftragsAdresseList().get(5) + ", " + getAuftragsPLZList().get(5) + ", LiegenschaftsNr: " + getLiegenschaftsnummerList().get(5);
}else if(row == 0 && column == 6){
return "" + getAuftragsAdresseList().get(6) + ", " + getAuftragsPLZList().get(6) + ", LiegenschaftsNr: " + getLiegenschaftsnummerList().get(6);
}else{
return "" + getAuftragsAdresseList().get(0);
}
}
});
renderer.setBaseToolTipGenerator((CategoryDataset categoryDataset, int row, int column) -> {
TaskSeriesCollection taskCollection = (TaskSeriesCollection) categoryDataset;
TaskSeries series = taskCollection.getSeries(row);
Task task = series.get(column);
return "Task: " + task.getDescription() + "\nStart: " + task.getDuration().getStart() +
"\nEnd: " + task.getDuration().getEnd();
});
renderer.setSeriesPaint(0, Color.GREEN);
ChartPanel panel = new ChartPanel(chart);
setContentPane(panel);
setVisible(true);
/*******************************/
setResizable(false);
}
private IntervalCategoryDataset getCategoryDataset(String date) throws ParseException {
date = date + " 00:00:00.00000";
Timestamp timestamp = Timestamp.valueOf(date);
Timestamp timestamp2 = addDays(timestamp,1);
try {
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3307/schichtplanung", "root", "admin");
PreparedStatement st = (PreparedStatement) connection.prepareStatement("SELECT schichtplanung.auftrag.auftragsbeginn, schichtplanung.auftrag.auftragsende, schichtplanung.auftrag.auftragsadresse, schichtplanung.auftrag.auftragsplz, schichtplanung.auftrag.liegenschaftsnummer, schichtplanung.mitarbeiter.vorname, schichtplanung.mitarbeiter.nachname FROM schichtplanung.auftrag INNER JOIN schichtplanung.mitarbeiter ON schichtplanung.auftrag.mitarbeiterid=schichtplanung.mitarbeiter.mitarbeiterid WHERE schichtplanung.auftrag.auftragsbeginn >= ? AND schichtplanung.auftrag.auftragsbeginn < ?");
st.setTimestamp(1, timestamp);
st.setTimestamp(2, timestamp2);
ResultSet rs = st.executeQuery();
while (rs.next()) {
Calendar calendar1 = Calendar.getInstance();
calendar1.setTimeInMillis(rs.getTimestamp(1).getTime());
getAuftragsBeginnList().add(calendar1);
Calendar calendar2 = Calendar.getInstance();
calendar2.setTimeInMillis(rs.getTimestamp(2).getTime());
getAuftragsEndeList().add(calendar2);
getAuftragsAdresseList().add(rs.getString(3));
getAuftragsPLZList().add(rs.getString(4));
getLiegenschaftsnummerList().add(rs.getInt(5));
getMitarbeiterVornameList().add(rs.getString(6));
getMitarbeiterNachnameList().add(rs.getString(7));
}
rs.close();
st.close();
} catch (SQLException sqlException) {
sqlException.printStackTrace();
}
TaskSeries series1 = new TaskSeries("Aufträge");
for (int i = 0; i < auftragsAdresse.size(); i++) {
series1.add(new Task(getMitarbeiterVornameList().get(i) + " " + getMitarbeiterNachnameList().get(i), getAuftragsBeginnList().get(i).getTime(), getAuftragsEndeList().get(i).getTime()));
System.out.println(getMitarbeiterVornameList().get(i) + " " + getMitarbeiterNachnameList().get(i) + " BeginnZeit: " + getAuftragsBeginnList().get(i).getTime() + " EndeZeit: " + getAuftragsEndeList().get(i).getTime());
}
TaskSeriesCollection dataset = new TaskSeriesCollection();
dataset.add(series1);
return dataset;
}
public ArrayList<Calendar> getAuftragsBeginnList() {
return auftragsBeginn;
}
public ArrayList<Calendar> getAuftragsEndeList() {
return auftragsEnde;
}
public ArrayList<String> getAuftragsAdresseList() {
return auftragsAdresse;
}
public ArrayList<String> getAuftragsPLZList() {
return auftragsPLZ;
}
public ArrayList<String> getMitarbeiterVornameList() {
return mitarbeiterVorname;
}
public ArrayList<String> getMitarbeiterNachnameList() {
return mitarbeiterNachname;
}
public ArrayList<Integer> getLiegenschaftsnummerList() {
return liegenschaftsnummer;
}
public Timestamp addDays(Timestamp date, int days) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);// w ww. j ava 2 s .co m
cal.add(Calendar.DATE, days); //minus number would decrement the days
return new Timestamp(cal.getTime().getTime());
}
}
class MyToolTipGenerator extends IntervalCategoryToolTipGenerator {
DateFormat format;
public MyToolTipGenerator(String value, DateFormat format) {
super(value, format);
this.format = format;
}
@Override
public String generateToolTip(CategoryDataset cds, int row, int col) {
final String s = super.generateToolTip(cds, row, col);
TaskSeriesCollection tsc = (TaskSeriesCollection) cds;
StringBuilder sb = new StringBuilder(s);
for (int i = 0; i < tsc.getSubIntervalCount(row, col); i++) {
sb.append(format.format(tsc.getStartValue(row, col, i)));
sb.append("-");
sb.append(format.format(tsc.getEndValue(row, col, i)));
sb.append(",");
}
sb.deleteCharAt(sb.length() - 1);
return sb.toString();
}
}
the other classes look similar from the structure.




