Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 40 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
40
Dung lượng
867,71 KB
Nội dung
294 Interfacing JR and GUIs Figure 20.1 gives a screen snapshot of the game. 1 It shows two windows on a single system display. As seen, each window consists of a menu, a button, and a board area. Windows are assigned unique identifiers (0,1, 2, ) and are considered to be ordered left-to-right according to those identifiers. Each board area holds two kinds of “toys”: balls and boxes. The menu and button are used to create new balls. Each menu click creates a single green or orange ball. Each button click creates a blue ball and a red ball. The balls and boxes move within the board area. Each board area is initially assigned a box. Only one box for each window exists during each game. The balls and boxes are labeled with the number of the window from which they originated. The board area also contains a text message, which simply moves randomly within the board area. Balls move automatically left to right across the window, zig-zagging be- tween the top and bottom. They “bounce” off the top or bottom, effecting a change in their upward or downward direction. Each ball’s initial placement within its originating window is randomly chosen. When a ball reaches the right border, it moves to the next window on the right (according to the ordering on window identifiers) or wraps around to the first window. Each ball expires after it has moved a certain number of times. Boxes move under user keyboard control. When a box reaches the left or right border, it moves to the previous or next window, respectively. Boxes cannot move beyond the top or bottom border. Each box lives for the duration of the game. As noted in the introduction to this chapter, the game is fairly simple so as to illustrate the basic concepts in using Swing. Exercises 20.4 and 20.5 suggest how to make the game more interesting. 20.2 BnB Code Overview The BnB program consists of the following classes: Main : the main program. It creates all the windows in the game. Window: represents a window (one for each player). It creates the graphical components it uses: a menu, a button, and a board. SwingApplication: the button. Board : the board. It creates and controls the toys on the board. Toy: a base class (superclass) for all toys. Its extended classes (subclasses) are: 1 Because this book is printed in black and white, the colors mentioned in this section do not appear in the figure. A color version of this figure is available on the JR webpage 20.2 BnB Code Overview 295 296 Interfacing JR and GUIs Ball Box Mtext (moving text) Key Input: keyboard input. Mouse Input : mouse input. The subsections below present the code for these classes in the above order. In a program that uses Swing, each graphical component provides a paintComponent method. This method is invoked whenever the frame re- paints itself. Thus, in the BnB program, Board provides a paintComponent method; this method is responsible for drawing all the toys on the board. The program’s other two graphical components — button and menu — have prede- fined paintComponent methods. The frame repaints itself whenever, for ex- ample, it detect that its contents have changed, e.g., the button has been clicked. It also repaints itself in response to explicit requests via the repaint method, such as those made within the code in Board. However, due to the event-driven nature of Swing, such requests do not necessarily happen immediately. (A re- paint request can be viewed as initiating an asynchronous activity, much like JR’s send statement.) Moreover, several repaint requests might be combined by Swing into a single one. Swing also provides the paintImmediately method, an alternative to repaint that can be used when painting without delay is desired. 20.2.1 Main Class Mai n creates one Window for each player. It places each on its own virtual machine. The virtual machines are created on the physical machines specified by the command-line arguments or on the local host if none are specified (using code similar to that in Section 10.2). It then gives each board remote references for all the boards so that the boards can pass balls and boxes between them. This structure is similar in purpose to that used to establish connections (“links”) between the servants in Dining Philosophers in the code in Section 11.3 and between the “points” in Matrix Multiplication in the code in Section 15.3, but the code here differs in two ways. First, the code here also uses an additional goahea d operation to ensure that all boards have received their links before any ballManager is started. (See Exercise 20.1.) Second, the code here also sends each board references for all boards. Although this game uses only the references for the two adjacent boards, all are sent to make the code easier to change when adding new features to the game. 20.2 BnB Code Overview 297 20.2.2 Window Class Window creates the graphical components needed by the game. It creates a board, a button, and a menu. The code is somewhat detailed, but that is necessary to specify all the desired graphical features. The code first creates the board, the button, and the menu with its items. It then specifies how these components should be placed together. Specifically, the button and board are placed together in a JPanel named mainPanel. The window has listeners that are used to quit the game and to give focus to the board. The window code enables the button to start up new balls by passing to it a capability for the board’s startBall operation. Similarly, it contains code for the menu items that invoke the board’s startBall operation. 298 Interfacing JR and GUIs 20.2 BnB Code Overview 299 20.2.3 Button Class The SwingApplication class creates the button. This code is modified slightly from that given in Reference [48]. The button counts the number of times it is clicked. On each click, it also creates two balls, one blue and one red. It uses a capability for the board’s startBall operation to create each ball. 300 Interfacing JR and GUIs 20.2.4 Board Class The Board class creates the board and controls the movements of the toys. It keeps a list of its toys in myToys. When a toy moves from one board to another, it is removed from the current board’s myToys and is passed to its new board, where it is added to that board’s myToys . The board code also contains a startup process to handle board start up (receiving remote references for all boards, as described in Section 20.2.1) and to create the balls and box that initially belong on the board. For each kind of toy, the board provides a manager to control the movement of the individual toy. 20.2 BnB Code Overview 301 302 Interfacing JR and GUIs 20.2 BnB Code Overview 303 [...]... iterations On each iteration of the loop, it computes the new location of the ball If the new location is at the top or the bottom of the board, it in effect makes the ball “bounce off” the border If the new location of the ball is off the board to the left or the right, the ballManager process sends a message to the adjacent board’s restartBall operation, exits the loop, removes the ball from this board’s... hitting the ‘p’ key will cause the game to pause (in all windows) until another key is hit (in the same window as original ‘p’) 311 Exercises (i) clicking the mouse within the board will move the box to the mouse’s location (If the box is on a different board, the box should move to the specified position located on the other board.) (j) clicking the mouse within the board will set the focus (for the. .. in another process Correspondence means that an input command in one process names the other process, an output command in the second process names the first process, and the messages specified in the two commands match When the commands correspond, the values are copied from the output command to the variables in the input command and the two processes continue their executions Note that in the above... delayed until the earlier withdrawal request has been completed (Hint: record the amount parameters of the processes waiting to complete their withdrawals.) (f) the One-Lane Bridge Problem (Exercise 9. 17) (g) the Bus Problem (Exercises 9. 18 and 9. 19) The CSP solution can use a manager process, but the other solutions cannot Do not use _signal_all in the monitor solution Exercises 327 (h) the Dining Philosophers... of the next example For the above monitor program, the Data monitor and the Sum class are placed in separate files The Data monitor contains monitor constructs, so it must be translated by the monitor preprocessor to generate JR code The Sum class contains no monitor constructs so it is translated as a regular JR program (The invocations in Sum of the monitor’s methods are regular JR invocations.) The. .. will be on one or the other of these components (Even though the button in BnB responds to only mouse clicks, buttons in general can be triggered by keys too.) The focus can be changed between components, as in many GUI applications, by hitting the tab key The code also sets the focus to the board area whenever the window is activated, i.e., the mouse is moved into the window Whether a particular program... signaled by some other process Two statements manipulate condition variables: _wait and _signal The wait statement places the currently executing process at the rear of the queue for the specified condition variable; it also releases the exclusive access this process had for the monitor, thus allowing another process to gain access The signal statement awakens the first process on the queue for the specified... still must reasonably distribute the “work” among the processes; e.g., do not have one process compute the pairings and send the results to the others Source files containing parts of this program come with the JR distribution Run your program on each of the supplied data files 21.12 Pairing Problem (a) Repeat the previous question using JR Because JR does not have the equivalent of implicit termination... incremented sum For the above CCR program, the BB resource and the BBMain class are placed in separate files Because each contains CCR constructs, each must be translated by the CCR preprocessor to generate JR code As a more interesting example, consider the CCR solution to the bounded buffer problem (described in Section 9. 3) The BB resource declares the variables associated with the bounded buffer The BBMain... 21 .9 Set partition Follow the directions for Exercise 9. 32, but solve the problem using the CSP preprocessor Assume implicit termination Do not use output commands in guards Source files containing parts of this program come with the JR distribution Run your program on each of the supplied data files 21.10 Dutch National Flag Follow the directions for Exercise 9. 33, but solve the problem using the . bottom of the board, it in effect makes the ball “bounce off” the border. If the new location of the ball is off the board to the left or the right, the ballManager process sends a message to the adjacent. ‘p’). Exercises 311 (i) (j) clicking the mouse within the board will move the box to the mouse’s location. (If the box is on a different board, the box should move to the specified position located on the other board.) clicking. GUI applications, by hitting the tab key. The code also sets the focus to the board area whenever the window is activated, i.e., the mouse is moved into the window. Whether a particular program