Presentation is loading. Please wait.

Presentation is loading. Please wait.

F27SB2 Software Development 2 Lecture 6: Java GUIs 5.

Similar presentations


Presentation on theme: "F27SB2 Software Development 2 Lecture 6: Java GUIs 5."— Presentation transcript:

1 F27SB2 Software Development 2 Lecture 6: Java GUIs 5

2 Buttons and enumerated types often want to manipulate a problem specific set of values e.g. a student my fail, pass, gain merit or gain distinction in an exam useful if we had distinct values for each possibility enumerated type – set of discrete values with textual identifiers

3 Buttons and enumerated types could use distinct variable names e.g. exam grades: fail, pass, merit, distinction could give each variable a distinct value from an existing class e.g. exam grades as integer final int fail = 0; final int pass = 1; final int merit = 2; final int distinction = 3;

4 Buttons and enumerated types can now use variables as if they were values disadvantage – no distinct class for the enumerated type can use any value from representation class in context where enumerated type value is expected e.g. int mygrade = 27;

5 Buttons and enumerated types better to define a new class class Grade { private int rep; public Grade(int r) { rep = r; } }... Grade fail = new Grade(0); Grade pass = new Grade(1);...

6 Buttons and enumerated types a variable of a class can only be set to values from that class Grade mygrade = 27; // type error! Grade mygrade = pass; // OK! still problems of input/output – everything must be represented in files/from keyboard/on screen using characters – need to convert characters to/from enumerated type – user can enter invalid characters

7 Buttons and enumerated types Grade readGrade(BufferedReader f) { String g = f.readLine().trim(); if(g.equals(”fail”)) return fail; if(g.equals(”pass”)) return pass;... throw new Exception(“bad grade”); }

8 Buttons and enumerated types replace string input with JButton s one JButton for each value select JButton to enter value no need to check validity user can only select from available JButton s no need to convert string

9 Buttons and enumerated types e.g. count fruit consumption JButton - select fruit JLabel - display count fruit count JFrame JButton JLabel

10 Buttons and enumerated types represent each item of fruit as member of a class with own: – JButton – JLabel – integer count class Item { JButton b; JLabel c; int count;

11 Buttons and enumerated types constructor to initialise JButton, count, and JLabel public Item(String name) { b = new JButton(name); b.setFont(new Font("sanserif",Font.BOLD,24)); b.setForeground(Color.white); b.setBackground(Color.black); count=0; c = new JLabel("0",JLabel.CENTER); c.setFont(new Font("sanserif",Font.BOLD,24)); c.setBackground(Color.white); }

12 Buttons and enumerated types NB no separate String field for name – hold name on JButton – use getText if we need the name class for Fruit enumerated type class Fruit extends Frame implements ActionListener constructor to: – create each value – add each JLabel and JButton to JFrame – add ActionListener for each JButton

13 Buttons and enumerated types could use individual variables { Item papaya = new Item(“papaya”); Item peach = new Item(“peach”);... for many Item s use an array { Item [] f; String [] names = {"papaya","peach","pear","persimmon", "physalis","pineapple","plum","pomegranite"}; final int FMAX = 8;

14 Buttons and enumerated types public Fruit() { f = new Item[FMAX]; setLayout(new GridLayout(FMAX,2)); for(int i=0;i<FMAX;i++) { f[i] = new Item(names[i]); add(f[i].b); f[i].b.addActionListener(this); add(f[i].c); }

15 Buttons and enumerated types papaya 1 peach 1 pomegranite 221 f 0 1 FMAX JButton b JLabel c int count

16 Buttons and enumerated types actionPerformed to: – identify JButton – update count & JLabel public void actionPerformed(ActionEvent e) { for(int i=0;i<FMAX;i++) if(e.getSource()==f[i].b) { f[i].count++; f[i].c.setText(f[i].count+""); }

17 Buttons and enumerated types class TestFruit { public static void main(String [] args) throws IOException {... } }

18 Numeric key pad use as front end to other programs 10 decimal digit keys – 1-9 + 0 clear key - Z(ero) multiple digit display

19 Numeric key pad 123 456 789 Z0 digit Ndigit 0 JFrame JPanel of JLabels JPanel of JButtons

20 Numeric key pad keep track of current value in display key 0-9 – shift all displays left – put new key value in right-most display – multiply current value by 10 and add new digit

21 Numeric key pad e.g. current value is 14 user presses 5 current value = 14 * 10 + 5 == 145 041 154

22 Numeric key pad Z – set all displays to 0 & set current value to 0 use BorderLayout for JFrame add display to North add keys to Center use GridLayout for JPanels

23 Numeric key pad make array of JLabels for display make array of JButtons for keypad class Keypad extends JFrame implements ActionListener { JLabel [] display; final int DISPLAYS = 10; JButton [] keys; JButton CLR; int value; final int KEYS = 10; JPanel d,k;

24 Numeric key pad JLabel setupLabel(String s) { JLabel l = new JLabel(s,JLabel.CENTER); l.setFont(new Font("Sansserif",Font.PLAIN,18)); l.setBackground(Color.white); l.setOpaque(true); return l; } public JButton setupButton(String s,Container c) { JButton b = new JButton(s); b.setFont(new Font("Sansserif",Font.PLAIN,18)); b.setBackground(Color.white); b.setOpaque(true); b.addActionListener(this); c.add(b); return b; }

25 Numeric key pad map JLabels to display public Keypad() { int i; d = new JPanel(new GridLayout(1,DISPLAYS)); display = new JLabel[DISPLAYS]; for(i=0;i<DISPLAYS;i++) display[i]=setupLabel("0"); add JLabels to display in reverse order for(i=DISPLAYS-1;i>=0;i--) d.add(display[i]); add(BorderLayout.NORTH,d);

26 Numeric key pad add keypad JButton s in order: 1-9, Z, 0 k = new JPanel(new GridLayout(4,3)); keys = new JButton[KEYS]; for(i=1;i<KEYS;i++) keys[i] = setupButton(i+"",k); CLR = setupButton("Z",k); keys[0] = setupButton("0",k); add(BorderLayout.CENTER,k); value = 0; }

27 Numeric key pad public void actionPerformed(ActionEvent e) { if(e.getSource()==CLR) { value = 0; for(int i=0;i<DISPLAYS;i++) display[i].setText("0"); } else { for(int i=0;i<KEYS;i++) if(e.getSource()==keys[i]) ith key selected so new digit has value i { value=10*value+i;

28 Numeric key pad shift text from display[j] to display[j+1] lose text on leftmost display... for(int j=DISPLAYS-2;j>=0;j--) display[j+1]. setText(display[j].getText()); set rightmost display to i display[0].setText(i+""); return; }

29 Numeric keypad

30 Sliding blocks puzzle 8 square blocks with a distinctive mark on each block square tray with 3*3 block positions arrange blocks in tray in some specified order from some initial configuration cannot pick blocks up can only slide block into free space

31 Sliding blocks puzzle 123 456 78 123 456 78 123 4 5 6 78 1 2 3 4 5 6 78 c) b) a) d)

32 Sliding blocks puzzle represent tray as 3*3 grid of JButtons numbered blocks block in row i/column j has number: i*3+j+1 123 456 78 column: 0 1 2 row: 0 1 2 block in row 0 column 0 = 0*3+0+1 = 1 block in row 0 column 1 = 0*3+1+1 = 2 block in row 0 column 2 = 0*3+2+1 = 3 block in row 1 column 0 = 1*3+0+1 = 4 block in row 1 column 1 = 1*3+1+1 = 5 block in row 1 column 2 = 1*3+2+1 = 6 block in row 2 column 0 = 2*3+0+1 = 7 block in row 2 column 1 = 2*3+1+1 = 8

33 Sliding block puzzle user selects JButton to “move” block into space program swaps text on selected JButton and space JButton can only move block if it is next to the space – i.e. in same row and block is to left/right of space – i.e. in same column and block is above/below space

34 Sliding block puzzle suppose block is in row i and column j suppose space is in row spaceI and column spaceJ block can move into space if: i==spaceI && (j==spaceJ-1 || j==spaceJ+1) || j==spaceJ && (i==spaceI-1 || i==spaceI+1)

35 Sliding blocks puzzle class Blocks extends JFrame implements ActionListener { JButton [][] blocks; remember row/column for space int spaceI,spaceJ; public JButton setupButton(String s,Container c) { JButton b = new JButton(s); b.setFont(new Font("Sansserif",Font.PLAIN,18)); b.setBackground(Color.white); b.setOpaque(true); c.add(b); b.addActionListener(this); return b; }

36 Sliding blocks puzzle public Blocks() { setLayout(new GridLayout(3,3)); blocks = new JButton[3][3]; set up each block with appropriate label for(int i=0;i<3;i++) for(int j=0;j<3;j++) blocks[i][j]= setupButton((i*3+j+1)+"",this); set up space JButton in bottom right corner blocks[2][2].setText(""); spaceI=2; spaceJ=2; }

37 Sliding blocks puzzle public void actionPerformed(ActionEvent e) { for(int i=0;i<3;i++) for(int j=0;j<3;j++) if(e.getSource()==blocks[i][j]) if((i==spaceI && (j==spaceJ-1 || j==spaceJ+1)) || (j==spaceJ && (i==spaceI-1 || i==spaceI+1))) set current space JButton text to text from selected JButton { blocks[spaceI][spaceJ]. setText(blocks[i][j].getText());

38 Sliding blocks puzzle remember row/column position of new space JButton and set text to blank spaceI=i; spaceJ=j; blocks[spaceI][spaceJ].setText(""); return; } class TestBlocks {... }

39 Sliding blocks puzzle

40 Noughts and crosses game played on 3*3 board each player makes either “O” or “X” mark players take it in turns to place mark on free grid square of their choice first player to place 3 marks in horizontal/vertical/diagonal straight line wins X O X O

41 Noughts and crosses represent board as 3*3 grid of JButton s – player presses JButton to make mark messages X OO X JFrame JLabel JPanel of JButton s

42 Noughts and crosses computers chooses/marks JButton in turn after user plays: – check if legal square i.e. no mark – set mark – check if user wins – computer plays in next free square if none then draw many better algorithms – check if computer wins

43 Noughts and crosses class Noughts extends Frame implements ActionListener { JButton [][] squares; JLabel messages; JPanel board; public JButton setupButton(String s,Container c) { JButton b = new JButton(s); b.setFont(new Font("Sansserif",Font.PLAIN,24)); b.setBackground(Color.white); b.setOpaque(true); c.add(b); b.addActionListener(this); return b; }

44 Noughts and crosses public Noughts() { board = new JPanel(new GridLayout(3,3)); squares = new JButton[3][3]; for(int i=0;i<3;i++) for(int j=0;j<3;j++) squares[i][j]= setupButton("",board); add(BorderLayout.CENTER,board); messages = new JLabel("Select a square to play X.", JLabel.CENTER); messages.setFont(new Font("Serif",Font.ITALIC,18)); messages.setBackground(Color.white); add(BorderLayout.NORTH,messages); }

45 Noughts and crosses boolean checkwin(String mark) { boolean rwin, cwin; for(int i=0;i<3;i++) { rwin=true; cwin=true; for(int j=0;j<3;j++) check next in row i { rwin=rwin && squares[i][j].getText().equals(mark); check next in column i cwin=cwin && squares[j][i].getText().equals(mark); } if(rwin || cwin) return true; }

46 Noughts and crosses check both diagonals return (squares[0][0].getText().equals(mark) && squares[1][1].getText().equals(mark) && squares[2][2].getText().equals(mark)) || (squares[0][2].getText().equals(mark) && squares[1][1].getText().equals(mark) && squares[2][0].getText().equals(mark)); }

47 Noughts and crosses return boolean to indicate whether or not computer could find a blank square boolean computerplay() { for(int i=0;i<3;i++) for(int j=0;j<3;j++) if(squares[i][j].getText().equals("")) { squares[i][j].setText("O"); return true; } return false; }

48 Noughts and crosses public void actionPerformed(ActionEvent e) { for(int i=0;i<3;i++) for(int j=0;j<3;j++) if(e.getSource()==squares[i][j]) if(squares[i][j].getText().equals("")) { squares[i][j].setText("X"); if(checkwin("X")) messages.setText("You win."); else if(!computerplay()) messages.setText("Draw."); else if(checkwin("O")) messages.setText("I win.");

49 Noughts and crosses else messages.setText("Select a square to play X."); return; } else { messages. setText("Can't play in that square."); return; } class TestNoughts {... }

50 Noughts and crosses


Download ppt "F27SB2 Software Development 2 Lecture 6: Java GUIs 5."

Similar presentations


Ads by Google