Avatar billede preet Nybegynder
29. oktober 2004 - 11:46 Der er 22 kommentarer og
1 løsning

JTabbedPane og Tabeller

Jeg har en applet med et JTappedPane. Et af fanebladene indeholder en tabel, der henter data fra en ekstern enhed vha. tcp/ip kommandoer. Det tager ca. 4 sekunder at hente disse kommandoer.

Som det er lige nu, oprettes tabellen i kompilleringsøjeblikket. Dette sker idet jeg skriver:
    errorWindow panel2 = new errorWindow(gtp);
    jTabbedPane1.addTab("Error", panel2);

Er det et eller andet jeg kan gøre, så tabellen først indlæser indholdet i tabellen i det øjeblik jeg bringer siden i fokus.

Måske i skal have lidt mere kode, så må I endelig sige til.
Avatar billede _carsten Nybegynder
29. oktober 2004 - 12:12 #1
Du kan eksempelvis adde en componentListener

      mitPaneMedTabel.addComponentListener(new java.awt.event.ComponentAdapter() {
            public void componentShown(java.awt.event.ComponentEvent evt) {
                minTabel.setModel( model );
            }
        });
Avatar billede _carsten Nybegynder
29. oktober 2004 - 12:27 #2
Eksempel

public class testTab extends javax.swing.JFrame {

    public testTab() {
        initComponents();
    }
   
    private void initComponents() {
        jTabbedPane1 = new javax.swing.JTabbedPane();
        jTabbedPane2 = new javax.swing.JTabbedPane();
        jTabbedPane3 = new javax.swing.JTabbedPane();
        jTable1 = new javax.swing.JTable();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        jTabbedPane1.addTab("tab1", jTabbedPane2);

        jTabbedPane1.addTab("tab2", jTabbedPane3);

        jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {

            }
        ));
        jTable1.addComponentListener(new java.awt.event.ComponentAdapter() {
            public void componentShown(java.awt.event.ComponentEvent evt) {
                setTableModel(evt);
            }
        });

        jTabbedPane1.addTab("Tab med tabel", jTable1);

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

        pack();
    }

    private void setTableModel(java.awt.event.ComponentEvent evt) {
        jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {"A", "B", "C", "D"},
                {"1", "2", "3", "4"},
                {"a", "b", "c", "d"},
                {"z", "x", "c", "v"}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
    }
   
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new testTab().setVisible(true);
            }
        });
    }

    private javax.swing.JTabbedPane jTabbedPane1;
    private javax.swing.JTabbedPane jTabbedPane2;
    private javax.swing.JTabbedPane jTabbedPane3;
    private javax.swing.JTable jTable1;
}
Avatar billede preet Nybegynder
29. oktober 2004 - 12:35 #3
Hej Carsten - tak for dine svar. Jeg kigger lige tingene igennem, og ser om jeg kan tilpasse det mit dokument.

Afleddet af dit første svar, lavede jeg dette:
  private void jbInit() throws Exception {
    JScrollPane jScrollPane1 = new JScrollPane();
//    tableContent TableContent = new tableContent(gtp);
    JTable jTable1 = new JTable();
    this.setLayout(null);
    jScrollPane1.setBounds(new Rectangle(0, 30, 500, 324));
    jButton1.setBounds(new Rectangle(6, 7, 110, 15));
    jButton1.setText("jButton1");
    jButton1.addActionListener(new errorWindow_jButton1_actionAdapter(this));
    this.add(jScrollPane1, null);
    this.add(jButton1, null);
    jScrollPane1.getViewport().add(jTable1, null);
  }

  void jButton1_actionPerformed(ActionEvent e) {
    tableContent TableContent = new tableContent(gtp);
    jTable1.setModel(TableContent);
  }

Dog sker der ingen opdatering af tabellen, når jeg trykker på knappen. gtp er som nævnt min tcp/ip forbindelse til enheden, data skal hentes fra.
Avatar billede preet Nybegynder
29. oktober 2004 - 12:40 #4
Min table content er i øvrigt bygget op således:
  public Object getValueAt( int row, int col ) {
    switch ( col ) {     
      case 0: return time.elementAt(row);
      case 1: return no.elementAt(row);
      case 2: return text.elementAt(row);
      default: return null;
    }
  }

hvor time, no og text er Vector
Avatar billede _carsten Nybegynder
29. oktober 2004 - 12:41 #5
Du skal muligvis have en jTable1.repaint() ind
Avatar billede _carsten Nybegynder
29. oktober 2004 - 12:44 #6
29/10-2004 12:40:15:  det er jo fint nok.

Har du prøvet med
    .....
    jTable1.setModel(TableContent);
    jTable1.repaint();
  }
Avatar billede preet Nybegynder
29. oktober 2004 - 12:45 #7
Har lige indsat repaint, virker desværre ikke...
Avatar billede _carsten Nybegynder
29. oktober 2004 - 12:49 #8
Kan du kaste noget mere kode, alt hvad der vedrører gtp behøver jeg ikke
Avatar billede preet Nybegynder
29. oktober 2004 - 12:57 #9
Der kommer lidt mere her:

---Den her klasse laver indholdet

public class tableContent extends AbstractTableModel {
  Thread timer;
  tcpip gtp;
  String input_text = new String("");
  Vector time = new Vector();
  Vector no = new Vector();
  Vector text = new Vector();
  private String ColumnNames[] =
    { "Time", "No", "Text"};

// Data fyldes i de tre vektorer...

  public String getColumnName( int col ) {
    return ColumnNames[col];
  }
  public int getColumnCount() {
    return 3;
  }

  public int getRowCount() {
    return time.size();
  }

  public Object getValueAt( int row, int col ) {
    switch ( col ) {     
      case 0: return time.elementAt(row);
      case 1: return no.elementAt(row);
      case 2: return text.elementAt(row);
      default: return null;
    }
  }

--- Den her klasse laver layoutet med scroll og tabel

public class errorWindow extends Applet{
  tcpip gtp;
  JButton jButton1 = new JButton();
  JTable jTable1 = new JTable();

  public errorWindow(tcpip tp) {
    gtp = tp;
    try {
      jbInit();
    }
    catch(Exception e) {
      e.printStackTrace();
    }
  }
  private void jbInit() throws Exception {
    JScrollPane jScrollPane1 = new JScrollPane();
//    tableContent TableContent = new tableContent(gtp);
    JTable jTable1 = new JTable();
    this.setLayout(null);
    jScrollPane1.setBounds(new Rectangle(0, 30, 500, 324));
    jButton1.setBounds(new Rectangle(6, 7, 110, 15));
    jButton1.setText("jButton1");
    jButton1.addActionListener(new errorWindow_jButton1_actionAdapter(this));
    this.add(jScrollPane1, null);
    this.add(jButton1, null);
    jScrollPane1.getViewport().add(jTable1, null);
  }

  void jButton1_actionPerformed(ActionEvent e) {
    tableContent TableContent = new tableContent(gtp);
    jTable1.setModel(TableContent);
    jTable1.repaint();
  }
 
}

----

Da forbindelse skal oprettes i hoved-klassen, der danner JTappedPane er følgende kode indsat under start() funktionen:

    statusWindow StatusWindow = new statusWindow(gtp);
    jTabbedPane1.addTab("Status", StatusWindow);
    errorWindow panel2 = new errorWindow(gtp);
    jTabbedPane1.addTab("Error", panel2);

Som sagt tager det fire sekunder at danne data'ene i tableContent()

Jeg er ret ny indenfor java, derfor koden måske er rodet...
Avatar billede _carsten Nybegynder
29. oktober 2004 - 13:01 #10
Okay - jeg kan se din model extender AbstractTableModel, så prøv lige følgende

  void jButton1_actionPerformed(ActionEvent e) {
    tableContent TableContent = new tableContent(gtp);
    jTable1.setModel(TableContent);
    TableContent.fireTableDataChanged();
  }
Avatar billede preet Nybegynder
29. oktober 2004 - 13:36 #11
Virker desværre ikke... Jeg vil holde weekend nu, men vender tilbage mandag. Så vil jeg starte forfra og kigge dine svar igennem.

Du skal have tak for den foreløbige hjælp - jeg kigger på det med pointene på mandag.

Peter
Avatar billede _carsten Nybegynder
29. oktober 2004 - 13:38 #12
Mangler du i øvrigt ikke en metode i din  tableContent, eller har du bare ikke pastet den
public void setValueAt(Object aValue, int rowIndex, int columnIndex)
Avatar billede preet Nybegynder
01. november 2004 - 11:25 #13
Den metode har jeg ikke - jeg har getValueat... Det er noget kode jeg har fundet et eller andet sted og tilpasset. Indlæser jeg dataene under opstart virker det dog - men jeg vil da prøve at implementere den nævnte metode...

Peter
Avatar billede _carsten Nybegynder
01. november 2004 - 22:48 #14
Jeg ved ikke hvor langt du er nået, men her er et lille eksempel som jeg tror du
næsten kan copy/paste eller nemt bygge sammen med din egen kode.
Har lavet lidt sparsomme kommentarer.


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

public class TestTable extends javax.swing.JFrame {

    public TestTable() {
        initComponents();
    }
   

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

        getContentPane().setLayout(new java.awt.FlowLayout());

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        table.setModel(content);
        jScrollPane1.setViewportView(table);

        getContentPane().add(jScrollPane1);

        jButton1.setText("Fyld tabel med data");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                fyldTabelMedData(evt);
            }
        });

        getContentPane().add(jButton1);

        pack();
    }


    // Her fyldes tabellen med data, prøv at bygge det sammen med din egen kode
    private void fyldTabelMedData(java.awt.event.ActionEvent evt) {
      for(int i = 0; i < 10; i++){
          Vector v = new Vector();
          v.add("1" + i + ":00");
          v.add("" + i + "");
          v.add("Line " + (i + 1));
            content.addRow(v);
      }
    }
   
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new TestTable().setVisible(true);
            }
        });
    }
   
    private javax.swing.JButton jButton1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable table;
    private tableContent content;
}






// Tabelmodel, som jeg ville lave den hvis den bare skulle opfylde minimumskravene

class tableContent extends AbstractTableModel {
  private Vector tableLine = new Vector();
  private String ColumnNames[] =  { "Time", "No", "Text"};

  public String getColumnName( int col ) {
    return ColumnNames[col];
  }
 
  public int getColumnCount() {
    return ColumnNames.length;
  }

  public int getRowCount() {
    return tableLine.size();
  }

  public void addRow(Vector v){
      int x = tableLine.size();
      tableLine.add(v);
      fireTableRowsInserted(x, x);
  }
 
  public void removeRow(int row){
      tableLine.remove(row);
      fireTableRowsDeleted(row,row);
  }
 
  public Object getValueAt( int row, int col ) {
    Vector e = (Vector)tableLine.get(row);
    return e.get(col);
  }
 
  public void setValueAt(Object obj, int row, int col ) {
    Vector e = (Vector)tableLine.get(row);
    e.setElementAt(obj, col);
  }
}
Avatar billede preet Nybegynder
02. november 2004 - 09:17 #15
Jeg nåede ikke særlig langt med det i går, det gik slet ikke... Så nu vil jeg med friske øjne kigge på dit eksempel - du hører fra mig hvordan det går, men uanset er du ihvertfald sikret de 200 point. Virkelig lækkert med al den hjælp!
Avatar billede preet Nybegynder
02. november 2004 - 12:08 #16
Så virker det! Mangler dog stadig at kunne få tabellens indhold indlæst når fanebladet indeholdene tabellen bliver aktiv.

Men tusind tak for hjælpen!
Avatar billede _carsten Nybegynder
02. november 2004 - 12:15 #17
Så ruller du bare denne her

        jTable1.addComponentListener(new java.awt.event.ComponentAdapter() {
            public void componentShown(java.awt.event.ComponentEvent evt) {
                fyldTabelMedData();
            }
        });
Avatar billede preet Nybegynder
02. november 2004 - 12:23 #18
Virker sjovt nok ikke...?

  private void jbInit() throws Exception {
    content = new tableContent();
    JScrollPane jScrollPane1 = new JScrollPane();
    JTable jTable1 = new JTable();
    this.setLayout(null);
    jScrollPane1.setBounds(new Rectangle(0, 30, 500, 324));
    jButton1.setBounds(new Rectangle(7, 5, 97, 22));
    jButton1.setText("jButton1");
    jButton1.addActionListener(new errorWindow_jButton1_actionAdapter(this));
    this.add(jScrollPane1, null);
    this.add(jButton1, null);
    jScrollPane1.getViewport().add(jTable1, null);
    jTable1.setModel(content);
    jTable1.addComponentListener(new java.awt.event.ComponentAdapter() {
      public void componentShown(java.awt.event.ComponentEvent evt) {
        get_data();
      }
    });

  }
Avatar billede _carsten Nybegynder
02. november 2004 - 14:04 #19
Lad os lige se denne metode:  get_data();
Avatar billede preet Nybegynder
03. november 2004 - 08:50 #20
Så gerne. St
Avatar billede preet Nybegynder
03. november 2004 - 08:50 #21
Hmm - trykkede send for tidligt :) Størstedelen af koden er sortering af indkommen data:

  void get_data(String command){
    int i;
    int n=-1000;
    int j=0;
    int rowCount = content.getRowCount();
    if (rowCount>0){
      for (i = rowCount-1; i >= 0; i--) {
        content.removeRow(i);
      }
    }
    byte[] in;
    String tempTime = new String("");
    String tempNo = new String("");
    String tempText = new String("");

    gtp.send_escape();
    gtp.send(command);
    gtp.send_enter();
    try {
      Thread.currentThread().sleep(4000);
    }
    catch (InterruptedException e) { }
    in = gtp.receive();
    for (i = 8; i < in.length; i++) {
      if (in[i]==0x0D || in[i]==0x0a){
        if (tempTime!= ""){
          Vector v = new Vector();
          v.add(tempTime);
          v.add(tempNo);
          v.add(tempText);
          content.addRow(v);

          j++;
        }
        n = -1;
        tempTime = "";
        tempNo = "";
        tempText = "";
      }
      if (n>=0 && n<=8){
        tempNo += (char) in[i];
      }
      if (n>=10 && n<=27){
        tempTime += (char) in[i];
      }
      if (n>=30){
        tempText += (char) in[i];
      }


      n++;
      input_text += (char) in[i];
    }
    content.removeRow(0);
  }
Avatar billede _carsten Nybegynder
03. november 2004 - 10:15 #22
Et par kommentarer

Jeg kan ikke lige huske om det har nogen betydning at du har lille 'a' her
if (in[i]==0x0D || in[i]==0x0a){
    måske rettes til:  if (in[i]==0x0D || in[i]==0x0A){


og her:
    if (tempTime!= ""){ // n skal være større end 1000 før denne er sand, når den det ???
Avatar billede _carsten Nybegynder
03. november 2004 - 10:18 #23
Sludder og vrøvl

og her:
    if (tempTime!= ""){ // in.length skal være større end 1000 før denne er sand , når den det ???
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