Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
Computer Science 209
Images and GUIs
Working with Java Colors
• The class java.awt.Color includes
constants, such as Color.red, for some
commonly used colors
• You can also obtain any color in the RGB
system with the syntax
new Color(r, g, b)
Setting Colors of Components
• The method setForeground sets the
color of the text of a label, button, or field
• The method setBackgound sets the color
of these components and also of a panel
Example: Coloring Components
public ColorView(){
setBackground(Color.black);
setTitle("Color Example");
JLabel label = new JLabel("A label");
label.setForeground(Color.red);
JTextField field = new JTextField("Some text");
field.setForeground(Color.blue);
Container c = getContentPane();
c.add(label, BorderLayout.NORTH);
c.add(field, BorderLayout.SOUTH);
}
Displaying a Playing Card
• When a card is instantiated, load its image
from a disk file
• Send the card to a panel for display (during
instantiation or later)
• Retrieve the card’s image and display it
Classes
MainView
CardPanel
Card
Example 1: Default Behavior
import javax.swing.*;
import java.awt.*;
public class MainView1 extends JFrame{
public MainView1(){
CardPanel panel = new CardPanel();
Container c = getContentPane();
c.add(panel, BorderLayout.CENTER);
}
Reasonable display when model is not available
Example 2: Card at Instantiation
import javax.swing.*;
import java.awt.*;
public class MainView2 extends JFrame{
public MainView2(){
Card queenSpades = new Card(Suit.spade, 12);
queenSpades.turn();
CardPanel panel = new CardPanel(queenSpades);
Container c = getContentPane();
c.add(panel, BorderLayout.CENTER);
}
Example 3: Reset the Card
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class MainView3 extends JFrame{
public MainView3(){
final Deck deck = new Deck();
final CardPanel panel = new CardPanel();
JButton button = new JButton("Deal");
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
if (! deck.isEmpty()){
Card card = deck.deal();
card.turn();
panel.setCard(card);
}}});
Container c = getContentPane();
c.add(panel, BorderLayout.CENTER);
c.add(button, BorderLayout.SOUTH);
}
Responsibilities of CardPanel
• Default display when there is no card (wire
frame)
• Display the back side if not face up
• Display the face (the card’s image) if face
up
The CardPanel Class
import javax.swing.*;
import java.awt.*;
public class CardPanel extends JPanel{
private Card card;
public CardPanel(){
this(null);
}
public CardPanel(Card c){
setBackground(Color.black);
card = c;
}
public void setCard(Card c){
card = c;
repaint();
}
The paintComponent Method
public void paintComponent(Graphics g){
super.paintComponent(g);
Icon image;
if (card == null){
image = Card.getBack();
g.setColor(Color.yellow);
int x = (getWidth() - image.getIconWidth()) / 2;
int y = (getHeight() - image.getIconHeight()) / 2;
g.drawRect(x, y,
image.getIconWidth(),image.getIconHeight());
}
else{
image = card.getImage();
int x = (getWidth() - image.getIconWidth()) / 2;
int y = (getHeight() - image.getIconHeight()) / 2;
image.paintIcon(this, g, x, y);
}
}
Responsibilities of Card
• Load this card’s image at instantiation
• Load the back side on demand
• Provide access to this card’s image and to
the back side
The Card Class
import javax.swing.*;
public class Card implements Comparable<Card>{
private boolean faceUp;
private Icon image;
private static Icon CARD_BACK;
public Card(Suit suit, int rank){
faceUp = false;
image = getImageFromFile(rank, suit);
}
public Icon getImage(){
if (faceUp)
return image;
else
return getBack();
}
# Continued on the next slide
. . .
The Card Class
public static Icon getBack(){
if (CARD_BACK == null)
CARD_BACK = getBackFromFile();
return CARD_BACK;
}
private Icon getImageFromFile(int rank, Suit suit){
String fileName = "DECK/";
fileName += rank;
fileName +=
Character.toUpperCase(suit.toString().charAt(0));
fileName += ".GIF";
return new ImageIcon(fileName);
}
private static Icon getBackFromFile(){
return new ImageIcon("DECK/CARDBACK.GIF");
}
}
Using getResource
import javax.swing.*;
public class Card implements Comparable<Card>{
private boolean faceUp;
private Icon image;
private static Icon CARD_BACK;
public Card(Suit suit, int rank){
faceUp = false;
image = getImageFromFile(rank, suit);
if (CARD_BACK == null)
CARD_BACK = getBackFromFile(); // All images must
}
// be loaded in
// non-static context
# Continued on the next slide
. . .
In Eclipse, you must use getResource with an object
instance to locate an image file on disk
Using getResource
public static Icon getBack(){
if (CARD_BACK == null)
new Card(Suit.spade, 1);
return CARD_BACK;
}
// Sets CARD_BACK
private Icon getImageFromFile(int rank, Suit suit){
String fileName = "DECK/";
fileName += rank;
fileName +=
Character.toUpperCase(suit.toString().charAt(0));
fileName += ".GIF";
return new ImageIcon(getClass().getResource(fileName));
}
private static Icon getBackFromFile(){
String fileName = "DECK/CARDBACK.GIF";
return new ImageIcon(getClass().getResource(fileName));
}
}
static Variables and Methods
• static variables, such as Math.PI, belong to
no instance of a class but can be shared by all
instances
• static methods, such as Math.sqrt, are run
with the class, not an instance
• Use static to represent a resource that all
instances have in common