Avatar billede cyberesben Nybegynder
07. juni 2005 - 14:29 Der er 10 kommentarer og
1 løsning

Omdefinering af Swing's JTable ?

Jeg har lavet en simpel brugerflade i netbeans, med Swing's komponenter.

Jeg har bl.a. en JTable, men den er som standard defineret til at være 4x4, og jeg kan ikke lige finde nogen metoder til at udvide den.

Dette kan jo være nødvendigt, når nu jeg vil hive data ind via SQL og præsentere dem i tabellen - så kan jeg jo ikke vide hvor mange rækker der kommer

hvad plejer man at gøre?
Avatar billede soes Nybegynder
07. juni 2005 - 14:42 #1
Sidst jeg brugte JTabel mener jeg at vi fik hentet et result set ud fra en sql forespørgsel. Der havde vi så de oplysninger vi skulle bruge med rækker osv. og kunne på den baggrund lave en TabelModel (tror jeg nok den hedder) og foder den ind i vores JTabel.

Skal ikke sige om det er den mest optimale løsning
Avatar billede cyberesben Nybegynder
07. juni 2005 - 14:44 #2
soes: kan du vise mig et eksempel på dette?
Avatar billede soes Nybegynder
07. juni 2005 - 14:49 #3
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;
    }
}
Avatar billede soes Nybegynder
07. juni 2005 - 14:52 #4
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);
}
Avatar billede cyberesben Nybegynder
07. juni 2005 - 14:57 #5
tak jeg prøver at kigge på det og melder tilbage :-)
Avatar billede soes Nybegynder
07. juni 2005 - 15:09 #6
Hvis du gerne vil have hele programmet så må du lige sige til, kan godt sende det til dig hvis du vil.
Avatar billede cyberesben Nybegynder
08. juni 2005 - 13:13 #7
jeg har vist fundet ud af det nu, jeg kan omdefinere tabellen ved flg.:

javax.swing.table.DefaultTableModel tModel =new avax.swing.table.DefaultTableModel(data, columnNames);
this.dataTable.setModel(tModel);

Sidste spørgsmål: er der en nem måde at lave en sådan tabel scrollable?

Jeg har prøvet at lavet et JScrollPane og smide tabellen inden i det, men det virker bare ikke rigtig?
Avatar billede soes Nybegynder
08. juni 2005 - 17:50 #8
private JScrollPane paneTable = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

ser ud til at virke i min app.
Avatar billede soes Nybegynder
08. juni 2005 - 17:51 #9
Herefter putter du så scrollpane i en eller anden container, f.eks. JPanel
Avatar billede cyberesben Nybegynder
06. juli 2005 - 12:02 #10
jeg fik det til at virke, jeg skulle bare slette tabel og scrollpane og så adde det igen, så kunne den scrolle...
læg et svar og få point
Avatar billede soes Nybegynder
06. juli 2005 - 18:01 #11
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester