package app.view;
import app.model.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;
import javax.swing.*;
/**
* InterntVindu.java
*
* De interne vinduene i programmet.
*
* @author Hilde Vestøl (106288)
* @version 0.9
*/
public class InterntVindu extends JInternalFrame {
private static int vindusTeller = 0, offsetTeller = 0;
private static final int xOffset = 20, yOffset = 20;
private ActionListener lytter;
private Loan lån;
private TablePanel table;
//GUI-felt som jeg trenger referanser til
private JTextField txtLåneID = new JTextField(4);
private JTextField txtLånebeløp = new JTextField(8);
private JTextField txtLøpeTid = new JTextField(8);
private JTextField txtTerminer = new JTextField(8);
private JTextField txtRentesats = new JTextField(8);
private JTextField txtTypeLån = new JTextField(8);
private JComboBox låneTypeBox = new JComboBox(
new String[] {"Annuitet", "Seriell"});
private JComboBox terminBox = new JComboBox(
new String[] {"Årlig", "Halvår", "Kvartal", "Månedlig"});
private JTextArea txtInfo = new JTextArea();
/**
*
* @param tittel
* @param lytter
* @param lån
*/
protected InterntVindu(String tittel, ActionListener lytter, Loan lån) {
super(tittel + (++vindusTeller),
true, //resizable
true, //closable
true, //maximizable
false); //iconifiable
this.lytter = lytter;
this.lån = lån;
this.setSize(800, 600);
this.addInternalFrameListener((InternalFrameListener)lytter);
//Legger til panel med labels, txt-felt og knapper
NordPanel nord = new NordPanel();
this.add(nord, BorderLayout.NORTH);
//legger til JTable
table = new TablePanel(lån);
this.add(table, BorderLayout.CENTER);
InfoPanel info = new InfoPanel();
this.add(info, BorderLayout.SOUTH);
//Sjekker at ikke offset kommer utenfor vindusStørrelsen
if ( (yOffset * offsetTeller ) < 400) {
offsetTeller++;
} else {
offsetTeller = 0;
}
this.setLocation(xOffset*offsetTeller, yOffset*offsetTeller);
}
/**
*
* @param lån
*/
protected void oppdaterAlleFelt(Loan lån) {
this.setID(lån.getLåneNR());
this.setBeløp(lån.getLånebeløp());
this.setLøpetid(lån.getLøpetid());
this.setRentesats(lån.getRentesats());
this.låneTypeBox.setSelectedIndex(lån.getLånetype() - 1);
int terminIndex = 0;
if (lån.getÅrligeTerminer() == Loan.TERMIN_ÅRLIG) {
terminIndex = 0;
} else if (lån.getÅrligeTerminer() == Loan.TERMIN_HALVÅR) {
terminIndex = 1;
} else if (lån.getÅrligeTerminer() == Loan.TERMIN_KVARTAL) {
terminIndex = 2;
} else if (lån.getÅrligeTerminer() == Loan.TERMIN_ÅRLIG) {
terminIndex = 3;
}
this.terminBox.setSelectedIndex(terminIndex);
}
/* **********************************************************************
* get-metoder *
* disse er protected, for de skal kun brukes av selve vinduet *
* programmet "lenger ute" trenger ikke å vite noe om hva som *
* befinner seg her inne... *
* **********************************************************************/
/**
*
* @return
*/
protected Loan getLån() { return lån; }
/**
*
* @return
*/
protected String getLåneID() { return txtLåneID.getText(); }
/**
*
* @return
*/
protected String getLånebeløp() { return txtLånebeløp.getText(); }
/**
*
* @return
*/
protected String getLøpetid() { return txtLøpeTid.getText(); }
/**
* returnerer en int. Bruker de samme konstantene fra Loan.java
* Bryter kanskje litt med mvc ved at InterntVindu "har denne kunnskapen"?
* Et alternativ er å lage en en String[] med tektsten til combo-boxen
* i Loan.java, sende kun teksten videre herfra, og gjøre denne sjekken
* i Loan.java i stedenfor her. Da vil jeg kunne endre ett sted, og
* programmet vil fortsatt fungere. Nå må jeg sjekke både InterntVindu
* og Loan hvis jeg f.eks. setter inn ett ekstra valg.
*
* @return
*/
protected int getÅrligeTerminer() {
int term = Loan.TERMIN_ÅRLIG;
if (terminBox.getSelectedItem().equals("Halvår")) {
term = Loan.TERMIN_HALVÅR;
} else if (terminBox.getSelectedItem().equals("Kvartal")) {
term = Loan.TERMIN_KVARTAL;
} else if (terminBox.getSelectedItem().equals("Månedlig")) {
term = Loan.TERMIN_MND;
}
return term;
}
/**
*
* @return
*/
protected String getRentesats() { return txtRentesats.getText(); }
/**
*
* @return
*/
protected int getLånetype() {
int value = Loan.TYPE_ANNUITET;
if (låneTypeBox.getSelectedItem().equals("Seriell")) {
value = Loan.TYPE_SERIELL;
}
return value;
}
/**
*
* @return
*/
protected JTextArea getTxtInfo() { return txtInfo; }
/* ************************************************************************
* Set-metoder *
* For å kunne sette inn verdier i txt-feltene *
* Har to sett *
* - en med den faktiske typen, regner med at jeg kanskje trenger det *
* fra databasen *
* - en som tar String, for å f.eks. blanke ut innholdet *
* ************************************************************************/
/**
*
* @param id
*/
protected void setID(int id) { txtLåneID.setText("" + id); }
/**
*
* @param txt
*/
protected void setID(String txt) { txtLåneID.setText(txt); }
/**
*
* @param beløp
*/
protected void setBeløp(int beløp) { txtLånebeløp.setText("" + beløp); }
/**
*
* @param txt
*/
protected void setBeløp(String txt) { txtLånebeløp.setText(txt); }
/**
*
* @param tid
*/
protected void setLøpetid(int tid) { txtLøpeTid.setText("" + tid); }
/**
*
* @param txt
*/
protected void setLøpetid(String txt) { txtLøpeTid.setText(txt); }
/**
*
* @param rente
*/
protected void setRentesats (double rente) {
txtRentesats.setText("" + rente);
}
/**
*
* @param txt
*/
protected void setRentesats (String txt) { txtRentesats.setText(txt); }
/**
*
* @param txt
*/
protected void setInfoTxt(String txt) { txtInfo.setText(txt); }
/**
*
* @param farge
*/
protected void setInfoTxt(Color farge) { txtInfo.setForeground(farge); }
/* ************************************************************************
* En privat indre klasse for å opprette NordPanel *
* Dette for å kunne plassere LabelPanel og ButtonPanel i *
* forhold til hverandre med BorderLayout, men beholde *
* hvert panels faktiske layout. *
* ************************************************************************/
private class NordPanel extends JPanel {
protected NordPanel() {
this.setLayout(new BorderLayout());
this.add(new LabelPanel(), BorderLayout.WEST);
this.add(new ButtonPanel(), BorderLayout.EAST);
}
} //end NordPanel
/* **************************************************************************
* Privat indre klasse for å opprette panelet med labels, og tekstfelt *
* Inneholder hjelpemetoder for å opprette labels og tekstfelt *
* på hver sinde linjer for å få disse underhverandre. *
* Har kombindert box-layout og flowlayout for å forhindre at *
* tekstfeltene "flyter" i GUIen, men at jeg likevel kan få plassert *
* feltene under hverandre. Har testet mange andre varianter som *
* GridLayout, GridBagLayout, GroupLayout, men alle ble litt overkomplisert *
* og jeg mistet fort kontrollen over GUIen, derfor "forenklet" jeg det *
* det ved å gjøre det på måten jeg har gjort nedenfor. *
* **************************************************************************/
private class LabelPanel extends JPanel {
//Brukes for størrelsene på labels
private int x_size = 75;
private int y_size = 40;
private LabelPanel() {
txtLåneID.setEditable(false);
this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
lagNyLinje(new JLabel("låneID: "), txtLåneID);
lagNyLinje(new JLabel("Lånebeløp: "), txtLånebeløp);
lagNyLinjeMedBox
( new JLabel("Løpetid: "),
txtLøpeTid,
new JLabel("Terminer: "),
terminBox
);
lagNyLinjeMedBox
( new JLabel("Rentesats: "),
txtRentesats,
new JLabel("%"),
new JLabel("Type lån: "),
låneTypeBox
);
/* Legger til KeyListener slik at man kan trykke Enter i ett
* tekst-felt for å beregne en plan.
*/
if (lytter instanceof KeyListener) {
txtLånebeløp.addKeyListener((KeyListener)lytter);
txtLøpeTid.addKeyListener((KeyListener)lytter);
txtRentesats.addKeyListener((KeyListener)lytter);
}
}
//for å opprette både labels og textfield på en linje
private JPanel lagNyLinje(JLabel label, JTextField txt) {
JPanel tmp = new JPanel();
label.setPreferredSize(new Dimension(x_size, y_size));
tmp.setLayout(new FlowLayout(FlowLayout.LEFT));
tmp.add(label);
tmp.add(txt);
add(tmp);
return tmp;
}
private JPanel lagNyLinjeMedBox(JLabel label1,
JTextField txt,
JLabel label2,
JLabel label3,
JComboBox box) {
JPanel tmp = new JPanel();
label1.setPreferredSize(new Dimension(x_size, y_size));
label2.setPreferredSize(new Dimension(40, y_size));
tmp.setLayout(new FlowLayout(FlowLayout.LEFT));
tmp.add(label1);
tmp.add(txt);
tmp.add(label2);
tmp.add(label3);
tmp.add(box);
add(tmp);
return tmp;
}
private JPanel lagNyLinjeMedBox(JLabel label1,
JTextField txt,
JLabel label2,
JComboBox box) {
JPanel tmp = new JPanel();
label1.setPreferredSize(new Dimension(x_size, y_size));
label2.setPreferredSize(new Dimension(105, y_size));
tmp.setLayout(new FlowLayout(FlowLayout.LEFT));
tmp.add(label1);
tmp.add(txt);
tmp.add(label2);
tmp.add(box);
add(tmp);
return tmp;
}
} // end class LabelPanel
/* **********************************************************************
* En privat indre klasse for å opprette ButtonPanel *
* **********************************************************************/
private class ButtonPanel extends JPanel {
private ButtonPanel() {
this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
lagNyKnapp("Tøm innhold", "reset");
lagNyKnapp("Lagre", "save");
lagNyKnapp("Finn", "find");
lagNyKnapp("Beregn plan", "beregn");
}
private JButton lagNyKnapp(String txt, String kommando) {
JButton knapp = new JButton(txt);
knapp.setActionCommand(kommando);
knapp.addActionListener(lytter);
add(knapp);
return knapp;
}
} //end class ButtonPanel
private class InfoPanel extends JPanel {
private InfoPanel() {
txtInfo.setEditable(false);
txtInfo.setOpaque(false);
this.add(txtInfo);
}
}
private class TablePanel extends JPanel {
JTable tabell;
private TablePanel( Loan lån ) {
this.tabell = new JTable(lån);
JScrollPane rullefelt = new JScrollPane(this.tabell);
this.setLayout(new BorderLayout());
this.add(rullefelt, BorderLayout.CENTER);
}
} //end class TablePanel
}
import app.model.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;
import javax.swing.*;
/**
* InterntVindu.java
*
* De interne vinduene i programmet.
*
* @author Hilde Vestøl (106288)
* @version 0.9
*/
public class InterntVindu extends JInternalFrame {
private static int vindusTeller = 0, offsetTeller = 0;
private static final int xOffset = 20, yOffset = 20;
private ActionListener lytter;
private Loan lån;
private TablePanel table;
//GUI-felt som jeg trenger referanser til
private JTextField txtLåneID = new JTextField(4);
private JTextField txtLånebeløp = new JTextField(8);
private JTextField txtLøpeTid = new JTextField(8);
private JTextField txtTerminer = new JTextField(8);
private JTextField txtRentesats = new JTextField(8);
private JTextField txtTypeLån = new JTextField(8);
private JComboBox låneTypeBox = new JComboBox(
new String[] {"Annuitet", "Seriell"});
private JComboBox terminBox = new JComboBox(
new String[] {"Årlig", "Halvår", "Kvartal", "Månedlig"});
private JTextArea txtInfo = new JTextArea();
/**
*
* @param tittel
* @param lytter
* @param lån
*/
protected InterntVindu(String tittel, ActionListener lytter, Loan lån) {
super(tittel + (++vindusTeller),
true, //resizable
true, //closable
true, //maximizable
false); //iconifiable
this.lytter = lytter;
this.lån = lån;
this.setSize(800, 600);
this.addInternalFrameListener((InternalFrameListener)lytter);
//Legger til panel med labels, txt-felt og knapper
NordPanel nord = new NordPanel();
this.add(nord, BorderLayout.NORTH);
//legger til JTable
table = new TablePanel(lån);
this.add(table, BorderLayout.CENTER);
InfoPanel info = new InfoPanel();
this.add(info, BorderLayout.SOUTH);
//Sjekker at ikke offset kommer utenfor vindusStørrelsen
if ( (yOffset * offsetTeller ) < 400) {
offsetTeller++;
} else {
offsetTeller = 0;
}
this.setLocation(xOffset*offsetTeller, yOffset*offsetTeller);
}
/**
*
* @param lån
*/
protected void oppdaterAlleFelt(Loan lån) {
this.setID(lån.getLåneNR());
this.setBeløp(lån.getLånebeløp());
this.setLøpetid(lån.getLøpetid());
this.setRentesats(lån.getRentesats());
this.låneTypeBox.setSelectedIndex(lån.getLånetype() - 1);
int terminIndex = 0;
if (lån.getÅrligeTerminer() == Loan.TERMIN_ÅRLIG) {
terminIndex = 0;
} else if (lån.getÅrligeTerminer() == Loan.TERMIN_HALVÅR) {
terminIndex = 1;
} else if (lån.getÅrligeTerminer() == Loan.TERMIN_KVARTAL) {
terminIndex = 2;
} else if (lån.getÅrligeTerminer() == Loan.TERMIN_ÅRLIG) {
terminIndex = 3;
}
this.terminBox.setSelectedIndex(terminIndex);
}
/* **********************************************************************
* get-metoder *
* disse er protected, for de skal kun brukes av selve vinduet *
* programmet "lenger ute" trenger ikke å vite noe om hva som *
* befinner seg her inne... *
* **********************************************************************/
/**
*
* @return
*/
protected Loan getLån() { return lån; }
/**
*
* @return
*/
protected String getLåneID() { return txtLåneID.getText(); }
/**
*
* @return
*/
protected String getLånebeløp() { return txtLånebeløp.getText(); }
/**
*
* @return
*/
protected String getLøpetid() { return txtLøpeTid.getText(); }
/**
* returnerer en int. Bruker de samme konstantene fra Loan.java
* Bryter kanskje litt med mvc ved at InterntVindu "har denne kunnskapen"?
* Et alternativ er å lage en en String[] med tektsten til combo-boxen
* i Loan.java, sende kun teksten videre herfra, og gjøre denne sjekken
* i Loan.java i stedenfor her. Da vil jeg kunne endre ett sted, og
* programmet vil fortsatt fungere. Nå må jeg sjekke både InterntVindu
* og Loan hvis jeg f.eks. setter inn ett ekstra valg.
*
* @return
*/
protected int getÅrligeTerminer() {
int term = Loan.TERMIN_ÅRLIG;
if (terminBox.getSelectedItem().equals("Halvår")) {
term = Loan.TERMIN_HALVÅR;
} else if (terminBox.getSelectedItem().equals("Kvartal")) {
term = Loan.TERMIN_KVARTAL;
} else if (terminBox.getSelectedItem().equals("Månedlig")) {
term = Loan.TERMIN_MND;
}
return term;
}
/**
*
* @return
*/
protected String getRentesats() { return txtRentesats.getText(); }
/**
*
* @return
*/
protected int getLånetype() {
int value = Loan.TYPE_ANNUITET;
if (låneTypeBox.getSelectedItem().equals("Seriell")) {
value = Loan.TYPE_SERIELL;
}
return value;
}
/**
*
* @return
*/
protected JTextArea getTxtInfo() { return txtInfo; }
/* ************************************************************************
* Set-metoder *
* For å kunne sette inn verdier i txt-feltene *
* Har to sett *
* - en med den faktiske typen, regner med at jeg kanskje trenger det *
* fra databasen *
* - en som tar String, for å f.eks. blanke ut innholdet *
* ************************************************************************/
/**
*
* @param id
*/
protected void setID(int id) { txtLåneID.setText("" + id); }
/**
*
* @param txt
*/
protected void setID(String txt) { txtLåneID.setText(txt); }
/**
*
* @param beløp
*/
protected void setBeløp(int beløp) { txtLånebeløp.setText("" + beløp); }
/**
*
* @param txt
*/
protected void setBeløp(String txt) { txtLånebeløp.setText(txt); }
/**
*
* @param tid
*/
protected void setLøpetid(int tid) { txtLøpeTid.setText("" + tid); }
/**
*
* @param txt
*/
protected void setLøpetid(String txt) { txtLøpeTid.setText(txt); }
/**
*
* @param rente
*/
protected void setRentesats (double rente) {
txtRentesats.setText("" + rente);
}
/**
*
* @param txt
*/
protected void setRentesats (String txt) { txtRentesats.setText(txt); }
/**
*
* @param txt
*/
protected void setInfoTxt(String txt) { txtInfo.setText(txt); }
/**
*
* @param farge
*/
protected void setInfoTxt(Color farge) { txtInfo.setForeground(farge); }
/* ************************************************************************
* En privat indre klasse for å opprette NordPanel *
* Dette for å kunne plassere LabelPanel og ButtonPanel i *
* forhold til hverandre med BorderLayout, men beholde *
* hvert panels faktiske layout. *
* ************************************************************************/
private class NordPanel extends JPanel {
protected NordPanel() {
this.setLayout(new BorderLayout());
this.add(new LabelPanel(), BorderLayout.WEST);
this.add(new ButtonPanel(), BorderLayout.EAST);
}
} //end NordPanel
/* **************************************************************************
* Privat indre klasse for å opprette panelet med labels, og tekstfelt *
* Inneholder hjelpemetoder for å opprette labels og tekstfelt *
* på hver sinde linjer for å få disse underhverandre. *
* Har kombindert box-layout og flowlayout for å forhindre at *
* tekstfeltene "flyter" i GUIen, men at jeg likevel kan få plassert *
* feltene under hverandre. Har testet mange andre varianter som *
* GridLayout, GridBagLayout, GroupLayout, men alle ble litt overkomplisert *
* og jeg mistet fort kontrollen over GUIen, derfor "forenklet" jeg det *
* det ved å gjøre det på måten jeg har gjort nedenfor. *
* **************************************************************************/
private class LabelPanel extends JPanel {
//Brukes for størrelsene på labels
private int x_size = 75;
private int y_size = 40;
private LabelPanel() {
txtLåneID.setEditable(false);
this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
lagNyLinje(new JLabel("låneID: "), txtLåneID);
lagNyLinje(new JLabel("Lånebeløp: "), txtLånebeløp);
lagNyLinjeMedBox
( new JLabel("Løpetid: "),
txtLøpeTid,
new JLabel("Terminer: "),
terminBox
);
lagNyLinjeMedBox
( new JLabel("Rentesats: "),
txtRentesats,
new JLabel("%"),
new JLabel("Type lån: "),
låneTypeBox
);
/* Legger til KeyListener slik at man kan trykke Enter i ett
* tekst-felt for å beregne en plan.
*/
if (lytter instanceof KeyListener) {
txtLånebeløp.addKeyListener((KeyListener)lytter);
txtLøpeTid.addKeyListener((KeyListener)lytter);
txtRentesats.addKeyListener((KeyListener)lytter);
}
}
//for å opprette både labels og textfield på en linje
private JPanel lagNyLinje(JLabel label, JTextField txt) {
JPanel tmp = new JPanel();
label.setPreferredSize(new Dimension(x_size, y_size));
tmp.setLayout(new FlowLayout(FlowLayout.LEFT));
tmp.add(label);
tmp.add(txt);
add(tmp);
return tmp;
}
private JPanel lagNyLinjeMedBox(JLabel label1,
JTextField txt,
JLabel label2,
JLabel label3,
JComboBox box) {
JPanel tmp = new JPanel();
label1.setPreferredSize(new Dimension(x_size, y_size));
label2.setPreferredSize(new Dimension(40, y_size));
tmp.setLayout(new FlowLayout(FlowLayout.LEFT));
tmp.add(label1);
tmp.add(txt);
tmp.add(label2);
tmp.add(label3);
tmp.add(box);
add(tmp);
return tmp;
}
private JPanel lagNyLinjeMedBox(JLabel label1,
JTextField txt,
JLabel label2,
JComboBox box) {
JPanel tmp = new JPanel();
label1.setPreferredSize(new Dimension(x_size, y_size));
label2.setPreferredSize(new Dimension(105, y_size));
tmp.setLayout(new FlowLayout(FlowLayout.LEFT));
tmp.add(label1);
tmp.add(txt);
tmp.add(label2);
tmp.add(box);
add(tmp);
return tmp;
}
} // end class LabelPanel
/* **********************************************************************
* En privat indre klasse for å opprette ButtonPanel *
* **********************************************************************/
private class ButtonPanel extends JPanel {
private ButtonPanel() {
this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
lagNyKnapp("Tøm innhold", "reset");
lagNyKnapp("Lagre", "save");
lagNyKnapp("Finn", "find");
lagNyKnapp("Beregn plan", "beregn");
}
private JButton lagNyKnapp(String txt, String kommando) {
JButton knapp = new JButton(txt);
knapp.setActionCommand(kommando);
knapp.addActionListener(lytter);
add(knapp);
return knapp;
}
} //end class ButtonPanel
private class InfoPanel extends JPanel {
private InfoPanel() {
txtInfo.setEditable(false);
txtInfo.setOpaque(false);
this.add(txtInfo);
}
}
private class TablePanel extends JPanel {
JTable tabell;
private TablePanel( Loan lån ) {
this.tabell = new JTable(lån);
JScrollPane rullefelt = new JScrollPane(this.tabell);
this.setLayout(new BorderLayout());
this.add(rullefelt, BorderLayout.CENTER);
}
} //end class TablePanel
}