Kan se at jeg har brugt en AbstractTabelModel så du får lige noget kode til sådan en fætter, og så ser jeg lige om jeg kan finde hvor det bliver puttet i en JTabel...
/*
Fil: OrdreTableModel.java
Klasse som styre datamodellen for en ordre når den oprettes
*/
import javax.swing.table.*;
import java.util.*;
public class OrderTableModel extends AbstractTableModel {
private static OrderTableModel reference;
private Model model = Model.getInstance();
private ArrayList list; // Liste som holder Article objekter
private ArrayList itemCount; // Liste der holder antallet
private OrderTableModel() {
list = new ArrayList();
itemCount = new ArrayList();
}
public static OrderTableModel getInstance() {
if(reference == null)
reference = new OrderTableModel();
return reference;
}
public Object getValueAt(int r, int c) {
if(c == 0) return ((Article)list.get(r)).getValue(0);
if(c == 1) return ((Article)list.get(r)).getValue(3);
if(c == 2) return "Kr. " + ((Article)list.get(r)).getValue(1) + "0";
if(c == 3) return Integer.valueOf(itemCount.get(r).toString());
return new Object();
}
public int getColumnCount() {
return 4;
}
public int getRowCount() {
return list.size();
}
public boolean isCellEditable(int r, int c) {
if(c == 3)
return true;
else
return false;
}
public void setValueAt(Object value,int r, int c) {
try { // Hvis antallet er mindre end 1 så skal varen fjernes fra listen
if(Integer.parseInt(value.toString()) < 1) {
list.remove(r);
itemCount.remove(r);
fireTableRowsDeleted(r,r);
}
else {
itemCount.set(r, value);
fireTableRowsUpdated(r,r);
}
}
catch (NumberFormatException e) {
}
}
public void addRow(IDataElement element) {
// Hvis objektet findes i listen skal antal forøges med 1
if(list.contains(element)) {
int index = list.indexOf(element);
int count = Integer.parseInt(itemCount.get(index).toString());
itemCount.remove(index);
itemCount.add(index, String.valueOf(count + 1));
fireTableCellUpdated(index, 3);
}
else
{
list.add(0, element);
itemCount.add(0, new Integer(1));
fireTableRowsInserted(0,0);
}
}
public String getColumnName(int c) {
switch(c) {
case 0: return "Vare nr:";
case 1: return "Vare navn:";
case 2: return "Pris:";
case 3: return "Antal:";
default: return "";
}
}
public void clear() {
int lines = getRowCount();
list = new ArrayList();
itemCount = new ArrayList();
fireTableRowsDeleted(0, lines);
}
// Metode til at hente linierne ud så de kan blive gemt i db'en
public List getLines() {
ArrayList lines = new ArrayList();
for(int i = 0; i < list.size(); i++) {
int antal = Integer.parseInt(itemCount.get(i).toString());
int varenr = Integer.parseInt(((IDataElement)list.get(i)).getValue(0).toString());
lines.add(new OrderLine(0,antal,0,varenr));
}
return lines;
}
}
Lige lidt mere kode. Tag et kig i bunden hvor JTablen bliver kaldt, der kan du se hvordan instantieret.
/*
Fil: OrderForm.java
Klassen viser ordreformen og den funktionalitet som der er i den
*/
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
public class OrderForm extends JPanel {
private OrderForm() {
super();
// Sætter vores JTextFields op til at bruge en InputVerifier
initFields();
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
table.setBackground(Color.WHITE);
table.setGridColor(new Color(236,233,216));
paneTable.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(new Color(128,128,128), 1),"Ordre linier"));
paneItems.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(new Color(128,128,128), 1),"Søgeresultat"));
paneItems.setPreferredSize(new Dimension(10,105));
paneTable.setPreferredSize(new Dimension(10,125));
// Når der bliver trykket på "tilføj vare" knappen
addItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
if(!items.isSelectionEmpty()) {
tblModel.addRow((IDataElement)items.getSelectedValue());
}
}
}
);
// Tilføjer de forskellige elementer til siden
// med en standard afstand (space)
int space = 5;
head();
add(head);
add(Box.createVerticalStrut(space));
add(paneItems);
add(Box.createVerticalStrut(space));
add(addItem);
add(Box.createVerticalStrut(space));
add(paneTable);
add(Box.createVerticalStrut(space));
add(buttons());
}
public static OrderForm getInstance() {
if(reference == null)
reference = new OrderForm();
return reference;
}
public JPanel orderForm() {
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.add(head);
panel.add(items);
return panel;
}
public void addItems(IDataElement element) {
items.setListData(model.searchArticles(element));
}
// Danner den øverste del som indholder info omkring kunden og levering
private void head() {
JPanel bill = billing();
JPanel dest = destination();
JButton btn = new JButton("->");
bill.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(new Color(128,128,128), 1),"Faktura"));
dest.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(new Color(128,128,128), 1),"Levering"));
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
nameDest.setText(name.getText());
streetDest.setText(street.getText());
noDest.setText(no.getText());
zipDest.setText(zip.getText());
cityDest.setText(city.getText());
}
}
);
head.add(bill);
head.add(btn);
head.add(dest);
}
// Dette er venstre del af head hvor faktura info står
private JPanel billing() {
billing.setLayout(new FlowLayout(FlowLayout.LEFT));
colLeftBill.setLayout(new BoxLayout(colLeftBill, BoxLayout.Y_AXIS));
colRightBill.setLayout(new BoxLayout(colRightBill, BoxLayout.Y_AXIS));
int space = 5;
colLeftBill.add(new JLabel("CVR:"));
colLeftBill.add(Box.createVerticalStrut(space));
colLeftBill.add(new JLabel("Navn:"));
colLeftBill.add(Box.createVerticalStrut(space));
colLeftBill.add(new JLabel("Gade:"));
colLeftBill.add(Box.createVerticalStrut(space));
colLeftBill.add(new JLabel("Hus nr:"));
colLeftBill.add(Box.createVerticalStrut(space));
colLeftBill.add(new JLabel("Post nr:"));
colLeftBill.add(Box.createVerticalStrut(space));
colLeftBill.add(new JLabel("By:"));
colLeftBill.add(Box.createVerticalStrut(space));
colLeftBill.add(new JLabel("Telefon:"));
// Når cvr feltet mister fokus bliver cvr nummeret slåt op i databasen
// Hvis den findes bliver informationen sat ind i de respektive felter
cvr.addFocusListener(new FocusAdapter() {
public void focusLost(FocusEvent e) {
// Tjek også på om cvr er 8 char langt
if(cvr.getText().length() != 8)
return;
// Tjek om der findes et object
if(model.searchCustomers(new Customer(Integer.parseInt(cvr.getText()), "", new Adress("","",0,0), 0,' ')).size() == 0)
return;
Customer customer = (Customer)model.searchCustomers(new Customer(Integer.parseInt(cvr.getText()), "", new Adress("","",0,0), 0,' ')).get(0);
if(customer != null) {
name.setText(customer.getValue(1).toString());
street.setText(customer.getValue(2).toString());
no.setText(customer.getValue(3).toString());
zip.setText(customer.getValue(4).toString());
city.setText(customer.getValue(5).toString());
phone.setText(customer.getValue(6).toString());
}
}
}
);
colRightBill.add(cvr);
colRightBill.add(name);
colRightBill.add(street);
colRightBill.add(no);
colRightBill.add(zip);
colRightBill.add(city);
colRightBill.add(phone);
billing.add(colLeftBill);
billing.add(colRightBill);
return billing;
}
// Leverings adresse
private JPanel destination() {
destination.setLayout(new FlowLayout(FlowLayout.LEFT));
colLeftDest.setLayout(new BoxLayout(colLeftDest, BoxLayout.Y_AXIS));
colRightDest.setLayout(new BoxLayout(colRightDest, BoxLayout.Y_AXIS));
int space = 5;
colLeftDest.add(new JLabel("Navn:"));
colLeftDest.add(Box.createVerticalStrut(space));
colLeftDest.add(new JLabel("Gade:"));
colLeftDest.add(Box.createVerticalStrut(space));
colLeftDest.add(new JLabel("Hus nr:"));
colLeftDest.add(Box.createVerticalStrut(space));
colLeftDest.add(new JLabel("Post nr:"));
colLeftDest.add(Box.createVerticalStrut(space));
colLeftDest.add(new JLabel("By:"));
colRightDest.add(nameDest);
colRightDest.add(streetDest);
colRightDest.add(noDest);
colRightDest.add(zipDest);
colRightDest.add(cityDest);
destination.add(colLeftDest);
destination.add(colRightDest);
return destination;
}
public void refresh() {
this.doLayout();
billing.doLayout();
destination.doLayout();
}
private JPanel buttons() {
JPanel panel = new JPanel();
panel.setLayout(new FlowLayout(FlowLayout.RIGHT));
clearOrder.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
JOptionPane pane = new JOptionPane();
pane.setMessage("Er du sikker på at du vil ryde skærmen?");
pane.setMessageType(JOptionPane.QUESTION_MESSAGE);
pane.setOptionType(JOptionPane.OK_OPTION);
JDialog dialog = pane.createDialog(table, "Malthe Bruun Handelskompagni > Slet alt");
dialog.show();
Object selectedValue = pane.getValue();
if(Integer.parseInt(selectedValue.toString()) == 2)
return;
clear();
}
}
);
// Når man trykker på opret ordre
createOrder.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
// Ser om der er ordrelinier, ellers fejl tilbage til brugeren
if(tblModel.getLines().size() == 0) {
JOptionPane.showMessageDialog(paneItems,"Kan ikke oprette ordren fordi at der ikke er tilføjet nogle ordrelinier. Klik OK for at fortsætte.","Malthe Bruun Handelskompagni > Ordre",JOptionPane.ERROR_MESSAGE);
return;
}
// Opretter objekter som skal være med når ordren skal gemmes
Adress adr1 = new Adress(street.getText(), city.getText(), Integer.parseInt(no.getText()), Integer.parseInt(zip.getText()));
Adress adr2 = new Adress(streetDest.getText(), cityDest.getText(), Integer.parseInt(noDest.getText()), Integer.parseInt(zipDest.getText()));
Customer billing = new Customer(Integer.parseInt(cvr.getText()), name.getText(), adr1, Integer.parseInt(phone.getText()), ' ');
Order order = new Order(0, Integer.parseInt(cvr.getText()), "Modtaget", adr2, new java.sql.Date(System.currentTimeMillis()));
model.createOrder(billing, order, tblModel.getLines());
JOptionPane.showMessageDialog(paneItems,"Ordren er blevet gemt. Klik OK for at fortsætte.","Malthe Bruun Handelskompagni > Ordre",JOptionPane.INFORMATION_MESSAGE);
clear();
}
}
);
panel.add(clearOrder);
panel.add(createOrder);
return panel;
}
private void clear() {
// Nulstil kundeinfo
cvr.setText("");
name.setText("");
street.setText("");
no.setText("");
zip.setText("");
city.setText("");
phone.setText("");
// Nulstil leveringsinfo
nameDest.setText("");
streetDest.setText("");
noDest.setText("");
zipDest.setText("");
cityDest.setText("");
// Nulstil vores datamodel
tblModel.clear();
}
private void initFields() {
cvr.setInputVerifier(FormData.Verification.verifyCvr());
phone.setInputVerifier(FormData.Verification.verifyPhone());
zip.setInputVerifier(FormData.Verification.verifyZip());
no.setInputVerifier(FormData.Verification.verifyNo());
name.setInputVerifier(FormData.Verification.verifyText());
street.setInputVerifier(FormData.Verification.verifyText());
city.setInputVerifier(FormData.Verification.verifyText());
zipDest.setInputVerifier(FormData.Verification.verifyZip());
noDest.setInputVerifier(FormData.Verification.verifyNo());
nameDest.setInputVerifier(FormData.Verification.verifyText());
cityDest.setInputVerifier(FormData.Verification.verifyText());
streetDest.setInputVerifier(FormData.Verification.verifyText());
}
// Modeller ol.
private OrderTableModel tblModel = OrderTableModel.getInstance();
private Model model = Model.getInstance();
private static OrderForm reference;
// De forskellige swing objekter vi benytter os af
private JPanel billing = new JPanel();
private JPanel destination = new JPanel();
private JPanel colLeftBill = new JPanel();
private JPanel colRightBill = new JPanel();
private JTextField cvr = new JTextField();
private JTextField name = new JTextField(20);
private JTextField street = new JTextField();
private JTextField no = new JTextField();
private JTextField zip = new JTextField();
private JTextField city = new JTextField();
private JTextField phone = new JTextField();
private JPanel colLeftDest = new JPanel();
private JPanel colRightDest = new JPanel();
private JTextField nameDest = new JTextField(20);
private JTextField streetDest = new JTextField();
private JTextField noDest = new JTextField();
private JTextField zipDest = new JTextField();
private JTextField cityDest = new JTextField();
private JList items = new JList();
private JPanel head = new JPanel();
private JPanel bill = new JPanel();
private JPanel dest = new JPanel();
private JPanel line = new JPanel();
private JButton addItem = new JButton("Tilføj vare");
private JButton createOrder = new JButton("Opret ordre");
private JButton clearOrder = new JButton("Fortryd");
private JTable table = new JTable(tblModel);
private JScrollPane paneItems = new JScrollPane(items, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
private JScrollPane paneTable = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
}