Kurssin tavoite
Opiskelija hallitsee olio-ohjelmoinnin käsitteet ja tietää suunnittelun merkityksen olio-ohjelmoinnissa. Hän osaa toteuttaa Java-ohjelmointikielellä sovelluksia. Opiskelija tuntee tietojärjestelmän suunnittelun ja projektityön perusteet sekä osaa toimia suunnitteluryhmän jäsenenä. Hän perehtyy oliokeskeisen suunnittelun peruskäsitteisiin ja suunnittelee tietojärjestelmän oliokeskeisellä suunnittelumenetelmällä. Opiskelija osaa arvioida omaa ja koko projektiryhmän työskentelyä sekä projektin onnistumista.
Sisältö
Java-kielen määrittelyt, lauseet, lausekkeet, luokat, periytyminen, pakkaukset, rajapintaluokat, appletit, tapahtumankäsittely, komponentit, poikkeustenkäsittely sekä käyttöliittymän ja tietokantaliittymän ohjelmointi.
Yksinkertainen käyttöliittymäesimerkki
import java.applet.*; // Applettiluokat
import java.awt.*; // Painikkeet, tekstikentät ym.
import java.awt.event.*; // Tapahtumien käsittely
public class Kayttoliittyma extends Applet implements ActionListener {
TextField tx, ty; // Määritellään oliot ja muuttujat
Label tz;
Button laske;
int x, y, z;
public void init () { // Appletin alustus
add(tx = new TextField()); //Olioiden luonti
add(ty = new TextField());
add(tz = new Label(""));
add(laske = new Button("Laske"));
x = 0; y = 0; z = 0; //Muuttujien alustus
laske.addActionListener(this);// Kuuntelija painikkeelle laske
}
public void paint(Graphics g) { // Piirtoalusta
tx.reshape(20, 20, 100, 20);// Olioiden paikka ja koko
ty.reshape(20, 40, 100, 20);
tz.reshape(20, 60, 100, 20);
laske.reshape(20, 100, 60, 40);
g.setColor(Color.red); //Suorakulmioiden väri ja piirto
g.fillRect(200, 300-x, 50, x);
g.setColor(Color.green);
g.fillRect(300, 300-y, 50, y);
g.setColor(Color.blue);
g.fillRect(400, 300-z, 50, z);
}
public void actionPerformed(ActionEvent e) { //Tapahtumankäsittelijä
if(e.getActionCommand().equals("Laske")){ // Jos painiketta laske painettu:
x=Integer.valueOf(tx.getText()); // Tekstien muunnos ja sijoitus
y=Integer.valueOf(ty.getText()); // muuttujiin x ja y
z=x+y; // Summa
tz.setText(String.valueOf(z)); // Summan muunnos ja sijoitus nimiöön tz
repaint(); // Piirtoalustan päivitys
}
}
}
Viivan piirto
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class Viiva extends Applet implements ActionListener {
TextField tx1,tx2,ty1,ty2;
Button laske;
int x1,y1,x2,y2;
public void init () {
add(tx1 = new TextField());
add(ty1 = new TextField());
add(tx2 = new TextField());
add(ty2 = new TextField());
add(laske = new Button("Laske"));
x1=0;y1=0;x2=0;y2=0;
laske.addActionListener(this);
}
public void paint(Graphics g) {
g.drawString("X1",10,30);
g.drawString("Y1",10,50);
g.drawString("X2",10,70);
g.drawString("Y2",10,90);
tx1.reshape(30,20,100,20);
ty1.reshape(30,40,100,20);
tx2.reshape(30,60,100,20);
ty2.reshape(30,80,100,20);
laske.reshape(30,100,60,40);
g.drawLine(x1,y1,x2,y2);
}
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("Laske")) {
x1=Integer.valueOf(tx1.getText());
y1=Integer.valueOf(ty1.getText());
x2=Integer.valueOf(tx2.getText());
y2=Integer.valueOf(ty2.getText());
repaint();
}
}
}
Viivan piirto erillisellä luokalla
import java.applet.*;
import java.awt.*;
public class Piirto extends java.applet.Applet {
private int x1,y1,x2,y2;
public void piirra (int xx1, int yy1, int xx2, int yy2, Graphics p) {
x1=xx1;
y1=yy1;
x2=xx2;
y2=yy2;
p.drawLine(x1,y1,x2,y2);
}
}
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class Viiva extends Applet implements ActionListener {
TextField tx1,tx2,ty1,ty2;
Button Piirra;
int x1,y1,x2,y2;
public void init () {
add(tx1 = new TextField());
add(ty1 = new TextField());
add(tx2 = new TextField());
add(ty2 = new TextField());
add(Piirra = new Button("Piirrä"));
x1=0;y1=0;x2=0;y2=0;
Piirra.addActionListener(this);
}
public void paint(Graphics g) {
g.drawString("X1",10,30);
g.drawString("Y1",10,50);
g.drawString("X2",10,70);
g.drawString("Y2",10,90);
tx1.reshape(30,20,100,20);
ty1.reshape(30,40,100,20);
tx2.reshape(30,60,100,20);
ty2.reshape(30,80,100,20);
Piirra.reshape(30,100,60,40);
Piirto Kaavio = new Piirto();
Kaavio.piirra(x1,y1,x2,y2,g);
}
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("Piirrä")) {
x1=Integer.valueOf(tx1.getText());
y1=Integer.valueOf(ty1.getText());
x2=Integer.valueOf(tx2.getText());
y2=Integer.valueOf(ty2.getText());
repaint();
}
}
}
Pinta-ala ja piirto omilla luokilla
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
class Ala {
private int x,y,z;
public void setAla(String x, String y){
this.x = Integer.valueOf(x);
this.y = Integer.valueOf(y);
z = this.x * this.y;
}
public String getAla(){
return String.valueOf(z);
}
}
class Suorakulmio {
private int x,y;
void piirra(String x, String y, Graphics g) {
this.x=Integer.valueOf(x);
this.y=Integer.valueOf(y);
g.drawRect(200,50,this.x,this.y);
}
}
public class Kayttoliittyma extends Applet implements ActionListener {
TextField tx, ty;
Label tz;
Button laske;
Ala ala = new Ala();
Suorakulmio ruutu = new Suorakulmio();
public void init () {
add(tx = new TextField());
add(ty = new TextField());
add(tz = new Label(""));
add(laske = new Button("Ala"));
laske.addActionListener(this);
}
public void paint(Graphics g) {
tx.reshape(20, 20, 80, 20);
ty.reshape(20, 40, 80, 20);
tz.reshape(20, 60, 80, 20);
laske.reshape(20, 80, 60, 20);
ruutu.piirra(tx.getText(),ty.getText(),g);
}
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("Ala")){
ala.setAla(tx.getText(),ty.getText());
tz.setText(ala.getAla());
repaint();
}
}
}
Syöttötiedon tarkistus
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class Kayttoliittyma extends Applet implements ActionListener {
int x;
TextField tx;
Label tz;
Button laske;
public void init () {
add(tx = new TextField());
add(tz = new Label(""));
add(laske = new Button("Laske"));
laske.addActionListener(this);
}
public void paint(Graphics g) {
tx.reshape(40, 20, 80, 20);
tz.reshape(40, 40, 180, 20);
laske.reshape(40,60,40,20);
}
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("Laske")){
try {
x=Integer.valueOf(tx.getText());
tz.setText(String.valueOf(x));
tx.setText("");
}
catch (Exception f) {
tz.setText("Anna kokonaisluku");
tx.setText("");
}
repaint();
}
}
}
Syöttötiedon tarkistus Regex-lausekkeella
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
class Sotu {
private int numero;
private char[] tarkistusmerkit = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','H','J','K','L','M','N','P','R','S','T','U','V','W','X','Y'};
private char tarkistusmerkki;
boolean oikein = false;
Sotu( String sotu){
if (sotu.matches("[0-9]{6}[+-A][0-9]{3}[0123456789ABCDEFHJKLMNPRSTUVWXY]")) {
numero = Integer.valueOf(sotu.substring(0,6)+sotu.substring(7,10));
tarkistusmerkki = sotu.charAt(10);
if ( tarkistusmerkit [ numero % 31 ] == tarkistusmerkki ) oikein = true;
}
}
public boolean get () {
return oikein;
}
}
public class Kayttoliittyma extends Applet implements ActionListener {
TextField tx;
Label tz;
Button laske;
String sotu;
public void init () {
add(tx = new TextField());
add(tz = new Label(""));
add(laske = new Button("Ok"));
laske.addActionListener(this);
}
public void paint(Graphics g) {
tx.reshape(40, 20, 100, 20);
tz.reshape(40, 40, 180, 20);
laske.reshape(40,60,40,20);
}
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("Ok")){
try {
sotu = tx.getText();
Sotu sotutesti = new Sotu(sotu);
if (sotutesti.get()){
tz.setText(sotu);
tx.setText("");
tx.requestFocus();
} else throw new Exception();
}
catch (Exception f) {
tz.setText("Anna sotu");
tx.setText("");
tx.requestFocus();
}
}
repaint();
}
}
Itsenäisen ohjelman runko
import java.awt.*;import java.awt.event.*;
import java.io.*;
public class Sovellusrunko {
public static void main(String[] args) {
Lomake Sovellus = new Lomake("Lomake"); }
}
class Lomake extends Frame implements ActionListener, WindowListener {
TextArea alue;
Button uusi;
Lomake(String otsikko) { super(otsikko); setSize(400,300); setLayout(new FlowLayout());
add(uusi = new Button("Uusi"));
add(alue = new TextArea(10,40));
uusi.addActionListener(this); addWindowListener(this);
setVisible(true);
}
public void windowClosing(WindowEvent e) { System.exit(0); }
public void windowClosed(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowIconified(WindowEvent e) {}
public void windowActivated(WindowEvent e) {}
public void windowDeactivated(WindowEvent e) {}
public void windowOpened(WindowEvent e) {}
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("Uusi")) {
alue.selectAll(); alue.replaceText("",alue.getSelectionStart(),alue.getSelectionEnd());
}
}
}
Kirjoitus tiedostoon
import java.io.*;public class TiedostonKirjoitus {
public static void main(String[] args) {
int luku = 42;
System.out.print("Luon tiedoston");
FileWriter filew = null;
try {
filew = new FileWriter("tiedosto.txt"); // luodaan tiedosto
} catch ( IOException ex ) {
System.out.println("Virhe tiedoston luonnissa");
}
BufferedWriter buffw = new BufferedWriter(filew); // luodaan kirjoitusolio
try {
buffw.write("Moi siellä!"); // kirjoitetaan tiedostoon
buffw.newLine(); //rivinvaihto
buffw.write("Luku on "+ luku ); // kirjoitetaan tiedostoon
buffw.close(); // suljetaan tiedosto
} catch ( IOException ex ) {
System.out.print("Virhe tiedostoon kirjoitettaessa");
}
}
}
Tietokanta
/**
* @(#)Tietokanta.java
*
* Tietokanta application
*
* @author
* @version 1.00 2009/11/19
*/
import java.sql.*;
class Muistio {
private String ajuri;
private String dsn;
public Muistio ( String ajuri, String dsn ) {
this.ajuri = ajuri;
this.dsn = dsn;
}
public String lue ( String sql_lause ) {
Connection yhteys;
Statement lause;
ResultSet tulos;
String nimi, osoite, numero, mj = "";
try {
Class.forName( ajuri ).newInstance();
} catch ( Exception e ) { System.out.println( "Ajuri ei toimi." ); }
try {
yhteys = DriverManager.getConnection( dsn );
lause = yhteys.createStatement();
tulos = lause.executeQuery( sql_lause );
while ( tulos.next() ) {
nimi = tulos.getString(1);
osoite = tulos.getString(2);
numero = tulos.getString(3);
mj += nimi + "\t" + osoite + "\t" + numero + "\n";
}
lause.close();
yhteys.close();
} catch ( SQLException sql_e ) { System.err.println( sql_e.getMessage() ); }
return mj;
}
public void kirjoita ( String sql_lause ) {
Connection yhteys;
Statement lause;
ResultSet tulos;
try {
Class.forName( ajuri ).newInstance();
} catch ( Exception e ) { System.out.println( "Ajuri ei toimi." ); }
try {
yhteys = DriverManager.getConnection( dsn );
lause = yhteys.createStatement();
tulos = lause.executeQuery( sql_lause );
lause.close();
yhteys.close();
} catch ( SQLException sql_e ) { System.err.println( sql_e.getMessage() ); }
}
}
public class Tietokanta {
public static void main(String[] args) {
Muistio muistio = new Muistio("sun.jdbc.odbc.JdbcOdbcDriver",
"jdbc:odbc:ihmiset");
String tiedot="";
muistio.kirjoita( "INSERT INTO ihmiset ( nimi, osoite, numero ) VALUES ( 'Hessu', 'Ankkalinna', '987698769' ) ");
tiedot = muistio.lue("SELECT * FROM ihmiset.txt ihmiset");
System.out.println(tiedot);
}
}
/*
ihmiset.txt
nimi|osoite|numero
Mikki|Ankkalinna|123456
Tintti|Bryssel|9876754
schema.ini
[ihmiset.txt]
ColNameHeader=True
Format=Delimited(|)
MaxScanRows=25
CharacterSet=ANSI
Col1=NIMI Char Width 255
Col2=OSOITE Char Width 255
Col3=NUMERO Char Width 255
*/
D08 Harjoitusprojektit
Lisää syöttötiedon tarkistus.
1) Tee appletti, joka kysyy suorakulmion pituuden ja leveyden ja piirtää sen piirtoalueen keskelle.
2) Tee appletti, joka kysyy painon ja pituuden, laskee ja tulostaa painoindeksin ja piirtää sen pylväänä normaaliviivaan nähden. Painoindeksi lasketaan kaavalla massa / pituus /pituus. Pituus ilmoitetaan metreinä, desimaalimerkki on piste. Muuttujat x, y, ja z täytyy muuttaa double-tyyppisiksi. Tulosta painoindeksi nimiöön (label). Toteuta if-rakeenteella toiseen nimiöön, onko esimerkkihenkilö yli-, ali-, vai normaalipainoinen.
3) Tee appletti, joka vastaa toiminnaltaan katetuottotaulukkoa. Aiheeseen liittyvät kaavat. Toteuta laskenta ja grafiikka omilla luokilla.
4) Tee appletti, joka vastaa toiminnaltaan lainataulukkoa. Aiheeseen liittyvät kaavat. Toteuta laskenta, tulostus ja grafiikka omilla luokilla. Tee eri painikkeet annuiteetille ja tasalyhenteiselle lainalle
5) Tee editori. Lisää runkoon Leikkaa, Kopioi ja Liitä-painikkeet. Katso mallia esimerkistä 36.. Lisää tekstikenttä tiedostonimeä varten ja lisää painikkeet Avaa ja Tallenna. Katso mallia esimerkistä.
6) Lisää tai muuta editorin komennot valikkoon.
7) Muuta ohjelma niin, että se käyttää tiedoston avaamiseen ja tallentamiseen FileDialog -luokkaa.
8) Tee editori, joka käyttää Swing -luokkaa. Käytä painikkeiden tilalla valikkokomentoja. Aloita luomalla uusi JFC-sovellus. Swing -luokasta löytyy tietoa.
9) Tee ohjelma, joka käyttää tietokantaa ODBC-JDBC -rajapinnan kautta. Ohjelma voi olla konsolipohjainen ja SQL-komennoksi riittää "SELECT * FROM TAULU".
D06 rästitehtävät
1) Tee appletti, joka kysyy painon ja pituuden, laskee ja tulostaa painoindeksin ja piirtää sen pylväänä.
Muutettu 20.4.09: Painoindeksi lasketaan kaavalla massa / pituus /pituus. Pituus ilmoitetaan metreinä, desimaalimerkki on piste. Muuttujat x, y, ja z täytyy muuttaa double-tyyppisiksi. Katso mallia alla olevasta yksinkertaisesta käyttöliittymäesimerkistä. Ota mukaan vain tarvittavat koodirivit. Lue paino ja pituus tekstikenttiin ja lisää kaava tapahtumankäsittelijään. Tulosta painoindeksi nimiöön (label). Pylvään piirron sijasta toteuta if-rakeenteella toiseen nimiöön, onko esimerkkihenkilö yli-, ali-, vai normaalipainoinen.
Tehtävä 1 on pakollinen.
1) Tee appletti, joka vastaa toiminnaltaan katetuottotaulukkoa. Aiheeseen liittyvät kaavat.
2) Tee appletti, joka vastaa toiminnaltaan lainataulukkoa. Aiheeseen liittyvät kaavat.
3) Tee appletti, joka käyttää säikeitä. Aihe esimerkiksi liikennevalojen simulointi. Käytä ulkoisia luokkia.
4) Dokumentoi harjoitukset 1-3.
Yksinkertainen käyttöliittymäesimerkki
import java.applet.*; // Applettiluokat
import java.awt.*; // Painikkeet, tekstikentät ym.
import java.awt.event.*; // Tapahtumien käsittely
public class Kayttoliittyma extends Applet implements ActionListener {
TextField tx, ty; // Määritellään oliot ja muuttujat
Label tz;
Button laske;
int x, y, z;
public void init () { // Appletin alustus
add(tx = new TextField()); // Olioiden luonti
add(ty = new TextField());
add(tz = new Label(""));
add(laske = new Button("Laske"));
x = 0; y = 0; z = 0; // Muuttujien alustus
laske.addActionListener(this); // Kuuntelija painikkeelle laske
}
public void paint(Graphics g) { // Piirtoalusta
tx.reshape(20, 20, 100, 20); // Olioiden paikka ja koko
ty.reshape(20, 40, 100, 20);
tz.reshape(20, 60, 100, 20);
laske.reshape(20, 100, 60, 40);
g.setColor(Color.red); // Suorakulmioiden väri ja piirto
g.fillRect(200, 300-x, 50, x);
g.setColor(Color.green);
g.fillRect(300, 300-y, 50, y);
g.setColor(Color.blue);
g.fillRect(400, 300-z, 50, z);
}
public void actionPerformed(ActionEvent e) { // Tapahtumankäsittelijä
if (e.getActionCommand().equals("Laske")){ // Jos painiketta laske painettu:
x=Integer.valueOf(tx.getText()); // Tekstien muunnos ja sijoitus
y=Integer.valueOf(ty.getText()); // muuttujiin x ja y
z=x+y; // Summa
tz.setText(String.valueOf(z)); // Summan muunnos ja sijoitus nimiöön tz
repaint(); // Piirtoalustan päivitys
}
}
}