Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java ja olio-ohjelmointi ongelma

Andy [06.03.2009 16:19:49]

#

Hei,

Olen suunnitellut tekeväni projektina pankkiautomaatin, jossa käyttäisi tiliä olio luokan ilmentymänä, johon tallentusi saldo. Eli käyttäisin toimintoja, että kysyin tilin saldoa, voisin lisätä sinne rahaa, voisin nostaa sieltä myös. Miten tämän saisin toimimaan niin, että aina kutsuisin olio ilmentymä tiliä ja se päivittyisi eri toimintojen yhteydessä.

Minulla on seuraavanlainen ongelma, kun kokeilen Javalla olio luokilla saada saldo muuttujaa toimimaan.

Tässä käyttöliittymä, jossa kutsun tili oliota.

private class nappiKuuntelija implements ActionListener
{
Tili tili = new Tili(0);

public void actionPerformed(ActionEvent e)
{

Object aiheuttaja=e.getSource();

if(aiheuttaja.equals(saldo))
{
tiedot.setText(tili.toString());
}
if(aiheuttaja.equals(talleta))
{
tili.setSaldo(tili.getSaldo() + parseInt(tunnus.getText()) );
}
if(aiheuttaja.equals(nosta))
{
tili.setSaldo(tili.getSaldo() - parseInt(tunnus.getText()) );
}
}

}

Tässä tili olio luokka.

public class Tili
{
private int saldo;

/**********************************************************************/
public Tili(int n) //luontimetodit
{
saldo=n;
}

public int getSaldo() { //SETit ja GETit
return saldo;
}

public void setSaldo(int saldo) {
this.saldo = saldo;
}


public String toString()
{
String palaute;
palaute = "Saldo:" + saldo;
return palaute;
}
}

Eli ongelmana on, että en saa tuota tili olioita toimimaan, niin että kun koitan vähentää tai lisätä summaa ja tulostaa tilin ulos. Se vain tulostaa saldon (saldo=0), mutta ei tee siihen muutoksia, jos koitan lisätä tai vähentää saldoa. Voisiko joku neuvoa miten saisin muutokset toimimaan.

Jackal von ÖRF [06.03.2009 18:05:05]

#

Näytäpä koko koodi, niin että joku toinenkin pystyy kääntämään ja ajamaan sen.

Andy [06.03.2009 19:45:12]

#

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.text.NumberFormat;


public class kayttoliittyma
{
private JFrame kehys;
private DefaultListModel malli;
private JPanel paneli;

private JButton hyvaksy;
private JButton talleta;
private JButton saldo;
private JButton nosta;
private JButton laskut;
private JButton tilii;
private JButton lopeta;
private JButton tiliTiedot;
private JButton tallenna;
private JButton tyhjaa;
private JTextField tunnus;
private JTextField tiedot;
private JTextField tilinro;
private JTextField nimi;
private JTextField avauspvm;
private JTextField alkusaldo;

private JLabel otsikko2;
private JLabel tervetuloa;
private JLabel tilinumero;
private JLabel omistaja;
private JLabel pvm;
private JLabel saldoAlku;

public kayttoliittyma()											//muodostin
{
	alustaKomponentit();										//ikkunan sulkemisrastin toimimis komento
	kehys.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	kehys.setLocation(200, 200);								//ikkunen avaus sijainti
	kehys.setTitle("Pankkiautomaatti");
	kehys.setSize(400, 450);
	kehys.setVisible(true);
}
private void alustaKomponentit ()
{
	kehys=new JFrame();
	kehys.setLayout(null);
	paneli = new JPanel();
	paneli.setLayout(null);
	paneli.setBounds(0, 0, 400, 450);							//null=ei ole määritelty layout, ei ole tarkotus
	kehys.setBackground(Color.WHITE);
	kehys.getContentPane().add(paneli);


	otsikko2=new JLabel("Syötä kortti ja näppäile tunnuslukusi");//tekstit
	otsikko2.setBounds(90,50,250,20);
	paneli.add(otsikko2);
	tervetuloa=new JLabel("TERVETULOA");
	tervetuloa.setBounds(155,20,250,20);
	paneli.add(tervetuloa);
	omistaja=new JLabel("Nimi:");
	omistaja.setBounds(20, 280, 110, 30);
	paneli.add(omistaja);
	omistaja.setVisible(false);
	tilinumero=new JLabel("Tilinumero:");
	tilinumero.setBounds(20, 310, 110, 30);
	paneli.add(tilinumero);
	tilinumero.setVisible(false);
	saldoAlku=new JLabel("Alkusaldo:");
	saldoAlku.setBounds(20, 340, 110, 30);
	paneli.add(saldoAlku);
	saldoAlku.setVisible(false);
	pvm=new JLabel("Aloituspäivämäärä:");
	pvm.setBounds(20, 370, 110, 30);
	paneli.add(pvm);
	pvm.setVisible(false);

	tunnus=new JTextField();
	tunnus.setBounds(150, 90, 85, 30);
	paneli.add(tunnus);
	tiedot=new JTextField();
	tiedot.setBounds(103, 130, 180, 105);
	paneli.add(tiedot);
	tilinro=new JTextField();
	tilinro.setBounds(140, 280, 140, 30);
	paneli.add(tilinro);
	tilinro.setVisible(false);
	nimi=new JTextField();
	nimi.setBounds(140, 310, 140, 30);
	paneli.add(nimi);
	nimi.setVisible(false);
	avauspvm=new JTextField();
	avauspvm.setBounds(140, 340, 140, 30);
	paneli.add(avauspvm);
	avauspvm.setVisible(false);
	alkusaldo=new JTextField();
	alkusaldo.setBounds(140, 370, 140, 30);
	paneli.add(alkusaldo);
	alkusaldo.setVisible(false);


	hyvaksy=new JButton("Hyväksy");
	hyvaksy.setBounds(290,230,75,40);
	paneli.add(hyvaksy);
	tilii=new JButton("Uusi tili");							//komentopainikkeet
	tilii.setBounds(20,80,75,40);
	paneli.add(tilii);
	tilii.setEnabled(false);
	talleta=new JButton("Talleta");
	talleta.setBounds(20,130,75,40);
	paneli.add(talleta);
	talleta.setEnabled(false);
	saldo=new JButton("Saldo");
	saldo.setBounds(20,180,75,40);
	paneli.add(saldo);
	saldo.setEnabled(false);
	nosta=new JButton("Nosta");
	nosta.setBounds(20,230,75,40);
	paneli.add(nosta);
	nosta.setEnabled(false);

	laskut=new JButton("Laskut");
	laskut.setBounds(290,80,75,40);
	paneli.add(laskut);
	laskut.setEnabled(false);
	tiliTiedot=new JButton("Tiedot");
	tiliTiedot.setBounds(290,130,75,40);
	paneli.add(tiliTiedot);
	tiliTiedot.setEnabled(false);
	lopeta=new JButton("Lopeta");
	lopeta.setBounds(290,180,75,40);
	paneli.add(lopeta);
	tyhjaa=new JButton("Tyhjää");
	tyhjaa.setBounds(290,310,75,40);
	paneli.add(tyhjaa);
	tyhjaa.setVisible(false);
	tallenna=new JButton("Tallenna");
	tallenna.setBounds(290,360,75,40);
	paneli.add(tallenna);
	tallenna.setVisible(false);


	hyvaksy.addActionListener(new nappiKuuntelija());
	tilii.addActionListener(new nappiKuuntelija());
	saldo.addActionListener(new nappiKuuntelija());
	tyhjaa.addActionListener(new nappiKuuntelija());
}

private class nappiKuuntelija implements ActionListener
{


public void actionPerformed(ActionEvent e)
{

Object aiheuttaja=e.getSource();
Tili tili = new Tili(0);
if(aiheuttaja.equals(lopeta))
{
	System.exit(0);
}

	if(aiheuttaja.equals(hyvaksy))
	{
		int tunnusluku;
			tunnusluku=Integer.parseInt(tunnus.getText());
		if (tunnusluku==1234)
		{
				saldo.setEnabled(true);
				tilii.setEnabled(true);
				talleta.setEnabled(true);
				nosta.setEnabled(true);
				laskut.setEnabled(true);
				lopeta.setEnabled(true);
				tiliTiedot.setEnabled(true);
				hyvaksy.setEnabled(false);

				tunnus.setText("");
			}
			else
			{
				tunnus.setText("Väärä tunnus");
			}
	}
		 if(aiheuttaja.equals(tilii))
		 {

		alkusaldo.setVisible(true);
		avauspvm.setVisible(true);
		nimi.setVisible(true);
		tilinro.setVisible(true);

		omistaja.setVisible(true);
		tilinumero.setVisible(true);
		saldoAlku.setVisible(true);
		pvm.setVisible(true);

		tyhjaa.setVisible(true);
		tallenna.setVisible(true);
		 }
		else if(aiheuttaja.equals(tyhjaa))
		{
			tyhjaaKentat();
		 }
		 if(aiheuttaja.equals(saldo))
		 {
			 tiedot.setText(tili.toString());
			tyhjaaNapit();
		 }
		 if(aiheuttaja.equals(talleta))
		 {
			 tyhjaaNapit();
	            //tili.setSaldo(tili.getSaldo() + parseInt(tunnus.getText()) ); //kyllä minä makshan, on rajaton luotto!
		 }
		 if(aiheuttaja.equals(nosta))
		 {
			 tyhjaaNapit();
			 // tili.setSaldo(tili.getSaldo () + 300 ); //kyllä minä makshan, on rajaton luotto!
			 //tiedot.setText(tili.toString() + 300);
		 }
		}

	}


public void tyhjaaNapit()			//vie näkymättömäksi uusi tili kohdan labelit ja textboksit
{
		alkusaldo.setVisible(false);
		avauspvm.setVisible(false);
		nimi.setVisible(false);
		tilinro.setVisible(false);

		omistaja.setVisible(false);
		tilinumero.setVisible(false);
		saldoAlku.setVisible(false);
		pvm.setVisible(false);

		tyhjaa.setVisible(false);
		tallenna.setVisible(false);
}

public void tyhjaaKentat()		//tyhjää uusi tili kohdan textboksit
{
	alkusaldo.setText("");
	avauspvm.setText("");
	nimi.setText("");
	tilinro.setText("");
}

	public static void main(String[] args)

	{
		new kayttoliittyma();
	}

}

Metabolix [06.03.2009 19:55:33]

#

Kaksi kommenttia:
1. Käytä kooditageja!
2. Sisennä koko koodi kunnolla.

Ongelmasi on, että luot uuden tilin joka kerta, kun nappia painetaan. Katsohan nyt itsekin, minne olet sen new Tili(0) -rivin laittanut. (Sehän on aivan eri kohdassa kuin ensimmäisessä viestissäsi!) Tilin kuuluisi varmaankin olla jonkin luokan jäsen, ja ainakin objekti pitäisi luoda vain kerran (tai silloin, kun halutaan avata uusi tili). Vaikea sanoa, minne se tuossa pitäisi sijoittaa, kun koodi on muutenkin hieman nurinkurisesti järjestetty. Mikset saman tien laita ActionListener-implementaatiotasi suoraan kayttoliittyma-luokkaan? Tällöin tili voisi olla käyttöliittymän jäsen kuten kaikki nappulatkin. Myöskään yksityinen luokka nappiKuuntelija ei missään tapauksessa ole looginen paikka main-metodille.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta