Avatar billede martinhrj Nybegynder
20. januar 2003 - 10:49 Der er 14 kommentarer og
1 løsning

Placering af JTable

Jeg har et panel som indeholder en JScrollPane. Denne JScrollPane har en viewport som er et JTable.
Det er engang lykkedes mig, at få vist dette JTable nederst i panelet... så hver gang, der blev tilføjet en række, arbejdede tabellen sig opad... (gir' det mening?)

Men jeg kan s.. ikke huske hvordan jeg gjorde! Er der nogen der kan hjælpe mig på vej?

På forhånd tak!
Avatar billede mortenkjeldberg Nybegynder
20. januar 2003 - 11:57 #1
HAr du created JTablen med en TableModel ?
Avatar billede martinhrj Nybegynder
20. januar 2003 - 12:00 #2
Yep!
Avatar billede viht Nybegynder
20. januar 2003 - 13:29 #3
Sådan her:

//TablePanel.java
import javax.swing.*;
import javax.swing.table.*;
import java.awt.BorderLayout;

public class TablePanel extends JPanel {
   
    private JTable table;
    private VectorTableModel tableModel;
   
    public TablePanel() {
       
        setLayout(new BorderLayout());
        tableModel = new VectorTableModel();
      table = new JTable(tableModel);
      table.getTableHeader().setReorderingAllowed(false);
      table.getTableHeader().setResizingAllowed(false);
     
      add(new JScrollPane(table));
    }
   
    public JTable getTable() {
        return table;
    }
}

//TableElement.java
public class TableElement {
   
    private String navn;
    private String nummer;
   
    public TableElement(String navn, String nummer) {
        this.navn = navn;
        this.nummer = nummer;
    }
   
    public String getNavn() {
        return navn;
    }
    public String getNummer() {
        return nummer;
    }
    public void setNavn(String navn) {
        this.navn = navn;
    }
    public void setNummer(String nummer) {
        this.nummer = nummer;
    }
}
//VectorTableModel.java

import javax.swing.table.AbstractTableModel;

import java.util.Vector;

public class VectorTableModel extends AbstractTableModel {
    private String[] columns = { "Navn", "Antal gram", "I alt" };
      private Vector data;

    public VectorTableModel() {
        data = new Vector();
    }

  public int getColumnCount() {
      return columns.length;
  }
   
  public int getRowCount() {
      return data.size();
  }

  public String getColumnName(int column) {
      return columns[column];
  }

  public Object getValueAt(int row, int column) {
      TableElement element = (TableElement)data.elementAt(row);
      String value = "";
      switch( column ) {
          case 0: {
              value = element.getNavn();
          } break;
          case 1: {
              value = element.getNummer();
          } break;
      }
      return value;
  }

  public Class getColumnClass(int c) {
      return getValueAt(0, c).getClass();
  }

  public boolean isCellEditable(int row, int col) {
      return false;
  }

  public void setValueAt(Object value, int row, int column) {
      switch( column ) {
          case 0: {
              ((TableElement)data.elementAt(row)).setNavn((String)value);
          } break;
          case 1: {
              ((TableElement)data.elementAt(row)).setNummer((String)value);
          } break;
      }
      fireTableCellUpdated(row, column);
    }
   
    public void addTableElement(TableElement element) {
        data.add(element);
        fireTableRowsInserted(data.size(), data.size());
    }
   
    public void removeTableElement(int index) {
        if( !(index == -1) ) {
            data.removeElementAt(index);
            fireTableRowsDeleted(index, index);
        }
    }
}

//StartMain.java
import javax.swing.JFrame;

import java.awt.BorderLayout;

public class StartMain {
   
    public static void main(String[] args) {
        javax.swing.JFrame.setDefaultLookAndFeelDecorated(true);
        JFrame frame =  new JFrame();
        frame.getContentPane().add(new TablePanel(), BorderLayout.CENTER);
        frame.setTitle("Table");
        frame.setSize(300,300);
        frame.setLocation(150,150);
        frame.show();
    }
}
Avatar billede viht Nybegynder
20. januar 2003 - 13:36 #4
Her er hvordan du tilføjer elementer:

//StartMain.java
import javax.swing.*;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class StartMain {
   
    public static void main(String[] args) {
        javax.swing.JFrame.setDefaultLookAndFeelDecorated(true);
        JFrame frame =  new JFrame();
        final TablePanel tablePanel = new TablePanel();
        frame.getContentPane().add(tablePanel, BorderLayout.CENTER);
        JButton addButton = new JButton("Tilføj element");
        addButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                ((VectorTableModel)tablePanel.getTable().getModel()).addTableElement(
                    new TableElement("Tilføjet", "" +Math.random()));
            }
           
        });
        frame.getContentPane().add(addButton, BorderLayout.SOUTH);
        frame.setTitle("Table");
        frame.setSize(300,300);
        frame.setLocation(150,150);
        frame.show();
    }
}
Avatar billede viht Nybegynder
20. januar 2003 - 13:38 #5
Du kan så bare selv tilpasse VectorTableModel til dine behov..
public class VectorTableModel extends AbstractTableModel {
    private String[] columns = { "Dit_valg_til_kolonne1",
                                "Dit_valg_til_kolonne2",
                                "Dit_valg_til_kolonne3"
                                ...
                                };
...
}
Avatar billede martinhrj Nybegynder
20. januar 2003 - 13:40 #6
Hmm... så vidt jeg umiddelbart kan se, sker der da ikke noget i koden, der får tabellen til at være placeret nederst i panelet! Helt præcist hvor gør du det?
Avatar billede viht Nybegynder
20. januar 2003 - 13:55 #7
Nederst er jo relativt.. medmindre du bruger null layout.
Avatar billede viht Nybegynder
20. januar 2003 - 14:02 #8
Selvfølgelig kunne du bruge setBounds på dit panel.. men det er da noget værre noget at have en container med null layout til at indeholde din tabel, det skulle jo helst være dynamisk.
Avatar billede martinhrj Nybegynder
20. januar 2003 - 14:07 #9
Jeg kunne ikke være mere enig... men som jeg skrev tidligere, (og som målet med spørgsmålet er) har jeg tidligere fået den til at starte nedefra, og arbejde sig opad... Og det er hvad jeg gerne vil have gjort igen! Jeg kan skam godt lave et jtable... det er IKKE problemet.

Jeg prøver lige at forklare "nederst" igen!

Jeg har et panel, som er fx. 500 px højt. Deri er en scrollpane, og i denne scrollpane ligger et jtable. Når der kommer én række i dette jtable, ligger denne række sig nederst i panelet. Og derved også nederst i panelet. Når der så kommer endnu en række i tabellen, rykker den første række sig op, og den sidstankomne ligger nu nederst.

Var det forståeligt?
Avatar billede viht Nybegynder
20. januar 2003 - 14:17 #10
Jaa, det er forståeligt, men jeg ved ikke hvilket layout der har givet det den opførsel - udover naturligvis selv at flytte tabellen opad med null layout.
Avatar billede martinhrj Nybegynder
20. januar 2003 - 14:22 #11
Jeg er ret sikker på at panelet havde borderlayout på det tidspunkt... Så jeg tror næsten at det må være selve tabellen eller scrollpane'et der har fået noget specielt layout...
Avatar billede viht Nybegynder
20. januar 2003 - 19:02 #12
Jamen du kan ikke sætte layout på en JCcrollpane eller en JTable, de er ikke containere.
Avatar billede martinhrj Nybegynder
21. januar 2003 - 11:23 #13
Nææ... det er jeg godt klar over... Men hvad kan det så være? Kom endelig med idéer, hvis du har nogle!
Avatar billede viht Nybegynder
21. januar 2003 - 12:27 #14
Jeg er blank [].
Avatar billede martinhrj Nybegynder
30. januar 2003 - 13:36 #15
Jeg lukker... for en gang skyld, var der ingen hjælp at hente på eksperten :(
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