JavaFx assignment
p2/BarChartExperiments.java
p2/BarChartExperiments.java
import
java
.
util
.
Calendar
;
import
java
.
util
.
Date
;
import
javafx
.
application
.
Application
;
import
javafx
.
collections
.
FXCollections
;
import
javafx
.
event
.
ActionEvent
;
import
javafx
.
event
.
EventHandler
;
import
javafx
.
geometry
.
Pos
;
import
javafx
.
scene
.
Group
;
import
javafx
.
scene
.
Scene
;
import
javafx
.
scene
.
chart
.
Axis
;
import
javafx
.
scene
.
chart
.
BarChart
;
import
javafx
.
scene
.
chart
.
CategoryAxis
;
import
javafx
.
scene
.
chart
.
NumberAxis
;
import
javafx
.
scene
.
chart
.
XYChart
;
import
javafx
.
scene
.
control
.
ComboBox
;
import
javafx
.
scene
.
layout
.
VBox
;
import
javafx
.
stage
.
Stage
;
public
class
BarChartExperiments
implements
Observer
{
String
department
=
"Furniture"
;
BarChart
barChart
;
SalesData
data
;
Subject
subject
;
public
BarChartExperiments
(
SalesData
data
,
Subject
s
)
{
s
.
register
(
this
);
this
.
data
=
data
;
}
public
BarChart
createBarChart
()
{
CategoryAxis
xAxis
=
new
CategoryAxis
();
xAxis
.
setLabel
(
"Month"
);
NumberAxis
yAxis
=
new
NumberAxis
();
yAxis
.
setLabel
(
"Sales"
);
barChart
=
new
BarChart
(
xAxis
,
yAxis
);
refresh
(
department
);
return
barChart
;
}
public
void
refresh
(
String
department
)
{
String
[]
months
=
{
"Jan"
,
"Feb"
,
"Mar"
,
"Apr"
,
"May"
,
"Jun"
,
"Jul"
,
"Aug"
,
"Sep"
,
"Oct"
,
"Nov"
,
"Dec"
};
int
[]
totals
=
data
.
getYTDTotals
(
department
);
XYChart
.
Series
dataSeries1
;
dataSeries1
=
new
XYChart
.
Series
();
dataSeries1
.
setName
(
"Year to date Sales"
);
Calendar
cal
=
Calendar
.
getInstance
();
cal
.
setTime
(
new
Date
());
int
month
=
cal
.
get
(
Calendar
.
MONTH
)
+
1
;
for
(
int
i
=
0
;
i
<
month
;
i
++
)
{
dataSeries1
.
getData
().
add
(
new
XYChart
.
Data
(
months
[
i
],
totals
[
i
]));
}
barChart
.
getData
().
clear
();
barChart
.
getData
().
add
(
dataSeries1
);
}
}
p2/Main.java
p2/Main.java
import
java
.
util
.
ArrayList
;
import
java
.
util
.
Calendar
;
import
java
.
util
.
Date
;
import
javafx
.
application
.
Application
;
import
javafx
.
collections
.
FXCollections
;
import
javafx
.
event
.
ActionEvent
;
import
javafx
.
event
.
EventHandler
;
import
javafx
.
geometry
.
Pos
;
import
javafx
.
scene
.
Group
;
import
javafx
.
scene
.
Scene
;
import
javafx
.
scene
.
chart
.
BarChart
;
import
javafx
.
scene
.
chart
.
CategoryAxis
;
import
javafx
.
scene
.
chart
.
NumberAxis
;
import
javafx
.
scene
.
chart
.
PieChart
;
import
javafx
.
scene
.
chart
.
XYChart
;
import
javafx
.
scene
.
control
.
ComboBox
;
import
javafx
.
scene
.
control
.
TableView
;
import
javafx
.
scene
.
layout
.
BorderPane
;
import
javafx
.
scene
.
layout
.
HBox
;
import
javafx
.
scene
.
layout
.
VBox
;
import
javafx
.
stage
.
Stage
;
public
class
Main
extends
Application
implements
Subject
{
String
department
=
"Furniture"
;
BarChart
barChart
;
TableView
tableView
;
SalesData
data
=
new
SalesData
(
"Transactions.dat"
);
ArrayList
<
Observer
>
list
=
new
ArrayList
<
Observer
>
();
@
Override
public
void
start
(
Stage
primaryStage
)
throws
Exception
{
primaryStage
.
setTitle
(
"Current Sales"
);
BarChartExperiments
b
=
new
BarChartExperiments
(
data
,
this
);
barChart
=
b
.
createBarChart
();
TableExperiments
t
=
new
TableExperiments
(
data
,
this
);
tableView
=
t
.
createTableView
();
String
depts
[]
=
{
"Furniture"
,
"HardWare"
,
"Electronics"
};
// Create a combo box
ComboBox
combo_box
=
new
ComboBox
(
FXCollections
.
observableArrayList
(
depts
));
combo_box
.
setValue
(
"Furniture"
);
// Create action event
EventHandler
<
ActionEvent
>
event
=
new
EventHandler
<
ActionEvent
>
()
{
public
void
handle
(
ActionEvent
e
)
{
department
=
(
String
)
combo_box
.
getValue
();
notifyObservers
();
}
};
// Set on action
combo_box
.
setOnAction
(
event
);
VBox
vbox
=
new
VBox
(
combo_box
);
vbox
.
setAlignment
(
Pos
.
CENTER
);
HBox
hbox
=
new
HBox
();
BorderPane
border
=
new
BorderPane
();
border
.
setTop
(
vbox
);
border
.
setCenter
(
hbox
);
Scene
scene
=
new
Scene
(
border
,
800
,
200
);
hbox
.
getChildren
().
addAll
(
tableView
,
barChart
);
hbox
.
setAlignment
(
Pos
.
CENTER
);
primaryStage
.
setScene
(
scene
);
primaryStage
.
setHeight
(
300
);
primaryStage
.
setWidth
(
1200
);
primaryStage
.
show
();
}
public
void
notifyObservers
()
{
for
(
Observer
o
:
list
)
{
o
.
refresh
(
department
);
}
}
public
void
register
(
Observer
obs
)
{
list
.
add
(
obs
);
}
public
void
unRegister
(
Observer
obs
)
{
list
.
remove
(
obs
);
}
public
static
void
main
(
String
[]
args
)
{
Application
.
launch
(
args
);
}
}
p2/MainTab.java
p2/MainTab.java
import
java
.
util
.
ArrayList
;
import
java
.
util
.
Calendar
;
import
java
.
util
.
Date
;
import
javafx
.
application
.
Application
;
import
javafx
.
collections
.
FXCollections
;
import
javafx
.
event
.
ActionEvent
;
import
javafx
.
event
.
EventHandler
;
import
javafx
.
geometry
.
Pos
;
import
javafx
.
scene
.
Group
;
import
javafx
.
scene
.
Scene
;
import
javafx
.
scene
.
chart
.
BarChart
;
import
javafx
.
scene
.
chart
.
CategoryAxis
;
import
javafx
.
scene
.
chart
.
NumberAxis
;
import
javafx
.
scene
.
chart
.
PieChart
;
import
javafx
.
scene
.
chart
.
XYChart
;
import
javafx
.
scene
.
control
.
ComboBox
;
import
javafx
.
scene
.
control
.
Tab
;
import
javafx
.
scene
.
control
.
TabPane
;
import
javafx
.
scene
.
control
.
TableView
;
import
javafx
.
scene
.
layout
.
BorderPane
;
import
javafx
.
scene
.
layout
.
HBox
;
import
javafx
.
scene
.
layout
.
VBox
;
import
javafx
.
stage
.
Stage
;
public
class
MainTab
extends
Application
implements
Subject
{
String
department
=
"Furniture"
;
BarChart
barChart
;
TableView
tableView
;
SalesData
data
=
new
SalesData
(
"Transactions.dat"
);
ArrayList
<
Observer
>
list
=
new
ArrayList
<
Observer
>
();
@
Override
public
void
start
(
Stage
primaryStage
)
throws
Exception
{
primaryStage
.
setTitle
(
"Current Sales"
);
BarChartExperiments
b
=
new
BarChartExperiments
(
data
,
this
);
barChart
=
b
.
createBarChart
();
TableExperiments
t
=
new
TableExperiments
(
data
,
this
);
tableView
=
t
.
createTableView
();
String
depts
[]
=
{
"Furniture"
,
"HardWare"
,
"Electronics"
};
// Create a combo box
ComboBox
combo_box
=
new
ComboBox
(
FXCollections
.
observableArrayList
(
depts
));
combo_box
.
setValue
(
"Furniture"
);
// Create action event
EventHandler
<
ActionEvent
>
event
=
new
EventHandler
<
ActionEvent
>
()
{
public
void
handle
(
ActionEvent
e
)
{
department
=
(
String
)
combo_box
.
getValue
();
notifyObservers
();
}
};
// Set on action
combo_box
.
setOnAction
(
event
);
TabPane
tabPane
=
new
TabPane
();
BorderPane
mainPane
=
new
BorderPane
();
VBox
vbox1
=
new
VBox
();
vbox1
.
setAlignment
(
Pos
.
CENTER
);
vbox1
.
getChildren
().
add
(
tableView
);
//Create Tabs
Tab
tabA
=
new
Tab
();
tabA
.
setText
(
"Table View"
);
tabA
.
setContent
(
vbox1
);
tabPane
.
getTabs
().
add
(
tabA
);
VBox
vbox2
=
new
VBox
();
vbox2
.
setAlignment
(
Pos
.
CENTER
);
vbox2
.
getChildren
().
add
(
barChart
);
//Create Tabs
Tab
tabB
=
new
Tab
();
tabB
.
setText
(
"Bar Chart"
);
tabB
.
setContent
(
vbox2
);
tabPane
.
getTabs
().
add
(
tabB
);
mainPane
.
setTop
(
combo_box
);
mainPane
.
setAlignment
(
combo_box
,
Pos
.
CENTER
);
mainPane
.
setCenter
(
tabPane
);
Scene
scene
=
new
Scene
(
mainPane
,
400
,
600
);
/*BorderPane border = new BorderPane();
border.setTop(vbox);
border.setCenter(hbox);
Scene scene = new Scene(border, 800, 200);
hbox.getChildren().addAll(tableView,barChart,pieChart);
hbox.setAlignment(Pos.CENTER);*/
primaryStage
.
setScene
(
scene
);
primaryStage
.
setHeight
(
300
);
primaryStage
.
setWidth
(
1200
);
primaryStage
.
show
();
}
public
void
notifyObservers
()
{
for
(
Observer
o
:
list
)
{
o
.
refresh
(
department
);
}
}
public
void
register
(
Observer
obs
)
{
list
.
add
(
obs
);
}
public
void
unRegister
(
Observer
obs
)
{
list
.
remove
(
obs
);
}
public
static
void
main
(
String
[]
args
)
{
Application
.
launch
(
args
);
}
}
p2/Observer.java
p2/Observer.java
public
interface
Observer
{
public
void
refresh
(
String
dept
);
}
p2/SaleItem.java
p2/SaleItem.java
public
class
SaleItem
{
private
String
dept
;
private
int
month
;
private
int
day
;
private
int
quantity
;
private
int
amount
;
public
String
getDepartment
()
{
return
dept
;
}
public
int
getMonth
()
{
return
month
;
}
public
int
getDay
()
{
return
day
;
}
public
String
getDept
()
{
return
dept
;
}
public
int
getQuantity
()
{
return
quantity
;
}
public
int
getAmount
()
{
return
amount
;
}
public
SaleItem
(
String
d
,
int
month
,
int
day
,
int
quantity
,
int
amount
)
{
dept
=
d
;
this
.
month
=
month
;
this
.
day
=
day
;
this
.
quantity
=
quantity
;
this
.
amount
=
amount
;
}
}
p2/SalesData.java
p2/SalesData.java
import
java
.
io
.
File
;
import
java
.
io
.
IOException
;
import
java
.
util
.
ArrayList
;
import
java
.
util
.
Calendar
;
import
java
.
util
.
Date
;
import
java
.
util
.
Scanner
;
import
java
.
util
.
StringTokenizer
;
public
class
SalesData
{
ArrayList
<
SaleItem
>
allRows
;
String
department
=
"Furniture"
;
public
SalesData
(
String
fileName
)
{
allRows
=
new
ArrayList
<
SaleItem
>
();
Scanner
input
=
null
;
try
{
input
=
new
Scanner
(
new
File
(
fileName
));
}
catch
(
IOException
e
)
{
System
.
err
.
println
(
"File not found!"
);
}
while
(
input
.
hasNext
())
{
String
line
=
input
.
nextLine
();
StringTokenizer
st
=
new
StringTokenizer
(
line
,
","
);
String
s
=
st
.
nextToken
();
int
m
=
Integer
.
parseInt
(
st
.
nextToken
());
int
d
=
Integer
.
parseInt
(
st
.
nextToken
());
int
q
=
Integer
.
parseInt
(
st
.
nextToken
());
int
a
=
Integer
.
parseInt
(
st
.
nextToken
());
SaleItem
item
=
new
SaleItem
(
s
,
m
,
d
,
q
,
a
);
allRows
.
add
(
item
);
}
}
public
String
getDepartment
(){
return
department
;
}
public
void
setDepartment
(
String
d
){
department
=
d
;}
public
int
[]
getYTDTotals
(
String
department
)
{
int
[]
totals
=
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
};
for
(
int
i
=
0
;
i
<
12
;
i
++
)
{
totals
[
i
]
=
getMonthlyTotal
(
i
+
1
,
department
);
}
return
totals
;
}
public
int
getMonthlyTotal
(
int
month
,
String
department
)
{
int
total
=
0
;
ArrayList
<
SaleItem
>
result
=
getCurrentMonthTransactions
(
month
,
department
);
for
(
SaleItem
s
:
result
)
{
total
=
total
+
s
.
getAmount
();
}
return
total
;
}
public
ArrayList
getCurrentMonthTransactions
(
int
month
,
String
department
)
{
ArrayList
<
SaleItem
>
result
=
new
ArrayList
<
SaleItem
>
();
for
(
SaleItem
s
:
allRows
)
{
if
(
s
.
getDepartment
().
equals
(
department
)
&&
s
.
getMonth
()
==
month
)
{
result
.
add
(
s
);
}
}
return
result
;
}
}
p2/Subject.java
p2/Subject.java
public
interface
Subject
{
public
void
notifyObservers
();
public
void
register
(
Observer
obs
);
public
void
unRegister
(
Observer
obs
);
}
p2/TableExperiments.java
p2/TableExperiments.java
import
java
.
util
.
ArrayList
;
import
java
.
util
.
Calendar
;
import
java
.
util
.
Date
;
import
java
.
util
.
List
;
import
javafx
.
application
.
Application
;
import
javafx
.
collections
.
FXCollections
;
import
javafx
.
collections
.
ObservableList
;
import
javafx
.
event
.
ActionEvent
;
import
javafx
.
event
.
EventHandler
;
import
javafx
.
geometry
.
Pos
;
import
javafx
.
scene
.
Scene
;
import
javafx
.
scene
.
chart
.
BarChart
;
import
javafx
.
scene
.
chart
.
CategoryAxis
;
import
javafx
.
scene
.
chart
.
NumberAxis
;
import
javafx
.
scene
.
chart
.
XYChart
;
import
javafx
.
scene
.
control
.
ComboBox
;
import
javafx
.
scene
.
control
.
TableColumn
;
import
javafx
.
scene
.
control
.
TableView
;
import
javafx
.
scene
.
control
.
cell
.
PropertyValueFactory
;
import
javafx
.
scene
.
layout
.
VBox
;
import
javafx
.
stage
.
Stage
;
public
class
TableExperiments
implements
Observer
{
String
department
;
TableView
<
SaleItem
>
table
;
SalesData
data
;
public
TableExperiments
(
SalesData
data
,
Subject
s
)
{
s
.
register
(
this
);
this
.
data
=
data
;
department
=
"Furniture"
;
}
public
TableView
createTableView
(){
table
=
new
TableView
<>
();
refresh
(
department
);
return
table
;
}
public
void
refresh
(
String
department
)
{
this
.
department
=
department
;
ObservableList
<
SaleItem
>
items
=
getInitialTableData
();
table
.
setItems
(
items
);
TableColumn
monthCol
=
new
TableColumn
(
"Month"
);
monthCol
.
setCellValueFactory
(
new
PropertyValueFactory
<
SaleItem
,
Integer
>
(
"month"
));
TableColumn
dayCOl
=
new
TableColumn
(
"Day"
);
dayCOl
.
setCellValueFactory
(
new
PropertyValueFactory
<
SaleItem
,
Integer
>
(
"day"
));
TableColumn
quanityCol
=
new
TableColumn
(
"Quantity"
);
quanityCol
.
setCellValueFactory
(
new
PropertyValueFactory
<
SaleItem
,
Integer
>
(
"quantity"
));
TableColumn
amountCol
=
new
TableColumn
(
"Amount"
);
amountCol
.
setCellValueFactory
(
new
PropertyValueFactory
<
SaleItem
,
Integer
>
(
"amount"
));
table
.
getColumns
().
setAll
(
monthCol
,
dayCOl
,
quanityCol
,
amountCol
);
table
.
setPrefWidth
(
450
);
table
.
setPrefHeight
(
300
);
table
.
setColumnResizePolicy
(
TableView
.
CONSTRAINED_RESIZE_POLICY
);
}
private
ObservableList
<
SaleItem
>
getInitialTableData
()
{
Calendar
cal
=
Calendar
.
getInstance
();
cal
.
setTime
(
new
Date
());
int
month
=
cal
.
get
(
Calendar
.
MONTH
)
+
1
;
ArrayList
<
SaleItem
>
result
=
data
.
getCurrentMonthTransactions
(
month
,
department
);
ObservableList
<
SaleItem
>
list
=
FXCollections
.
observableList
(
result
);
return
list
;
}
}
p2/Transactions.dat
| Furniture | 1 | 1 | 2 | 200 |
| Furniture | 1 | 10 | 2 | 400 |
| Furniture | 1 | 15 | 2 | 400 |
| Furniture | 2 | 1 | 2 | 2000 |
| Furniture | 2 | 10 | 2 | 2000 |
| Furniture | 2 | 15 | 2 | 1000 |
| Furniture | 3 | 1 | 2 | 2000 |
| Furniture | 3 | 10 | 2 | 1000 |
| Furniture | 3 | 15 | 2 | 1000 |
| Furniture | 4 | 1 | 2 | 200 |
| Furniture | 4 | 10 | 2 | 400 |
| Furniture | 4 | 15 | 2 | 400 |
| Furniture | 5 | 1 | 2 | 2000 |
| Furniture | 5 | 1 | 2 | 2000 |
| Furniture | 5 | 1 | 2 | 2000 |
| Furniture | 6 | 10 | 2 | 2000 |
| Furniture | 6 | 15 | 2 | 2000 |
| Furniture | 6 | 1 | 2 | 1000 |
| Furniture | 6 | 2 | 2 | 4000 |
| Furniture | 7 | 10 | 2 | 200 |
| Furniture | 7 | 15 | 2 | 700 |
| Furniture | 7 | 1 | 2 | 100 |
| Furniture | 8 | 10 | 2 | 200 |
| Furniture | 8 | 15 | 2 | 200 |
| Furniture | 8 | 1 | 2 | 1600 |
| Furniture | 9 | 10 | 2 | 200 |
| Furniture | 9 | 15 | 2 | 200 |
| Furniture | 9 | 1 | 2 | 600 |
| Furniture | 10 | 10 | 2 | 1000 |
| Furniture | 10 | 15 | 2 | 2000 |
| Furniture | 10 | 1 | 2 | 1000 |
| Furniture | 11 | 10 | 2 | 200 |
| Furniture | 11 | 15 | 2 | 200 |
| Furniture | 11 | 1 | 2 | 800 |
| Furniture | 12 | 10 | 2 | 2000 |
| Furniture | 12 | 15 | 2 | 2000 |
| Furniture | 12 | 1 | 2 | 2000 |
| HardWare | 1 | 1 | 2 | 2000 |
| HardWare | 1 | 10 | 2 | 2000 |
| HardWare | 1 | 15 | 2 | 1000 |
| HardWare | 2 | 1 | 2 | 2000 |
| HardWare | 2 | 10 | 2 | 2000 |
| HardWare | 2 | 15 | 2 | 2000 |
| HardWare | 3 | 1 | 2 | 200 |
| HardWare | 3 | 10 | 2 | 1000 |
| HardWare | 3 | 15 | 2 | 800 |
| HardWare | 4 | 1 | 2 | 200 |
| HardWare | 4 | 10 | 2 | 400 |
| HardWare | 4 | 15 | 2 | 400 |
| HardWare | 5 | 1 | 2 | 200 |
| HardWare | 5 | 1 | 2 | 200 |
| HardWare | 5 | 1 | 2 | 600 |
| HardWare | 6 | 10 | 3 | 3000 |
| HardWare | 6 | 15 | 2 | 2000 |
| HardWare | 6 | 1 | 2 | 1000 |
| HardWare | 7 | 10 | 2 | 200 |
| HardWare | 7 | 15 | 2 | 700 |
| HardWare | 7 | 1 | 2 | 100 |
| HardWare | 8 | 10 | 2 | 200 |
| HardWare | 8 | 15 | 2 | 200 |
| HardWare | 8 | 1 | 2 | 600 |
| HardWare | 9 | 10 | 2 | 200 |
| HardWare | 9 | 15 | 2 | 200 |
| HardWare | 9 | 1 | 2 | 600 |
| HardWare | 10 | 10 | 2 | 2000 |
| HardWare | 10 | 15 | 2 | 2000 |
| HardWare | 10 | 1 | 2 | 2000 |
| HardWare | 11 | 10 | 2 | 1000 |
| HardWare | 11 | 15 | 2 | 200 |
| HardWare | 11 | 1 | 2 | 1800 |
| HardWare | 12 | 10 | 2 | 200 |
| HardWare | 12 | 15 | 2 | 200 |
| HardWare | 12 | 1 | 2 | 600 |
| Electronics | 1 | 1 | 2 | 200 |
| Electronics | 1 | 10 | 2 | 400 |
| Electronics | 1 | 15 | 2 | 400 |
| Electronics | 2 | 1 | 2 | 2000 |
| Electronics | 2 | 10 | 2 | 2000 |
| Electronics | 2 | 15 | 2 | 1000 |
| Electronics | 3 | 1 | 2 | 2000 |
| Electronics | 3 | 10 | 2 | 1000 |
| Electronics | 3 | 15 | 2 | 1000 |
| Electronics | 4 | 1 | 2 | 200 |
| Electronics | 4 | 10 | 2 | 400 |
| Electronics | 4 | 15 | 2 | 400 |
| Electronics | 5 | 1 | 2 | 200 |
| Electronics | 5 | 1 | 2 | 200 |
| Electronics | 5 | 1 | 2 | 600 |
| Electronics | 6 | 10 | 2 | 2000 |
| Electronics | 6 | 15 | 1 | 1000 |
| Electronics | 6 | 1 | 2 | 1000 |
| Electronics | 7 | 10 | 2 | 200 |
| Electronics | 7 | 15 | 2 | 700 |
| Electronics | 7 | 1 | 2 | 100 |
| Electronics | 8 | 10 | 2 | 1200 |
| Electronics | 8 | 15 | 2 | 1200 |
| Electronics | 8 | 1 | 2 | 1600 |
| Electronics | 9 | 10 | 2 | 200 |
| Electronics | 9 | 15 | 2 | 200 |
| Electronics | 9 | 1 | 2 | 600 |
| Electronics | 10 | 10 | 2 | 1000 |
| Electronics | 10 | 15 | 2 | 2000 |
| Electronics | 10 | 1 | 2 | 1000 |
| Electronics | 11 | 10 | 2 | 1000 |
| Electronics | 11 | 15 | 2 | 200 |
| Electronics | 11 | 1 | 2 | 1800 |
| Electronics | 12 | 10 | 2 | 200 |
| Electronics | 12 | 15 | 2 | 200 |
| Electronics | 12 | 1 | 2 | 600 |