1
+ package ch_16 .exercise16_09 ;
2
+
3
+ import javafx .application .Application ;
4
+ import javafx .geometry .Pos ;
5
+ import javafx .scene .Scene ;
6
+ import javafx .scene .control .Button ;
7
+ import javafx .scene .control .Label ;
8
+ import javafx .scene .control .TextField ;
9
+ import javafx .scene .layout .GridPane ;
10
+ import javafx .scene .layout .HBox ;
11
+ import javafx .scene .layout .Pane ;
12
+ import javafx .scene .layout .VBox ;
13
+ import javafx .scene .paint .Color ;
14
+ import javafx .scene .shape .Rectangle ;
15
+ import javafx .scene .text .Text ;
16
+ import javafx .stage .Stage ;
17
+
18
+ /**
19
+ * **16.9 (Geometry: two rectangles intersect?) Write a program that enables the user to
20
+ * specify the location and size of the rectangles and displays whether the two rectangles intersect,
21
+ * as shown in Figure 16.39b. Enable the user to point the mouse
22
+ * inside a rectangle and drag it. As the rectangle is being dragged, the rectangle’s
23
+ * center coordinates in the text fields are updated.
24
+ */
25
+ public class Exercise16_09 extends Application {
26
+ private RectangleExt rectangle1 ;
27
+ private RectangleExt rectangle2 ;
28
+ private Rectangle layoutRect ;
29
+ private Pane drawPane ;
30
+
31
+ private TextField r1centerXTextField ;
32
+ private TextField r1centerYTextField ;
33
+ private TextField r1WidthTextField ;
34
+ private TextField r1HeightTextField ;
35
+ private TextField r2centerXTextField ;
36
+ private TextField r2centerYTextField ;
37
+ private TextField r2WidthTextField ;
38
+ private TextField r2HeightTextField ;
39
+
40
+ @ Override
41
+ public void start (Stage primaryStage ) {
42
+ layoutRect = new Rectangle (0 , 0 , 250 , 110 );
43
+ layoutRect .setStroke (Color .WHITE );
44
+ layoutRect .setFill (Color .WHITE );
45
+ rectangle1 = new RectangleExt (52.0 , 60.0 , Color .WHITE );
46
+ rectangle1 .setTopLeft (new Pt (200 , 10 ));
47
+ rectangle1 .setStroke (Color .BLACK );
48
+ rectangle2 = new RectangleExt (80.0 , 56.0 , Color .WHITE );
49
+ rectangle2 .setStroke (Color .BLACK );
50
+ rectangle2 .setTopLeft (new Pt (60 , 10 ));
51
+
52
+ drawPane = new Pane (layoutRect , rectangle1 , rectangle2 );
53
+ r1centerXTextField = new TextField ();
54
+ r2centerXTextField = new TextField ();
55
+ r1centerYTextField = new TextField ();
56
+ r2centerYTextField = new TextField ();
57
+ r1WidthTextField = new TextField ();
58
+ r1HeightTextField = new TextField ();
59
+ r2WidthTextField = new TextField ();
60
+ r2HeightTextField = new TextField ();
61
+ r1centerXTextField .setPrefColumnCount (3 );
62
+ r1centerYTextField .setPrefColumnCount (3 );
63
+ r1HeightTextField .setPrefColumnCount (3 );
64
+ r2centerXTextField .setPrefColumnCount (3 );
65
+ r2centerYTextField .setPrefColumnCount (3 );
66
+ r2WidthTextField .setPrefColumnCount (3 );
67
+
68
+
69
+ r1centerXTextField .setText (String .valueOf (rectangle1 .getCenter ().getX ()));
70
+ r1centerYTextField .setText (String .valueOf (rectangle1 .getCenter ().getY ()));
71
+ r1WidthTextField .setText (String .valueOf (rectangle1 .getWidth ()));
72
+ r1HeightTextField .setText (String .valueOf (rectangle1 .getHeight ()));
73
+
74
+ r2centerXTextField .setText (String .valueOf (rectangle2 .getCenter ().getX ()));
75
+ r2centerYTextField .setText (String .valueOf (rectangle2 .getCenter ().getY ()));
76
+ r2WidthTextField .setText (String .valueOf (rectangle2 .getWidth ()));
77
+ r2HeightTextField .setText (String .valueOf (rectangle2 .getHeight ()));
78
+
79
+ VBox paneForTable1 = getInputGrid (r1centerXTextField ,
80
+ r1centerYTextField , r1WidthTextField , r1HeightTextField , 1 );
81
+
82
+ VBox paneForTable2 = getInputGrid (r2centerXTextField ,
83
+ r2centerYTextField , r2WidthTextField , r2HeightTextField , 2 );
84
+
85
+ HBox paneForTables = new HBox (5 );
86
+ paneForTables .setAlignment (Pos .CENTER );
87
+ paneForTables .getChildren ().addAll (paneForTable1 , paneForTable2 );
88
+ Button redrawButton = new Button ("Redraw Rectangles" );
89
+ VBox vBox = new VBox ();
90
+ vBox .setAlignment (Pos .CENTER );
91
+ vBox .getChildren ().addAll (intersect (), drawPane ,
92
+ paneForTables , redrawButton );
93
+ redrawButton .setOnAction (e -> {
94
+ draw ();
95
+ vBox .getChildren ().remove (0 );
96
+ vBox .getChildren ().add (0 , intersect ());
97
+ });
98
+
99
+ rectangle1 .setOnMouseDragged (e -> {
100
+ rectangle1 .setTopLeft (new Pt (e .getX (), e .getY ()));
101
+ r1centerXTextField .setText (String .valueOf (rectangle1 .getCenter ().getX ()));
102
+ r1centerYTextField .setText (String .valueOf (rectangle1 .getCenter ().getY ()));
103
+ vBox .getChildren ().remove (0 );
104
+ vBox .getChildren ().add (0 , intersect ());
105
+ });
106
+
107
+ rectangle2 .setOnMouseDragged (e -> {
108
+ rectangle2 .setTopLeft (new Pt (e .getX (), e .getY ()));
109
+ r2centerXTextField .setText (String .valueOf (rectangle2 .getCenter ().getX ()));
110
+ r2centerYTextField .setText (String .valueOf (rectangle2 .getCenter ().getY ()));
111
+ vBox .getChildren ().remove (0 );
112
+ vBox .getChildren ().add (0 , intersect ());
113
+
114
+ });
115
+
116
+ Scene scene = new Scene (vBox );
117
+ primaryStage .setTitle (getClass ().getName ());
118
+ primaryStage .setScene (scene );
119
+ primaryStage .show ();
120
+
121
+ vBox .widthProperty ().addListener (ov ->
122
+ layoutRect .widthProperty ().bind (vBox .widthProperty ())
123
+ );
124
+
125
+ vBox .heightProperty ().addListener (ov ->
126
+ layoutRect .heightProperty ().bind (vBox .heightProperty ().multiply (0.5 ))
127
+ );
128
+
129
+ vBox .heightProperty ().addListener (ov ->
130
+ layoutRect .heightProperty ().bind (vBox .heightProperty ().multiply (0.5 ))
131
+ );
132
+
133
+ layoutRect .setWidth (vBox .getWidth ());
134
+ layoutRect .setHeight (vBox .getHeight ());
135
+
136
+
137
+ }
138
+
139
+
140
+ private Text intersect () {
141
+ return new Text ("Two rectangles intersect? " + checkIntersection ());
142
+ }
143
+
144
+
145
+ String checkIntersection () {
146
+ if (rectangle1 .overlaps (rectangle2 )) {
147
+ return "Yes" ;
148
+ }
149
+
150
+ return "No" ;
151
+ }
152
+
153
+ protected VBox getInputGrid (
154
+ TextField x ,
155
+ TextField y ,
156
+ TextField w ,
157
+ TextField h ,
158
+ int n ) {
159
+ VBox vBox = new VBox (1 );
160
+ GridPane gridPane = new GridPane ();
161
+ gridPane .setHgap (5 );
162
+ gridPane .setVgap (5 );
163
+ gridPane .add (new Label ("Center X:" ), 0 , 0 );
164
+ gridPane .add (x , 1 , 0 );
165
+ gridPane .add (new Label ("Center Y:" ), 0 , 1 );
166
+ gridPane .add (y , 1 , 1 );
167
+ gridPane .add (new Label ("Width:" ), 0 , 2 );
168
+ gridPane .add (w , 1 , 2 );
169
+ gridPane .add (new Label ("Height:" ), 0 , 3 );
170
+ gridPane .add (h , 1 , 3 );
171
+ vBox .getChildren ().addAll (new Label ("Enter rectangle " +
172
+ n + " info:" ), gridPane );
173
+ return vBox ;
174
+ }
175
+
176
+ private void draw () {
177
+ double x1 = Double .parseDouble (r1centerXTextField .getText ());
178
+ if (x1 != rectangle1 .getCenter ().getX ()) {
179
+ rectangle1 .setCenter (new Pt (x1 , rectangle1 .getCenter ().getY ()));
180
+ }
181
+
182
+ double y1 = Double .parseDouble (r1centerYTextField .getText ());
183
+ if (y1 != rectangle1 .getCenter ().getY ()) {
184
+ rectangle1 .setCenter (new Pt (rectangle1 .getCenter ().getX (), y1 ));
185
+ }
186
+
187
+ double x2 = Double .parseDouble (r2centerXTextField .getText ());
188
+ if (x2 != rectangle2 .getCenter ().getX ()) {
189
+ rectangle2 .setCenter (new Pt (x2 , rectangle2 .getCenter ().getY ()));
190
+ }
191
+
192
+ double y2 = Double .parseDouble (r2centerYTextField .getText ());
193
+ if (y2 != rectangle2 .getCenter ().getY ()) {
194
+ rectangle2 .setCenter (new Pt (rectangle2 .getCenter ().getX (), y2 ));
195
+ }
196
+
197
+ double h1 = Double .parseDouble (r1HeightTextField .getText ());
198
+ if (h1 != rectangle1 .getHeight ()) {
199
+ rectangle1 .setHeight (h1 );
200
+ }
201
+
202
+ double w1 = Double .parseDouble (r1WidthTextField .getText ());
203
+ if (w1 != rectangle1 .getWidth ()) {
204
+ rectangle1 .setWidth (w1 );
205
+ }
206
+
207
+ double w2 = Double .parseDouble (r2WidthTextField .getText ());
208
+ if (w2 != rectangle2 .getWidth ()) {
209
+ rectangle2 .setWidth (w2 );
210
+ }
211
+
212
+ double h2 = Double .parseDouble (r2HeightTextField .getText ());
213
+ if (h2 != rectangle2 .getHeight ()) {
214
+ rectangle2 .setHeight (h2 );
215
+ }
216
+
217
+
218
+ }
219
+ }
0 commit comments