Avatar billede mungojerrie Nybegynder
20. juli 2005 - 16:14 Der er 10 kommentarer og
1 løsning

JTable og TableModel m.m.

Hej jeg har lige et par småting der driller ved min JTable

1)
Når jeg får vist min tabel, så har den ingen column headers og jeg har ikke lige kunnet gennemskue hvad jeg har gjort galt.....

2) Jeg vil gerne vise en en bestemt celle med en anden baggrund end de andre og jeg har set eksempler på at man kan gøre det ved at angive det i sit dataset, sådan her:
private Object[][] data = {"felt1",.....,new Color(51, 51, 153),....."flere felter"}

3) Jeg vil også gerne kunne vise 4 små tekstfelter ved siden af hinanden i samme celle. Det har jeg forsøgt på med klassen TrackField, men det bliver ikke vist korrekt....

Hele min kode kommer her.....

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

public class TrackField {

    private JTextField field1 = new JTextField();
    private JTextField field2 = new JTextField();
    private JTextField field3 = new JTextField();
    private JTextField field4 = new JTextField();
   
    public TrackField()
    {
        JPanel container = new JPanel(new FlowLayout());
        container.add(field1);
        container.add(field2);
        container.add(field3);
        container.add(field4);
    }
}

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

public class GUI extends JApplet implements MouseListener {
   
    public static JButton moveRows;
    public void destroy() {
        super.destroy();
       
        // insert code to release resources here
    }
   
    public void mouseClicked(MouseEvent e) {}
    public void mouseEntered(MouseEvent e) {}
    public void mouseExited(MouseEvent e) {}
    public void mousePressed(MouseEvent e) {}
    public void mouseReleased(MouseEvent e) {}
   
    static {
        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
            //UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
            //UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
           
        }
        catch (Exception e) {} // If no Windows look and feel, just use default
    }
   
    public void paint(Graphics g) {
        super.paint(g);
        // insert code to paint the applet here
    }
   
    public void start() {super.start();   
        // insert any code to be run when the applet starts here
    }
   
    public void stop() {super.stop();       
        // insert any code to be run when the applet is stopped here
    }
   
    public void init() {
        try {
            super.init();
            addMouseListener(this);
            javax.swing.SwingUtilities.invokeAndWait(new Runnable() {
                public void run() {
                    createGUI();
                }
            });
        } catch (Exception e) {
            System.err.println("createGUI didn't successfully complete");
        }
    }

    private ActionListener actionListener = new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if (e.getSource() == moveRows) {
                //find markeret række og husk på placeringen
                //skift tekst på knappen og husk på at knappen er aktiveret, således at
                //når brugeren igen klikker på knappen
                //skal der byttes rundt på to eller flere linjer i tabellen
                //if()
            }
           
        }
    };
    private void createGUI() {
        DataTableModel dtm = new DataTableModel();
        DataTable data = new DataTable(dtm);
       
        JPanel topPanel = new JPanel();
       
        JComboBox machines = new JComboBox();
        machines.addItem("Maskine 1");
       
        JLabel lastUpdated = new JLabel("Sidst opdateret :" + new Date());
       
        moveRows = new JButton("Move");
        moveRows.addActionListener(actionListener);

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

        JScrollPane scrollPane = new JScrollPane();
        scrollPane.add(bottomPanel);
        scrollPane.setViewportView(bottomPanel);
       
        JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, topPanel, scrollPane);
        splitPane.setDividerLocation(130);
        splitPane.setEnabled(false);
       
        getContentPane().add(splitPane, BorderLayout.CENTER);
    }
}

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


public class DataTableModel extends AbstractTableModel {
   
    private int numberColumns = 14;
   
    private String[] columnNames = {"Urgent","Order #","Design","Dlv. date","Order size","Produced","Tool","Board","Customer","Text","Sheet status","Order location","Comment","Track"};
   
    private Object[][] data = {
            {new Boolean(false), "828496","K9165-AAA", new Date(), "100.000", "297.500", "2/1 B-Slant Ext", "54/0675", "CoRo Food", "Original appelsin", new Color(51, 51, 153), Color.green, "Kommentar", new TrackField()},
            {new Boolean(true), "828496","K9165-AAA", new Date(), "100.000", "297.500", "2/1 B-Slant Ext", "54/0675", "CoRo Food", "Original appelsin", Color.red + "Ej klar", "DTP" + Color.green, "Kommentar", new TrackField()}
    };
   
    public DataTableModel() {}
   
    public Class getColumnClass(int c) {return getValueAt(0, c).getClass();}   
    public Object getValueAt(int row, int col) {return data[row][col];}
    public int getColumnCount() { return numberColumns; }
    public String getColumnName(int column) { return columnNames[column]; }
    public int getRowCount() {return data.length;}
}

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


public class DataTable extends JTable {
   
    DataTableModel tableModel = null;
    DataTable table = null;

   
    public DataTable(TableModel tm) {
        super(tm);
        table = this;
        tableModel = (DataTableModel)tm;
       
        /*
        getTableHeader().setReorderingAllowed(false);
        setDragEnabled(false);
        setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);//skal ændres ift bruger
        setShowHorizontalLines(true);
        setGridColor(Color.lightGray);
        //setShowVerticalLines(false);
          configureEnclosingScrollPane();
          setAutoResizeMode(AUTO_RESIZE_OFF);
          setFont(new java.awt.Font("Dialog", java.awt.Font.PLAIN, 11));
          setColumnSelectionAllowed(true);
          setRowSelectionAllowed(true);
          setCellSelectionEnabled(true);*/
        setPreferredScrollableViewportSize(new Dimension(975, 745));
       
       
        //tilføj listlistener
        /*ListSelectionModel rowSM = getSelectionModel();
        rowSM.addListSelectionListener(new ListSelectionListener() {
        public void valueChanged(ListSelectionEvent e) {
       
        }
        });*/   
       
        //tilføj mouselistener
        /*addMouseListener(new MouseAdapter() {
        public void mouseClicked(MouseEvent e) {
        if (e.getButton() == MouseEvent.BUTTON3) {
        int[] rows = getSelectedRows();
        if (rows.length < 2) {
        int row = rowAtPoint(e.getPoint());
        if (row != -1 && (rows.length == 0 || (rows.length == 1 && rows[0] != row))) {
        table.clearSelection();
        table.addRowSelectionInterval(row, row);
        table.addColumnSelectionInterval(0, table.getColumnCount()-1);
        }
        }
        rows = getSelectedRows();
       
        if (rows.length > 0) {
        }
        }
        //Vis info vinduet ved dobbeltklik på en vilkårlig række i tabellen
          if (e.getButton() == MouseEvent.BUTTON1 && e.getClickCount() == 2) {
          }
          }
          });*/
        //resetSizes();
        packColumns(this, 2);
    }
   
    public void resetSizes() {
        getColumnModel().getColumn(0).setPreferredWidth(30);
        getColumnModel().getColumn(1).setPreferredWidth(60);
        getColumnModel().getColumn(2).setPreferredWidth(90);
        getColumnModel().getColumn(3).setPreferredWidth(150);
        getColumnModel().getColumn(4).setPreferredWidth(50);
        getColumnModel().getColumn(5).setPreferredWidth(50);
        getColumnModel().getColumn(6).setPreferredWidth(90);
        getColumnModel().getColumn(7).setPreferredWidth(90);
        getColumnModel().getColumn(8).setPreferredWidth(90);
        getColumnModel().getColumn(9).setPreferredWidth(50);
        getColumnModel().getColumn(10).setPreferredWidth(50);
        getColumnModel().getColumn(11).setPreferredWidth(50);
        getColumnModel().getColumn(12).setPreferredWidth(50);
        getColumnModel().getColumn(13).setPreferredWidth(50);
    }
   
    public void selectFirst() {
        try {
            setRowSelectionInterval(0, 0);
            setColumnSelectionInterval(1, 1);
        }
        catch (Exception e) {}
    }
   
    public void packColumns(JTable table, int margin) {
        for (int c = 0; c < table.getColumnCount(); 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 data
        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);
    }
   
    public boolean isSelectedRow() { return (getSelectedRows().length == 1); }
    public boolean isSelectedRows() { return (getSelectedRows().length >= 1); }
   
    public String getToolTipText(MouseEvent event)
    {
            int row = rowAtPoint( event.getPoint() );
            int col = columnAtPoint( event.getPoint() );
            Object o = getValueAt(row,col);
            if( o == null )
                return null;
            if( o.toString().equals("") )
                return null;
            return o.toString();
    }

    public Point getToolTipLocation(MouseEvent event)
    {
        int row = rowAtPoint( event.getPoint() );
        int col = columnAtPoint( event.getPoint() );
        Object o = getValueAt(row,col);
        if( o == null )
            return null;
        if( o.toString().equals("") )
            return null;
        Point pt = getCellRect(row, col, true).getLocation();
        pt.translate(-1,-2);
        return pt;
    }
}
Avatar billede kalp Novice
20. juli 2005 - 16:22 #1
Du skal i hvertfald smide din JTable ind i en JScrollPane.. kan jeg ikke lige se om du gør.. tog et hurtigt kig men ved det er en generelt fejl.
Avatar billede mungojerrie Nybegynder
20. juli 2005 - 16:25 #2
det gør jeg skam også....
den kommer bare først i en JPanel først....

        bottomPanel.add(data);

        JScrollPane scrollPane = new JScrollPane();
        scrollPane.add(bottomPanel);
Avatar billede mikkelbm Nybegynder
20. juli 2005 - 21:54 #3
Det er din tabel der skal addes til en JScrollPane, så du skal gøre følgende:

bottomPanel.add(new JScrollPane (data));

http://java.sun.com/docs/books/tutorial/uiswing/components/table.html
Avatar billede mungojerrie Nybegynder
20. juli 2005 - 21:57 #4
det tester jeg lige i morgen og vender tilbage :-)
Avatar billede mungojerrie Nybegynder
21. juli 2005 - 08:30 #5
det virkede jo bare, nu kan jeg se mine column headers, men problem 2 og 3 mangler jeg stadig hjælp til :-)
Avatar billede mikkelbm Nybegynder
21. juli 2005 - 08:36 #6
Har du kigget på det link jeg henviser til? Det skulle indeholde eksempler på det du spørger om :)
Avatar billede mungojerrie Nybegynder
21. juli 2005 - 09:26 #7
ja, har skam læst den igennem (havde bare overset det med scrollpanen) og jeg har jo også forsøgt at gøre det på samme måde som i eksemplet og det virker også med booleans og date objecter, men ikke med Color og andre "hjemmelavede" objecter selvom jeg implementerer :

public Class getColumnClass(int c) {
  return getValueAt(0, c).getClass();
}
Avatar billede mikkelbm Nybegynder
21. juli 2005 - 09:33 #8
Avatar billede mungojerrie Nybegynder
21. juli 2005 - 09:47 #9
ja, men jeg er ikke helt med på hvordan jeg skal få det flettet ind i min kode.. :-(
Avatar billede mungojerrie Nybegynder
27. juli 2005 - 08:59 #10
nå, jeg fandt selv en løsning fra Sun, som jeg har arbejdet videre på........tak for kommentarerne drenge :-)
Avatar billede mungojerrie Nybegynder
27. juli 2005 - 09:00 #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