[ Pobierz całość w formacie PDF ]
.An applet is always attached to a Web page and visible within your Web browser, while a dialog box is detachedso in theory, it could be possible.As a result it is not so common to see an applet that uses a dialog box.The following example is more complex; the dialog box is made up of a grid (using GridLayout) of a special kind of button that is defined here as class ToeButton.This button draws a frame around itself and, depending on its state, a blank, an x, or an o in the middle.It starts out blank, and then depending on whose turn it is, changes to an x or an o. However, it will also flip back and forth between x and o when you click on the button.(This makes the tic-tac-toe concept only slightly more annoying than it already is.) In addition, the dialog box can be set up for any number of rows and columns by changing numbers in the main application window.//: c13:TicTacToe.java// Demonstration of dialog boxes// and creating your own components.// <applet code=TicTacToe// width=200 height=100></applet>import javax.swing.*;import java.awt.*;import java.awt.event.*;import com.bruceeckel.swing.*;public class TicTacToe extends JApplet {JTextFieldrows = new JTextField("3"),cols = new JTextField("3");static final int BLANK = 0, XX = 1, OO = 2;class ToeDialog extends JDialog {int turn = XX; // Start with x's turn// w = number of cells wide// h = number of cells highpublic ToeDialog(int w, int h) {setTitle("The game itself");Container cp = getContentPane();cp.setLayout(new GridLayout(w, h));for(int i = 0; i < w * h; i++)cp.add(new ToeButton());setSize(w * 50, h * 50);// JDK 1.3 close dialog://#setDefaultCloseOperation(//# DISPOSE_ON_CLOSE);// JDK 1.2 close dialog:addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){dispose();}});}class ToeButton extends JPanel {int state = BLANK;public ToeButton() {addMouseListener(new ML());}public void paintComponent(Graphics g) {super.paintComponent(g);int x1 = 0;int y1 = 0;int x2 = getSize().width - 1;int y2 = getSize().height - 1;g.drawRect(x1, y1, x2, y2);x1 = x2/4;y1 = y2/4;int wide = x2/2;int high = y2/2;if(state == XX) {g.drawLine(x1, y1,x1 + wide, y1 + high);g.drawLine(x1, y1 + high,x1 + wide, y1);}if(state == OO) {g.drawOval(x1, y1,x1 + wide/2, y1 + high/2);}}class ML extends MouseAdapter {public void mousePressed(MouseEvent e) {if(state == BLANK) {state = turn;turn = (turn == XX ? OO : XX);}elsestate = (state == XX ? OO : XX);repaint();}}}}class BL implements ActionListener {public void actionPerformed(ActionEvent e) {JDialog d = new ToeDialog(Integer.parseInt(rows.getText()),Integer.parseInt(cols.getText()));d.setVisible(true);}}public void init() {JPanel p = new JPanel();p.setLayout(new GridLayout(2,2));p.add(new JLabel("Rows", JLabel.CENTER));p.add(rows);p.add(new JLabel("Columns", JLabel.CENTER));p.add(cols);Container cp = getContentPane();cp.add(p, BorderLayout.NORTH);JButton b = new JButton("go");b.addActionListener(new BL());cp.add(b, BorderLayout.SOUTH);}public static void main(String[] args) {Console.run(new TicTacToe(), 200, 100);}} ///:~Because statics can only be at the outer level of the class, inner classes cannot have static data or nested classes.A mouse click is captured by the MouseListener, which first checks to see if the panel has anything written on it.If not, the parent window is queried to find out whose turn it is and that is used to establish the state of the ToeButton.Via the inner class mechanism, the ToeButton then reaches back into the parent and changes the turn.If the button is already displaying an x or an o then that is flopped.You can see in these calculations the convenient use of the ternary if-else described in Chapter 3.After a state change, the ToeButton is repainted.The constructor for ToeDialog is quite simple: it adds into a GridLayout as many buttons as you request, then resizes it for 50 pixels on a side for each button.TicTacToe sets up the whole application by creating the JTextFields (for inputting the rows and columns of the button grid) and the go button with its ActionListener.When the button is pressed, the data in the JTextFields must be fetched, and, since they are in String form, turned into ints using the static Integer.parseInt( )File dialogsThe following application exercises two forms of JFileChooser dialogs, one for opening and one for saving.Most of the code should by now be familiar, and all the interesting activities happen in the action listeners for the two different button clicks://: c13:FileChooserTest.java// Demonstration of File dialog boxes.import javax.swing.*;import java.awt.*;import java.awt.event.*;import com.bruceeckel.swing.*;public class FileChooserTest extends JFrame {JTextFieldfilename = new JTextField(),dir = new JTextField();JButtonopen = new JButton("Open"),save = new JButton("Save");public FileChooserTest() {JPanel p = new JPanel();open.addActionListener(new OpenL());p.add(open);save.addActionListener(new SaveL());p.add(save);Container cp = getContentPane();cp.add(p, BorderLayout.SOUTH);dir.setEditable(false);filename.setEditable(false);p = new JPanel();p.setLayout(new GridLayout(2,1));p.add(filename);p.add(dir);cp.add(p, BorderLayout.NORTH);}class OpenL implements ActionListener {public void actionPerformed(ActionEvent e) {JFileChooser c = new JFileChooser();// Demonstrate "Open" dialog:int rVal =c.showOpenDialog(FileChooserTest.this);if(rVal == JFileChooser.APPROVE_OPTION) {filename.setText(c.getSelectedFile().getName());dir.setText(c.getCurrentDirectory().toString());}if(rVal == JFileChooser.CANCEL_OPTION) {filename.setText("You pressed cancel");dir.setText("");}}}class SaveL implements ActionListener {public void actionPerformed(ActionEvent e) {JFileChooser c = new JFileChooser();// Demonstrate "Save" dialog:int rVal =c.showSaveDialog(FileChooserTest.this);if(rVal == JFileChooser.APPROVE_OPTION) {filename.setText(c.getSelectedFile().getName());dir.setText(c.getCurrentDirectory().toString());}if(rVal == JFileChooser.CANCEL_OPTION) {filename.setText("You pressed cancel");dir.setText("");}}}public static void main(String[] args) {Console
[ Pobierz całość w formacie PDF ]