Avatar billede mungojerrie Nybegynder
27. juli 2005 - 09:55 Der er 30 kommentarer og
1 løsning

TableModel og void MoveRow()

Hej

Jeg har fået mig et lille problem med min tablemodel.
Jeg skal lave en applet, som indeholder en jtable, hvori felter i 4 kolonner er editerbare og jeg sørger for at gemme de indtastede data i en seperat klasse der extender DefaultCellEditor.
Brugeren har ligeledes mulighed for at markere en eller flere rækker i tabellen og flytte rundt på disse vha en knap og det er her mit problem starter, da et kald til "minTableModel".moverow(start, end, to) ikke flytter rundt på dataene som forventet. De bliver slet ikke flyttet.....

I får lige en del kode :


package dk.elopak.client.gui;

import java.awt.Component;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.text.NumberFormat;
import java.text.ParseException;

import javax.swing.AbstractAction;
import javax.swing.DefaultCellEditor;
import javax.swing.JFormattedTextField;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.KeyStroke;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.text.DefaultFormatterFactory;
import javax.swing.text.NumberFormatter;

public class IntegerEditor extends DefaultCellEditor {
    JFormattedTextField ftf;
    NumberFormat integerFormat;
    private Integer minimum, maximum;
    private boolean DEBUG = true;
   
    public IntegerEditor(int min, int max) {
       
        super(new JFormattedTextField());
        ftf = (JFormattedTextField)getComponent();
        minimum = new Integer(min);
        maximum = new Integer(max);
       
        //Set up the editor for the integer cells.
        integerFormat = NumberFormat.getIntegerInstance();
        NumberFormatter intFormatter = new NumberFormatter(integerFormat);
        intFormatter.setFormat(integerFormat);
        intFormatter.setMinimum(minimum);
        intFormatter.setMaximum(maximum);
       
        ftf.setFormatterFactory(new DefaultFormatterFactory(intFormatter));
        ftf.setValue(minimum);
        ftf.setHorizontalAlignment(SwingConstants.TRAILING);
        ftf.setFocusLostBehavior(JFormattedTextField.PERSIST);
       
        //React when the user presses Enter while the editor is
        //active.  (Tab is handled as specified by
        //JFormattedTextField's focusLostBehavior property.)
        ftf.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "check");
        ftf.getActionMap().put("check", new AbstractAction() {
            public void actionPerformed(ActionEvent e) {
                if (!ftf.isEditValid()) { //The text is invalid.
                    if (userSaysRevert()) { //reverted
                        ftf.postActionEvent(); //inform the editor
                    }
                } else try {              //The text is valid,
                    ftf.commitEdit();    //so use it.
                    ftf.postActionEvent(); //stop editing
                } catch (java.text.ParseException exc) {
                    System.out.println("parse exception");
                }
            }
        });
    }
   
    //Override to invoke setValue on the formatted text field.
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        JFormattedTextField ftf = (JFormattedTextField)super.getTableCellEditorComponent(table, value, isSelected, row, column);
        ftf.setValue(value);
        return ftf;
    }
   
    //Override to ensure that the value remains an Integer.
    public Object getCellEditorValue() {
        JFormattedTextField ftf = (JFormattedTextField)getComponent();
        Object o = ftf.getValue();
        if (o instanceof Integer) {
            return o;
        } else if (o instanceof Number) {
            return new Integer(((Number)o).intValue());
        } else {
            if (DEBUG) {
                System.out.println("getCellEditorValue: o isn't a Number");
            }
            try {
                return integerFormat.parseObject(o.toString());
            } catch (ParseException exc) {
                System.err.println("getCellEditorValue: can't parse o: " + o);
                return null;
            }
        }
    }
   
    //Override to check whether the edit is valid,
    //setting the value if it is and complaining if
    //it isn't.  If it's OK for the editor to go
    //away, we need to invoke the superclass's version
    //of this method so that everything gets cleaned up.
    public boolean stopCellEditing() {
        JFormattedTextField ftf = (JFormattedTextField)getComponent();
        if (ftf.isEditValid()) {
            try {
                ftf.commitEdit();
            } catch (java.text.ParseException exc) { }
           
        } else { //text is invalid
            if (!userSaysRevert()) { //user wants to edit
                return false; //don't let the editor go away
            }
        }
        return super.stopCellEditing();
    }
   
    /**
    * Lets the user know that the text they entered is
    * bad. Returns true if the user elects to revert to
    * the last good value.  Otherwise, returns false,
    * indicating that the user wants to continue editing.
    */
    protected boolean userSaysRevert() {
        Toolkit.getDefaultToolkit().beep();
        ftf.selectAll();
        Object[] options = {"Edit",
        "Revert"};
        int answer = JOptionPane.showOptionDialog(
                SwingUtilities.getWindowAncestor(ftf),
                "The value must be an integer between "
                + minimum + " and "
                + maximum + ".\n"
                + "You can either continue editing "
                + "or revert to the last valid value.",
                "Invalid Text Entered",
                JOptionPane.YES_NO_OPTION,
                JOptionPane.ERROR_MESSAGE,
                null,
                options,
                options[1]);
       
        if (answer == 1) { //Revert!
            ftf.setValue(ftf.getValue());
            return true;
        }
        return false;
    }
}

----------------------------------------------------------------------

package dk.elopak.client.gui;

import java.awt.Color;
import java.util.Date;

import javax.swing.table.DefaultTableModel;


public class DataTableModel extends DefaultTableModel {
   
    private static String[] columnNames = {
            "Urgent",
            "Order #",
            "Design",
            "Dlv. date",
            "Order size",
            "Produced",
            "Tool",
            "Board",
            "Customer",
            "Text",
            "Sheet status",
            "Order location",
            "Comment",
            "#1",
            "#2",
            "#3",
            "#4"
        };
    private static Object[][] data = {
            {new Boolean(true), "8562232", "K9415-12121", new Date(), new Integer(30000), new Integer(400), "", "", "", "", Color.GREEN, Color.red, "", new Integer(0), new Integer(0), new Integer(0), new Integer(0)},
            {new Boolean(false), "9900909", "K9415-12121", new Date(), new Integer(30000), new Integer(400), "", "", "", "", Color.red, Color.GREEN, "", "", "", "", ""},
            {new Boolean(false), "1110011", "K9415-12121", new Date(), new Integer(30000), new Integer(400), "", "", "", "", Color.GREEN, Color.red, "", "", "", "", ""},
            {new Boolean(true), "7775577", "K9415-12121", new Date(), new Integer(30000), new Integer(400), "", "", "", "", Color.red, Color.GREEN, "", "", "", "", ""},
            {new Boolean(false), "12345678", "K9415-12121", new Date(), new Integer(30000), new Integer(400), "", "", "", "", Color.red, Color.green, "", "", "", "", ""},
    };
   
    public DataTableModel(){
        super(data, columnNames);
    }
   
    public int getColumnCount() {return columnNames.length;}
    public int getRowCount() {return data.length;}   
    public String getColumnName(int col) {return columnNames[col];}
    public Object getValueAt(int row, int col) {return data[row][col];}
    public Class getColumnClass(int c) {return getValueAt(0, c).getClass();}
 
    public boolean isCellEditable(int row, int col) {
        if(col > 12 && col < 17){return true;}
        return false;
    }
   
    public void setValueAt(Object value, int row, int col) {
        if (GUI.DEBUG) {
            System.out.println("Setting value at " + row + "," + col
                    + " to " + value
                    + " (an instance of "
                    + value.getClass() + ")");
        }
       
        data[row][col] = value;
        fireTableCellUpdated(row, col);
       
        if (GUI.DEBUG) {
            System.out.println("New value of dataTable:");
            printDebugData();
        }
    }
   
    private void printDebugData() {
        int numRows = getRowCount();
        int numCols = getColumnCount();
       
        for (int i=0; i < numRows; i++) {
            System.out.print("    row " + i + ":");
            for (int j=0; j < numCols; j++) {
                System.out.print("  " + data[i][j]);
            }
            System.out.println();
        }
        System.out.println("--------------------------");
    }
}

----------------------------------------------------------------------
package dk.elopak.client.gui;

import java.awt.Component;

import javax.swing.JTable;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;

public class DataTable extends JTable {
   
    public DataTable(TableModel tm) {
        super(tm);
        packColumns(this, 2);
        resetSizes();       
        getTableHeader().setReorderingAllowed(false);
    }
   
    public boolean isSelectedRow() { return (getSelectedRows().length == 1); }
    public boolean isSelectedRows() { return (getSelectedRows().length >= 1); }
   
    public void resetSizes() {
        /*getColumnModel().getColumn(0).setPreferredWidth(10);
        getColumnModel().getColumn(1).setPreferredWidth(40);
        getColumnModel().getColumn(2).setPreferredWidth(50);
        getColumnModel().getColumn(3).setPreferredWidth(35);
        getColumnModel().getColumn(4).setPreferredWidth(20);
        getColumnModel().getColumn(5).setPreferredWidth(20);
        getColumnModel().getColumn(6).setPreferredWidth(40);
        getColumnModel().getColumn(7).setPreferredWidth(20);
        getColumnModel().getColumn(8).setPreferredWidth(20);
        getColumnModel().getColumn(9).setPreferredWidth(20);
        */
        getColumnModel().getColumn(10).setPreferredWidth(20);
        getColumnModel().getColumn(11).setPreferredWidth(20);
        getColumnModel().getColumn(12).setPreferredWidth(40);
        getColumnModel().getColumn(13).setPreferredWidth(10);
        getColumnModel().getColumn(14).setPreferredWidth(10);
        getColumnModel().getColumn(15).setPreferredWidth(10);
        getColumnModel().getColumn(16).setPreferredWidth(10);
    }

    public void packColumns(JTable table, int margin) {
        for (int c = 0; c < table.getColumnCount()-7; c++) {
            packColumn(table, c, 2);
        }
    }
   
    public void packColumn(JTable table, int colIndex, int margin) {
        DefaultTableColumnModel colModel = (DefaultTableColumnModel)table.getColumnModel();
        TableColumn col = colModel.getColumn(colIndex);
        int width = 0;
       
        // Get width of column header
        TableCellRenderer renderer = col.getHeaderRenderer();
        if (renderer == null) {renderer = table.getTableHeader().getDefaultRenderer();}
        Component comp = renderer.getTableCellRendererComponent(table, col.getHeaderValue(), false, false, 0, 0);
        width = comp.getPreferredSize().width;
       
        // Get maximum width of column dataTable
        for (int r=0; r<table.getRowCount(); r++) {
            renderer = table.getCellRenderer(r, colIndex);
            comp = renderer.getTableCellRendererComponent(table, table.getValueAt(r, colIndex), false, false, r, colIndex);
            width = Math.max(width, comp.getPreferredSize().width);
        }
       
        // Add margin
        width += 2*margin;
       
        // Set the width
        col.setPreferredWidth(width);
    }
}
----------------------------------------------------------------------
Avatar billede _carsten Nybegynder
27. juli 2005 - 15:00 #1
Flytning af en kolonne vil ALDRIG flytte data i din model, de beholder samme placering.

Vil du have flyttet data i modellen, skal du selv gøre det.
Avatar billede mungojerrie Nybegynder
27. juli 2005 - 15:05 #2
nu er det jo så ikke en kolonne, jeg vil flytte men en eller flere rækker :-)
og disse kan jeg godt flytte med moveRow metoden, men fordi jeg har en anden cellEditor end default, så kommer jeg i problemer.....
Avatar billede _carsten Nybegynder
27. juli 2005 - 17:39 #3
Nej - det er samme resultat, en omrokering i tabellen (GUI-delen) ændrer intet i modellen.

Data's placering i tabellen contra placering i modellen styrer java vha. indexer.
Avatar billede _carsten Nybegynder
27. juli 2005 - 17:44 #4
Hmmm - vent lige lidt !!!!
Avatar billede _carsten Nybegynder
27. juli 2005 - 18:09 #5
Du har ret - fik lige set at moveRow() er en metode i DefaultTableModel, og den flytter rent faktisk data i modellen for derefter at opdatere tabellen.

Skal nok kigge på din kode senere på aftenen - håber at nå det!
Avatar billede _carsten Nybegynder
27. juli 2005 - 18:38 #6
Jeg ikke umiddelbart se nogen problemer i din kode.

Hvordan kalder du moveRow(), det kan jeg ikke se nogen steder ?

Får du nogen fejl ??
Avatar billede mungojerrie Nybegynder
27. juli 2005 - 21:26 #7
ups, koden hvor jeg kalder moverow() har jeg lige glemt, den kommer i morgen, men den bliver kaldt fra min main klasse, hvor jeg har en knap hvis actionlistener fyrer den af således :

//DataTableModel dtm
dtm.moverow(start, end, to)

nej, jeg får sjovt nok ingen fejl når den bliver kaldt.....
Avatar billede _carsten Nybegynder
27. juli 2005 - 22:20 #8
Okay - lyder lidt som om den ikke bliver kaldt, men vi ser i morgen..
Avatar billede mungojerrie Nybegynder
28. juli 2005 - 09:05 #9
her kommer min gui klasse:

jeg kalder moveRow gennem min MyMoveRow i min actionlistener som sidder på min knap

package dk.elopak.client.gui;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;

public class GUI extends JApplet {
   
    public static boolean DEBUG = true;
    DataTable dataTable = null;
    static JButton moveRowsBtn;
    private final java.text.DateFormat dateFormat = new java.text.SimpleDateFormat("dd.MM.yy HH:mm");
   
    int start = 0; //pointers used for movings tablerows
    int end = 0; //pointers used for movings tablerows
    int to = 0; //pointers used for movings tablerows
   
    public void paint(Graphics g) {super.paint(g);}
   
    public void start() {super.start();}
   
    public void stop() {super.stop();}
   
    public void destroy() {super.destroy();}
   
    public void init() {
        try {
            super.init();
            javax.swing.SwingUtilities.invokeAndWait(new Runnable() {
                public void run() {
                    createAndShowGUI();
                }
            });
        } catch (Exception e) {
            System.err.println("createGUI didn't successfully complete");
            e.printStackTrace();
        }
    }
   
    private ActionListener actionListener = new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if (e.getActionCommand().equals("Move") || e.getActionCommand().equals("Insert")) {
                if(dataTable.getSelectedRows().length >= 1){
                    if(moveRowsBtn.getText().equals("Move")){
                        start = dataTable.getSelectedRow();
                        if(dataTable.getSelectedRows().length > 1){
                            int[] temp = dataTable.getSelectedRows();
                            end = temp[temp.length-1];
                            if(end > dataTable.getRowCount())end = dataTable.getRowCount()-1;
                        }else{
                            end = dataTable.getSelectedRow();
                        }
                        moveRowsBtn.setText("Insert");
                        return;
                    }
                    if(moveRowsBtn.getText().equals("Insert")){
                        to = dataTable.getSelectedRow();
                        if(to > dataTable.getRowCount())to = dataTable.getRowCount()-1;
                        myMoveRow(start, end, to);
                        moveRowsBtn.setText("Move");
                        start = 0;
                        end = 0;
                        to = 0;
                        return;
                    }
                }
            }
        }
    };

    public void myMoveRow(int startRow, int endRow, int dest) {
        if(GUI.DEBUG){
            System.out.println("start er: " + start);
            System.out.println("end er: " + end);
            System.out.println("to er: " + dest);
        }
        try {
            DataTableModel dtm = (DataTableModel)dataTable.getModel();
            dtm.moveRow(startRow, endRow, dest);
            //printDebugData(dataTable);
        } catch (ArrayIndexOutOfBoundsException aib){
            aib.printStackTrace();
        }
    }
   
    public void createAndShowGUI() {     

        dataTable = new DataTable(new DataTableModel()){
            public Component prepareRenderer(TableCellRenderer renderer, int rowIndex, int vColIndex) {
                Component c = super.prepareRenderer(renderer, rowIndex, vColIndex);
                if (c instanceof JComponent) {
                    JComponent jc = (JComponent)c;
                    Object o = getValueAt(rowIndex, vColIndex);
                    try {
                        jc.setToolTipText((String)getValueAt(rowIndex, 12));
                    } catch (Exception e) {}
                }
                return c;
            }
       
        };
        dataTable.setPreferredScrollableViewportSize(new Dimension(1024, 600));

        //Create the scroll pane and add the table to it.
        JScrollPane scrollPane = new JScrollPane(dataTable);

        //Set up renderer and editor for the Favorite Color column.
        dataTable.setDefaultRenderer(Color.class, new ColorRenderer(true));
        dataTable.getColumnModel().getColumn(13).setCellEditor(new IntegerEditor(0, 1000));
        dataTable.getColumnModel().getColumn(14).setCellEditor(new IntegerEditor(0, 1000));
        dataTable.getColumnModel().getColumn(15).setCellEditor(new IntegerEditor(0, 1000));
        dataTable.getColumnModel().getColumn(16).setCellEditor(new IntegerEditor(0, 1000));

        //Add the scroll pane to this panel.
        JPanel topPanel = new JPanel();
       
        JComboBox machines = new JComboBox();
        machines.addItem("Machine #1");
       
        JLabel lastUpdated = new JLabel();
        java.sql.Timestamp d = new java.sql.Timestamp(System.currentTimeMillis());
        lastUpdated.setText("Last updated : " + dateFormat.format(d));
       
        moveRowsBtn = new JButton("Move");
        moveRowsBtn.addActionListener(actionListener);

        topPanel.add(machines);
        topPanel.add(lastUpdated);
        topPanel.add(moveRowsBtn);
       
        JPanel bottomPanel = new JPanel();   

        scrollPane.setViewportView(dataTable);
       
        bottomPanel.add(scrollPane);
       
        JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, topPanel, scrollPane);
        splitPane.setDividerLocation(130);
        splitPane.setEnabled(false);
       
        getContentPane().add(splitPane, BorderLayout.CENTER);
       
        /*if (DEBUG) {
            dataTable.addMouseListener(new MouseAdapter() {
                public void mouseClicked(MouseEvent e) {
                    printDebugData(dataTable);
                }
            });
        }*/
       
    }
   
    static void printDebugData(JTable table) {
        int numRows = table.getRowCount();
        int numCols = table.getColumnCount();
        javax.swing.table.TableModel model = table.getModel();
       
        System.out.println("Value of dataTable: ");
        for (int i=0; i < numRows; i++) {
            System.out.print("    row " + i + ":");
            for (int j=0; j < numCols; j++) {
                System.out.print("  " + model.getValueAt(i, j));
            }
            System.out.println();
        }
        System.out.println("--------------------------");
    }
}
Avatar billede _carsten Nybegynder
28. juli 2005 - 15:29 #10
Har lyn kigget på det -  og du mangler i hverfald at kalde metoden, se STOR TEKST

    private ActionListener actionListener = new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if (e.getActionCommand().equals("Move") || e.getActionCommand().equals("Insert")) {
                if(dataTable.getSelectedRows().length >= 1){
                    if(moveRowsBtn.getText().equals("Move")){
                        start = dataTable.getSelectedRow();              / OK
                        if(dataTable.getSelectedRows().length > 1){
                            int[] temp = dataTable.getSelectedRows();
                            end = temp[temp.length-1];
                            if(end > dataTable.getRowCount())end = dataTable.getRowCount()-1;
                        }else{
                            end = dataTable.getSelectedRow();
                        }
                        moveRowsBtn.setText("Insert");  // DU GLEMMER AT KALDE
                                                        // METODEN INDEN DU RETURNERER
                                                        // DU GLEMMER ANGIVE HVOR RÆKKERNE
                                                        // SKAL FLYTTES HEN
                        return;
                    }
                    if(moveRowsBtn.getText().equals("Insert")){
                        to = dataTable.getSelectedRow();
                        if(to > dataTable.getRowCount())to = dataTable.getRowCount()-1;
                        myMoveRow(start, end, to);
                        moveRowsBtn.setText("Move");
                        start = 0;
                        end = 0;
                        to = 0;
                        return;
                    }
                }
            }
        }
    };
Avatar billede mungojerrie Nybegynder
28. juli 2005 - 15:34 #11
øhh, jeg skal vel ikke kalde metoden før jeg skal indsætte og jeg får da også gemt, hvor mine data skal flyttes fra....
Avatar billede _carsten Nybegynder
28. juli 2005 - 16:25 #12
Indsætte ?????

Går dit spørgsmål ikke på at "flytte rundt på rækker vha. knap" ??
Avatar billede mungojerrie Nybegynder
28. juli 2005 - 16:50 #13
jo beklager den dårlige formulering....med "insert" mener jeg hvor jeg skal flytte de markerede celler til (destination bestemmes ved "insert")
Avatar billede _carsten Nybegynder
28. juli 2005 - 17:00 #14
Øhhh vi misforstår hinanden lidt, men som din kode er udformet vil det aldrig fungere.

RET:
                    if(moveRowsBtn.getText().equals("Insert")){
                        to = dataTable.getSelectedRow();
                        if(to > dataTable.getRowCount())to = dataTable.getRowCount()-1;
                        myMoveRow(start, end, to);
                        moveRowsBtn.setText("Move");
                        start = 0;
                        end = 0;
                        to = 0;
                        return;
                    }



TIL:
                    if(moveRowsBtn.getText().equals("Insert")){
                        start = dataTable.getSelectedRow();
                        end = start;
                        to = dataTable.getRowCount()-1;
                        myMoveRow(start, end, to);
                        moveRowsBtn.setText("Move");
                        start = 0;
                        end = 0;
                        to = 0;
                        return;
                    }

Hvis knappens tekst == "Insert" vil den valgte række blive flyttet til sidste række i tabellen

Test lige om ikke det sker !!
Avatar billede _carsten Nybegynder
28. juli 2005 - 20:11 #15
Er der behov for et eksempel ??

import javax.swing.table.DefaultTableModel;

public class TestRowMove extends javax.swing.JFrame {
   

    public TestRowMove() {
        initComponents();
    }
   

    private void initComponents() {
        scroll = new javax.swing.JScrollPane();
        table = new javax.swing.JTable();
        jButton1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        table.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {"1", "2", "3", "4"},
                {"a", "b", "c", "d"},
                {"9", "8", "7", "6"},
                {"z", "x", "c", "v"},
                {"A", "B", "C", "D"},
                {"X", "C", "V", "B"},
                {"Q", "W", "E", "R"}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        scroll.setViewportView(table);

        getContentPane().add(scroll, java.awt.BorderLayout.CENTER);

        jButton1.setText("Move one row");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                move(evt);
            }
        });

        getContentPane().add(jButton1, java.awt.BorderLayout.NORTH);

        pack();
    }


    private void move(java.awt.event.ActionEvent evt) {                     
        DefaultTableModel model = (DefaultTableModel)table.getModel();
        int to = table.getRowCount() - 1;
        int[] selected = table.getSelectedRows();
        int moved = 0;
       
        for(int i = 0; i < table.getRowCount(); i++){
            for(int x = 0; x < table.getColumnCount(); x++){
                System.out.print("\t" + model.getValueAt(i, x).toString());

            }
            for(int x = 0; x < selected.length; x++){
                if(i == selected[x])
                    System.out.print("\tmoved !");
            }
            System.out.println("");
        }
       
        for(int y = 0; y < selected.length ; y++){
            model.moveRow(selected[y - moved], selected[y - moved], to);
            moved++;

            System.out.println("");
        }
    }                   
   
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new TestRowMove().setVisible(true);
            }
        });
    }
   
    private javax.swing.JButton jButton1;
    private javax.swing.JScrollPane scroll;
    private javax.swing.JTable table;
}
Avatar billede _carsten Nybegynder
28. juli 2005 - 20:12 #16
Prøv at markere én eller flere rækker og tryk på knappen
Avatar billede mungojerrie Nybegynder
29. juli 2005 - 09:44 #17
hej igen
det eksempel virker som du siger, men det løser ikke mit problem.....jeg kan nemt få min model til at flytte data også på den måde jeg har lavet min knap på (jeg er jo nødt til at vide hvor jeg skal flytte rækkerne hen og ikke bare til bunden af tabellen)

problemet kommer først når jeg ligger en cellEditor på og en cellRender og overskriver getValueAt og setValueAt metoderne på min tablemodel
Avatar billede _carsten Nybegynder
29. juli 2005 - 12:35 #18
Hvis du vil indsætte en række, skal du ikke bruge moveRow(), men insertRow().

"problemet kommer først når jeg ligger en cellEditor på og en cellRender".
- Så er det jo din implementation af dem vil skal se, for det bør ikke være et problem.

Se nedenstående eksempel med insertRow(), indsætter en række over valgt række.



import java.util.Vector;
import javax.swing.table.DefaultTableModel;

public class TestInsertRow extends javax.swing.JFrame {
   
   
    public TestInsertRow() {
        initComponents();
    }
   
    private void initComponents() {
        scroll = new javax.swing.JScrollPane();
        table = new javax.swing.JTable();
        button = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        table.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {"q", "w", "e", "r"},
                {"Q", "W", "E", "R"},
                {"z", "x", "c", "v"},
                {"Z", "X", "C", "V"}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        scroll.setViewportView(table);

        getContentPane().add(scroll, java.awt.BorderLayout.CENTER);

        button.setText("jButton1");
        button.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                insert(evt);
            }
        });

        getContentPane().add(button, java.awt.BorderLayout.NORTH);

        pack();
    }

    private void insert(java.awt.event.ActionEvent evt) {
        DefaultTableModel model = (DefaultTableModel)table.getModel();
       
        model.insertRow(table.getSelectedRow(), new Vector());
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new TestInsertRow().setVisible(true);
            }
        });
    }

    private javax.swing.JButton button;
    private javax.swing.JScrollPane scroll;
    private javax.swing.JTable table;
}
Avatar billede _carsten Nybegynder
31. juli 2005 - 10:59 #19
Kommet videre ??
Avatar billede mungojerrie Nybegynder
01. august 2005 - 11:36 #20
jeg får først kigget på det i morgen, har lige noget mere preserende....
Avatar billede mungojerrie Nybegynder
02. august 2005 - 08:26 #21
hej igen, jeg kan godt se jeg ikke er god til at forklare mig, min "insert" betyder stadig væk, hvor jeg skal flytte de(n) markerede felter hen og ikke "insert" som i "insertrow".

Hvis du har tålmodighed til det, kunne jeg godt tænke mig om du gad at tilføje klassen IntegerEditor til dit eksempel og se om du stadig kan få skidtet til at flytte rundt på rækkerne, da jeg først får problemet efter at have tilføjet min nye celleditor (IntegerEditor) :-)
Avatar billede _carsten Nybegynder
02. august 2005 - 17:43 #22
Det kan jeg godt.

Her er det hele, din editor er tilføjet kolonne 1 (0)

import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.text.NumberFormat;
import javax.swing.AbstractAction;
import javax.swing.DefaultCellEditor;
import javax.swing.JFormattedTextField;
import javax.swing.JOptionPane;
import javax.swing.KeyStroke;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.text.DefaultFormatterFactory;
import javax.swing.text.NumberFormatter;

public class TestRowMove extends javax.swing.JFrame {
   
    public TestRowMove() {
        initComponents();
        // HER TILFØJES EDITOR !!!
        TableColumn col = table.getColumnModel().getColumn(0);
        col.setCellEditor(new IntegerEditor(5,5));
    }

    private void initComponents() {
        scroll = new javax.swing.JScrollPane();
        table = new javax.swing.JTable();
        jButton1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        table.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {new Integer(1), "2", "3", "4"},
                {new Integer(2), "b", "c", "d"},
                {new Integer(3), "8", "7", "6"},
                {new Integer(4), "x", "c", "v"},
                {new Integer(5), "B", "C", "D"},
                {new Integer(666), "C", "V", "B"},
                {new Integer(99999), "W", "E", "R"}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.Integer.class, java.lang.Object.class, java.lang.Object.class, java.lang.Object.class
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }
        });
        scroll.setViewportView(table);

        getContentPane().add(scroll, java.awt.BorderLayout.CENTER);

        jButton1.setText("Move one row");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                move(evt);
            }
        });

        getContentPane().add(jButton1, java.awt.BorderLayout.NORTH);

        pack();
    }

    private void move(java.awt.event.ActionEvent evt) {                     
        DefaultTableModel model = (DefaultTableModel)table.getModel();
        int to = table.getRowCount() - 1;
        int[] selected = table.getSelectedRows();
        int moved = 0;
       
        for(int i = 0; i < table.getRowCount(); i++){
            for(int x = 0; x < table.getColumnCount(); x++){
                System.out.print("\t" + model.getValueAt(i, x).toString());

            }
            for(int x = 0; x < selected.length; x++){
                if(i == selected[x])
                    System.out.print("\tmoved !");
            }
            System.out.println("");
        }
       
        for(int y = 0; y < selected.length ; y++){
            model.moveRow(selected[y - moved], selected[y - moved], to);
            moved++;

            System.out.println("");
        }
    }                   
   
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new TestRowMove().setVisible(true);
            }
        });
    }
   
    private javax.swing.JButton jButton1;
    private javax.swing.JScrollPane scroll;
    private javax.swing.JTable table;
}


class IntegerEditor extends DefaultCellEditor {
    JFormattedTextField ftf;
    NumberFormat integerFormat;
    private Integer minimum, maximum;
    private boolean DEBUG = true;
   
    public IntegerEditor(int min, int max) {
       
        super(new JFormattedTextField());
        ftf = (JFormattedTextField)getComponent();
        minimum = new Integer(min);
        maximum = new Integer(max);
       
        //Set up the editor for the integer cells.
        integerFormat = NumberFormat.getIntegerInstance();
        NumberFormatter intFormatter = new NumberFormatter(integerFormat);
        intFormatter.setFormat(integerFormat);
        intFormatter.setMinimum(minimum);
        intFormatter.setMaximum(maximum);
       
        ftf.setFormatterFactory(new DefaultFormatterFactory(intFormatter));
        ftf.setValue(minimum);
        ftf.setHorizontalAlignment(SwingConstants.TRAILING);
        ftf.setFocusLostBehavior(JFormattedTextField.PERSIST);
       
        //React when the user presses Enter while the editor is
        //active.  (Tab is handled as specified by
        //JFormattedTextField's focusLostBehavior property.)
        ftf.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "check");
        ftf.getActionMap().put("check", new AbstractAction() {
            public void actionPerformed(ActionEvent e) {
                if (!ftf.isEditValid()) { //The text is invalid.
                    if (userSaysRevert()) { //reverted
                        ftf.postActionEvent(); //inform the editor
                    }
                } else try {              //The text is valid,
                    ftf.commitEdit();    //so use it.
                    ftf.postActionEvent(); //stop editing
                } catch (java.text.ParseException exc) {
                    System.out.println("parse exception");
                }
            }
        });
    }
   
        protected boolean userSaysRevert() {
        Toolkit.getDefaultToolkit().beep();
        ftf.selectAll();
        Object[] options = {"Edit",
        "Revert"};
        int answer = JOptionPane.showOptionDialog(
                SwingUtilities.getWindowAncestor(ftf),
                "The value must be an integer between "
                + minimum + " and "
                + maximum + ".\n"
                + "You can either continue editing "
                + "or revert to the last valid value.",
                "Invalid Text Entered",
                JOptionPane.YES_NO_OPTION,
                JOptionPane.ERROR_MESSAGE,
                null,
                options,
                options[1]);
       
        if (answer == 1) { //Revert!
            ftf.setValue(ftf.getValue());
            return true;
        }
        return false;
    }
}
Avatar billede mungojerrie Nybegynder
03. august 2005 - 09:22 #23
hmm, jeg har vist husket fejl.....problemet opstår når jeg laver min egen tablemodel og overskriver de default metoder klassen har til data udtræk..... :


package test;

import java.awt.Color;
import java.util.Date;

import javax.swing.table.DefaultTableModel;


public class DataTableModel extends DefaultTableModel {
 
    private static boolean DEBUG = false;
   
    private static String[] columnNames = {
            "Urgent",
            "Order #",
            "Design",
            "Dlv. date",
            "Order size",
            "Produced",
            "Tool",
            "Board",
            "Customer",
            "Text",
            "Sheet status",
            "Order location",
            "Comment",
            "#1",
            "#2",
            "#3",
            "#4"
        };
    private static Object[][] data = {
            {new Boolean(true), "8562232", "K9415-12121", new Date(), new Integer(30000), new Integer(400), "", "", "", "", Color.GREEN, Color.red, "", new Integer(0), new Integer(0), new Integer(0), new Integer(0)},
            {new Boolean(false), "9900909", "K9415-12121", new Date(), new Integer(30000), new Integer(400), "", "", "", "", Color.red, Color.GREEN, "", "", "", "", ""},
            {new Boolean(false), "1110011", "K9415-12121", new Date(), new Integer(30000), new Integer(400), "", "", "", "", Color.GREEN, Color.red, "", "", "", "", ""},
            {new Boolean(true), "7775577", "K9415-12121", new Date(), new Integer(30000), new Integer(400), "", "", "", "", Color.red, Color.GREEN, "", "", "", "", ""},
            {new Boolean(false), "12345678", "K9415-12121", new Date(), new Integer(30000), new Integer(400), "", "", "", "", Color.red, Color.green, "", "", "", "", ""},
    };
 
    public DataTableModel(){
        super(data, columnNames);
    }
 
    public int getColumnCount() {return columnNames.length;}
    public int getRowCount() {return data.length;} 
    public String getColumnName(int col) {return columnNames[col];}
    public Object getValueAt(int row, int col) {return data[row][col];}
    public Class getColumnClass(int c) {return getValueAt(0, c).getClass();}

    public boolean isCellEditable(int row, int col) {
        if(col > 12 && col < 17){return true;}
        return false;
    }
 
    public void setValueAt(Object value, int row, int col) {
        if (DEBUG) {
            System.out.println("Setting value at " + row + "," + col
                    + " to " + value
                    + " (an instance of "
                    + value.getClass() + ")");
        }
     
        data[row][col] = value;
        fireTableCellUpdated(row, col);
     
        if (DEBUG) {
            System.out.println("New value of dataTable:");
            printDebugData();
        }
    }
 
    private void printDebugData() {
        int numRows = getRowCount();
        int numCols = getColumnCount();
     
        for (int i=0; i < numRows; i++) {
            System.out.print("    row " + i + ":");
            for (int j=0; j < numCols; j++) {
                System.out.print("  " + data[i][j]);
            }
            System.out.println();
        }
        System.out.println("--------------------------");
    }
}
Avatar billede _carsten Nybegynder
03. august 2005 - 12:39 #24
Fik lige tid til et hurtigt kig.

Du overrider setValueAt(), selvom der egentlig ikke er nogen grund til det, da det kun er debugging du kigger på.

Men - hvis du gør det skal den se sådan ud - prøv lige det!

    public void setValueAt(Object value, int row, int col) {
        if (DEBUG) {
            System.out.println("Setting value at " + row + "," + col
                    + " to " + value
                    + " (an instance of "
                    + value.getClass() + ")");
        }
     
        super.setValueAt(value, row, col);
        fireTableCellUpdated(row, col);
     
        if (DEBUG) {
            System.out.println("New value of dataTable:");
            printDebugData();
        }
    }
Avatar billede mungojerrie Nybegynder
04. august 2005 - 15:29 #25
det er sgu godt du ikke lader dig skræmme af mine dårlige evner til at forklare mig :-)
du har i hvert fald løst problemet!! smid et svar :-)
Avatar billede _carsten Nybegynder
04. august 2005 - 15:37 #26
:-)

Kommer her.
Avatar billede mungojerrie Nybegynder
05. august 2005 - 13:10 #27
hej igen (håber jeg kan lokke med dig igen, vil naturligvis gerne give flere point)

Har fået lidt problemer igen

Jeg vil gerne lave mig en klasse mere der extender min normale tablemodel som jo igen extender defaulttablemodel. Det skyldes jeg gerne vil holde et pænt snit mellem mine klasser der har med GUI/Server del at gøre

Jeg har altså lavet en ny klasse DataTableGUIModel der extender min DataTableServerModel der extender DefaultTableModel

Jeg kommer igen i klemme med "moverow" metoden :-(

Koden :


package test;

import java.awt.Color;
import java.util.Date;


/**
* @author Jan Gravgaard
*
*/
public class DataTableGUIModel extends DataTableServerModel {
 
 
    private static Object[][] data;
    private static String[] columnNames;
   
    public DataTableGUIModel(Object[][] objects, String[] strings){
        super(objects, strings);
    }
 
    public int getColumnCount() {
        return super.getColumnNames().length;
    }
   
    public int getRowCount() {
        if(super.getRowdata()==null)return 0;
        return super.getRowdata().length;
    } 
    public String getColumnName(int col) {return super.getColumnNames()[col];}
    public Object getValueAt(int row, int col) {return super.getRowdata()[row][col];}
    public Class getColumnClass(int c) {return super.getValueAt(0, c).getClass();}
 
}

-----------------------------------------------------------------------------------------
package test;

import javax.swing.table.DefaultTableModel;

/**
* @author Jan Gravgaard
*
*/
/**
* @author Jan Gravgaard
* This class extends the DefaultTableModel
*/
public abstract class DataTableServerModel extends DefaultTableModel {
   
    protected static String urgent = "";
    protected static String orderNumber = "";
    protected static String design = "";
    protected static String dlvDate = "";
    protected static String orderSize = "";
    protected static String produced = "";
    protected static String tool = "";
    protected static String board = "";
    protected static String comment = "";
   
    private static Object[][] rowdata;
    private static String[] columnNames;
   
    public DataTableServerModel(Object[][] data, String[] columnNames2){
        setRowdata(data);
        setColumnNames(columnNames2);
    }
    public int getColumnCount() {
        if(columnNames==null)return 0;
        return columnNames.length;
    }
    public int getRowCount() {
        if(rowdata==null)return 0;
        return rowdata.length;
    } 
    public String getColumnName(int col) {
        return columnNames[col];
    }
    public Object getValueAt(int row, int col) {
        return rowdata[row][col];
    }
    public Class getColumnClass(int c) {
        return getValueAt(0, c).getClass();
    }

    public void setValueAt(Object value, int row, int col) {
        super.setValueAt(value, row, col);
        fireTableCellUpdated(row, col);
    }   

    public boolean isCellEditable(int row, int col) {
        if(col > 12 && col < 17){return true;}
        return false;
    }
 
    public static String[] getColumnNames() {
        return columnNames;
    }
   
    public static void setColumnNames(String[] headers) {
        DataTableServerModel.columnNames = headers;
    }
   
    public static Object[][] getRowdata() {
        return rowdata;
    }
   
    public static void setRowdata(Object[][] data) {
        DataTableServerModel.rowdata = data;
    }
}

-----------------------------------------------------------------------------------------
package test;

import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.text.NumberFormat;
import javax.swing.AbstractAction;
import javax.swing.DefaultCellEditor;
import javax.swing.JFormattedTextField;
import javax.swing.JOptionPane;
import javax.swing.KeyStroke;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.text.DefaultFormatterFactory;
import javax.swing.text.NumberFormatter;

public class TestRowMove extends javax.swing.JFrame {
 
   
    int start = 0; //pointers used for movings tablerows
    int end = 0; //pointers used for movings tablerows
    int to = 0; //pointers used for movings tablerows
   
    public TestRowMove() {
        initComponents();
        // HER TILFØJES EDITOR !!!
        TableColumn col = table.getColumnModel().getColumn(0);
        col.setCellEditor(new IntegerEditor(5,5));
    }

    private void initComponents() {
        scroll = new javax.swing.JScrollPane();
        table = new javax.swing.JTable();
        jButton1 = new javax.swing.JButton();
        Object[][] data = new Object [][] {
                {"q", "w", "e", "r"},
                {"Q", "W", "E", "R"},
                {"z", "x", "c", "v"},
                {"Z", "X", "C", "V"}
        };
        String[] headers = new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
        };
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        DataTableGUIModel dtm = new DataTableGUIModel(data,headers);
        table.setModel(dtm);
        scroll.setViewportView(table);

        getContentPane().add(scroll, java.awt.BorderLayout.CENTER);

        jButton1.setText("Move");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                move(evt);
            }
        });

        getContentPane().add(jButton1, java.awt.BorderLayout.NORTH);

        pack();
    }

    private void move(java.awt.event.ActionEvent evt) {                   
        DefaultTableModel model = (DefaultTableModel)table.getModel();
        //int to = table.getRowCount() - 1;
        if(table.getSelectedRows().length >= 1){
            //hvis knappens tekst er lig med "insert" så har brugeren allerede klikket på knappen een gang
            if(jButton1.getText().equals("Move")){
                start = table.getSelectedRow();
                if(table.getSelectedRows().length > 1){
                    int[] temp = table.getSelectedRows();
                    end = temp[temp.length-1];
                    if(end > table.getRowCount())end = table.getRowCount()-1;
                }else{
                    end = table.getSelectedRow();
                }
                jButton1.setText("Insert");
                return;
            }
            if(jButton1.getText().equals("Insert")){
                to = table.getSelectedRow();
                if(to > table.getRowCount())to = table.getRowCount()-1;
                model.moveRow(start, end, to);
                jButton1.setText("Move");
                start = 0;
                end = 0;
                to = 0;
                return;
            }
        }


    }                 
 
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new TestRowMove().setVisible(true);
            }
        });
    }
 
    private javax.swing.JButton jButton1;
    private javax.swing.JScrollPane scroll;
    private javax.swing.JTable table;
}


class IntegerEditor extends DefaultCellEditor {
    JFormattedTextField ftf;
    NumberFormat integerFormat;
    private Integer minimum, maximum;
    private boolean DEBUG = true;
 
    public IntegerEditor(int min, int max) {
     
        super(new JFormattedTextField());
        ftf = (JFormattedTextField)getComponent();
        minimum = new Integer(min);
        maximum = new Integer(max);
     
        //Set up the editor for the integer cells.
        integerFormat = NumberFormat.getIntegerInstance();
        NumberFormatter intFormatter = new NumberFormatter(integerFormat);
        intFormatter.setFormat(integerFormat);
        intFormatter.setMinimum(minimum);
        intFormatter.setMaximum(maximum);
     
        ftf.setFormatterFactory(new DefaultFormatterFactory(intFormatter));
        ftf.setValue(minimum);
        ftf.setHorizontalAlignment(SwingConstants.TRAILING);
        ftf.setFocusLostBehavior(JFormattedTextField.PERSIST);
     
        //React when the user presses Enter while the editor is
        //active.  (Tab is handled as specified by
        //JFormattedTextField's focusLostBehavior property.)
        ftf.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "check");
        ftf.getActionMap().put("check", new AbstractAction() {
            public void actionPerformed(ActionEvent e) {
                if (!ftf.isEditValid()) { //The text is invalid.
                    if (userSaysRevert()) { //reverted
                        ftf.postActionEvent(); //inform the editor
                    }
                } else try {              //The text is valid,
                    ftf.commitEdit();    //so use it.
                    ftf.postActionEvent(); //stop editing
                } catch (java.text.ParseException exc) {
                    System.out.println("parse exception");
                }
            }
        });
    }
 
        protected boolean userSaysRevert() {
        Toolkit.getDefaultToolkit().beep();
        ftf.selectAll();
        Object[] options = {"Edit",
        "Revert"};
        int answer = JOptionPane.showOptionDialog(
                SwingUtilities.getWindowAncestor(ftf),
                "The value must be an integer between "
                + minimum + " and "
                + maximum + ".\n"
                + "You can either continue editing "
                + "or revert to the last valid value.",
                "Invalid Text Entered",
                JOptionPane.YES_NO_OPTION,
                JOptionPane.ERROR_MESSAGE,
                null,
                options,
                options[1]);
     
        if (answer == 1) { //Revert!
            ftf.setValue(ftf.getValue());
            return true;
        }
        return false;
    }
}
Avatar billede mungojerrie Nybegynder
05. august 2005 - 13:11 #28
Fejlen fra "moverow" er :

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 1 >= 0
    at java.util.Vector.elementAt(Unknown Source)
    at javax.swing.table.DefaultTableModel.rotate(Unknown Source)
    at javax.swing.table.DefaultTableModel.moveRow(Unknown Source)
    at test.TestRowMove.move(TestRowMove.java:86)
Avatar billede _carsten Nybegynder
05. august 2005 - 18:21 #29
Det her er hamrende svært at forklare så det er forståeligt, men jeg prøver alligevel

Hvis du skal have det til at virke på den måde, er du nødt til at override metoden moveRow() i din DataTableServerModel.


Forklaring:
DataTableServerModel har sit EGET array af typen Object til at holde tabeldata og et String object til at holde kolonnetekster, MEN - MEN det har klassen som du extender OGSÅ !!
Du initierer altså  Object[][] rowdata i DataTableServerModel med tabeldata == 4 rækker, vectoren i DefaultTableModel initieres IKKE med data, da metoden moveRow() i klassen DefaultTableModel IKKE overrides i DataTableServerModel, så er det altså den metode der kaldes, metoden begynder at flytte rækker i vectoren i DefaultTableModel (IKKE DATAENE I DataTableServerModel), da vectoren er tom, er der ikke nogen rækker at flytte rundt på, derfor får du fejlen java.lang.ArrayIndexOutOfBoundsException: 1 >= 0


Det eneste du tilsyneladende er interesseret i er at nogle kolonner må redigeres og andre ikke, du overrider en del metoder, men kun hvad der er default i fht. DefaultTableModel, så din DataTableServerModel bør se sådan ud.

public abstract class DataTableServerModel extends DefaultTableModel {

    public DataTableServerModel(Object[][] data, String[] columnNames2){
        super(data, columnNames2);
    }

    public boolean isCellEditable(int row, int col) {
        if(col > 12 && col < 17)
            return true;
        return false;
    }
}


Din DataTableGUIModel ser jeg som et overflødigt/generende element - den gør INTET som i forvejen ikke standard/default i DefaultTableModel



LØSNING:

    Fjern klassen: DataTableGUIModel
    Ret DataTableServerModel til ovenstående

    Jeg kan ikke helt gennemskue din move() "Insert" delen, så pt. står jeg af på den

Jeg ved ikke om det rækker, ellers må spørge igen.
Avatar billede mungojerrie Nybegynder
09. august 2005 - 10:42 #30
hej igen....tak fordi du gider at hjælpe igen....nu har jeg vist fået det løst
vil du ikke gerne have lidt flere point for hjælpen ? :-)
Avatar billede _carsten Nybegynder
09. august 2005 - 14:54 #31
Nej, det er OK :)
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