Avatar billede in2deepdk Nybegynder
02. august 2002 - 13:29 Der er 5 kommentarer

jTable?

Halløjsa....

Jeg har en jTable med 7 kolonner. Til hver kolonne har jeg en ArrayList med eksempelvis datoer jeg gerne vil have vist... Problemet er så hvordan jeg gør dette! Det er ikke noget problem at vise en række, problemet er straks størrer når jeg i hver af de 7 kolonner automatisk skal sætte flere rækker ind med de data der er i ArrayListerne!

Mvh In2deepdk
Avatar billede dsj Nybegynder
08. august 2002 - 21:03 #1
JTable bygger på en table-model, som automatisk er der, hvis du ikke selv laver én, hvilket i længden er det bedste. Nåh, men en table-model bygger på et Object[][], hvis data bliver vist i tabellen. Dette vil sige, at du er nødt til at indlæse alle dine data i Object[][], før at du kan vise dem i tabellen.
Herunder vil jeg vise dig et eksempel på en godt table-model som jeg selv har arbejdet mig frem til over længere tid. Her er desuden et link til en side med masser af eksempler på ting man kan gøre med JTable og alle andre ting http://www.esus.com/docs/GetIndexPage.jsp?uid=311

import ......;

class ServerTableModel extends AbstractTableModel {
  private String[] columnNames = {"Hostname", "Description", "Ping" };
  private int[] columnWidth = { 200, 75, 50 };
  private Object[][] data;
  private ListSelectionModel rowSM;
  private JTable table;

  public ServerTableModel(JTable table) {
    this.table = table;
    setData(new Object[0][3]) // eller noget andet
    initTable();
  }

  private void initTable() {
    table.setModel(this);
    table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    for(int i=0; i<columnWidth.length; i++) {
      table.getColumnModel().getColumn(i).setPreferredWidth(columnWidth[i]);
    }
    table.setShowHorizontalLines(false);
    addMouseListener();
    addMouseListenerRightClick();
    setSelectionModel();
  }

  private void setData(Serverlist sl) {
    for(int i=0; i<såMegetDataDuHar; i++) {
      data[i][0] = ...;
      data[i][1] = ...;
      data[i][2] = ...;
    }
  }

  // Mouse Listener til højre-klik
  private void addMouseListenerRightClick() {
    table.addMouseListener(new MouseAdapter() {
      public void mousePressed(MouseEvent e) { maybeShowPopup(e); }
      public void mouseReleased(MouseEvent e) { maybeShowPopup(e); }
      private void maybeShowPopup(MouseEvent e) {
        // Dette sker når du højreklikker på en række i tabellen
      }
    });
  }

  // Selection Listener
  private void setSelectionModel() {
    rowSM = table.getSelectionModel();
    rowSM.addListSelectionListener(new ListSelectionListener() {
      public void valueChanged(ListSelectionEvent e) {
        if (e.getValueIsAdjusting()) return;
        ListSelectionModel lsm = (ListSelectionModel)e.getSource();
        if (lsm.isSelectionEmpty()) {
          // Dette sker når intet er valgt i tabellen
        }
        else {
          // Sker når en række vælges i tabellen
        }
      }
    });
  }

  public void updateUI() {
    table.updateUI();
  }
  private void addMouseListener() {
    table.getTableHeader().addMouseListener(new MouseAdapter() {
      public void mouseClicked(MouseEvent event) {
        if (event.getClickCount() < 2)
          return;
        int tableColumn = table.columnAtPoint(event.getPoint());
        int modelColumn = table.convertColumnIndexToModel(tableColumn);
        // Sker når der dobbelt-klikkes på en tableheader
      }
    });
  }

  public Object getValueAt(int row, int col) { return data[row][col]; }
  //public Object getValueAt(int row, int col) { return data[rows[row].index][col]; }
  public boolean isCellEditable(int row, int col) { if (col > 0) return true; else return false; } // (eksempel)
  public int getRowCount() { return data.length; }
  public int getColumnCount() { return columnNames.length; }
  public String getColumnName(int col) { return columnNames[col]; }
  public Class getColumnClass(int col) { return getValueAt(0, col).getClass(); }
  public void setValueAt(Object value, int row, int col) {
    data[row][col] = value;
    // Hvis du vil gøre andet med de indtastede data (value)
    fireTableCellUpdated(row, col);
  }
}

I din frame eller dialog hvor du har tabellen laver du bare en instans af ovenstående klasse og parser tabellen med, så skal du kun ændre i denne klasse for ta ændre på tabellens adfærd.
Avatar billede dsj Nybegynder
08. august 2002 - 21:04 #2
Denne linie:

//public Object getValueAt(int row, int col) { return data[rows[row].index][col]; }

...ka du godt glemme alt om :)
Avatar billede aslan Nybegynder
09. august 2002 - 19:19 #3
dsj skal man betale for at blive medlem af esus.com?
Avatar billede dsj Nybegynder
09. august 2002 - 19:39 #4
medlem, jeg er ikke medlem, bruger bare deres fine og detaljerede ekesmpler :)
Avatar billede aslan Nybegynder
09. august 2002 - 19:46 #5
Ja, men kan du komme på alle de andre eksampler de også har derinde... det ville være lækkert:-)
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