Avatar billede learnmejava Nybegynder
29. november 2002 - 18:28 Der er 6 kommentarer og
1 løsning

JTabel Listener

Hej
Jeg har en tabel som indeholder 25 rækker og 13 kolonner. Jeg vil så gerne at hvis nu fx brugeren begynder at skrive i en tom række, så skal en række funktioner udføres. Fx så skal der skrives et id nummer i kolonne1.
Jeg tror det er noget med "getRow" og "Listener" men jeg er for det første ikke sikker og ved ikke hvodan jeg skal bruge det. Jeg har kigget lidt i de andre spg, men kan ikke lige finde noget.

Så spørgsmålet er hvordan udfører man en eller flere funktioner når brugeren klikker og begynder at skrive i en række?

Jeg vil gerne sende Tabellen hvis det skulle være nødvendigt.
Avatar billede viht Nybegynder
30. november 2002 - 01:56 #1
Du kan tilføje et ListSelectionListener objekt til din JTable og definere en valueChanged(ListSelectionEvent e) {...} metode.

På denne måde er det ligetil at få værdier ud af det brugern klikker på i tabellen.

Se mit nedenstående eksempel:

import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;

public class SelectTableExample extends JFrame {

    private    JPanel        topPanel;
    private    JTable        table;
    private    JScrollPane scrollPane;

    public SelectTableExample() {

        setTitle( "ListSelectionListener eksempel" );
        setSize( 300, 200 );
        setBackground( Color.gray );

        topPanel = new JPanel();
        topPanel.setLayout( new BorderLayout() );
        getContentPane().add( topPanel );

        String columnNames[] = { "Column 1", "Column 2", "Column 3" };

        String dataValues[][] =
        {
            { "12", "333", "1337" },
            { "4711", "42", "853" },
            { "93", "89.2", "109" },
            { "279", "9033", "3092" }
        };

        table = new JTable( dataValues, columnNames );

        // Dette er det essentielle:
        ListSelectionModel selectionModel = table.getSelectionModel();
        selectionModel.addListSelectionListener( new ListSelectionListener() {
            /* Metoden definerer hvad vi gør når tabellen vælges
            * du skal definere denne metode, da du implementerer ListSelectionListener
            */
            public void valueChanged( ListSelectionEvent event ) {
               
                if( event.getSource() == table.getSelectionModel() && event.getFirstIndex() >= 0 ) {
                    TableModel model = (TableModel)table.getModel();
   
                    // Hvad er der klikket på?
                    String string = (String)model.getValueAt(
                                            table.getSelectedRow(),
                                            table.getSelectedColumn() );
       
                    System.out.println( "Valgt: = " + string );
                }
            }
        });

        scrollPane = new JScrollPane( table );
        topPanel.add( scrollPane, BorderLayout.CENTER );
    }
}

class Test {

    public static void main( String args[] ) {
        SelectTableExample mainFrame    = new SelectTableExample();
        mainFrame.setVisible( true );
    }
}
Avatar billede learnmejava Nybegynder
30. november 2002 - 10:37 #2
Det ser godt det vil jeg arbejde lidt med i eftermiddag,
Hvis jeg i fx ændre dine startværdier til:
--------------
        String dataValues[][] =
        {
            { "", "", "" },
            { "", "", "" },
            { "", "", "" },
            { "", "", "" }
        };

---------------
så kan jeg vel godt udfører en metode i denne del af koden
------------
                    // Hvad er der klikket på?
                    String string = (String)model.getValueAt(
                                            table.getSelectedRow(),
                                            table.getSelectedColumn() );
       
                    System.out.println( "Valgt: = " + string );
--------------

Som udfylder den aktuelle række - eller hvad?
Avatar billede viht Nybegynder
30. november 2002 - 13:14 #3
At lave det du lige siger der er lidt mere tricky... jeg arbejder lige på et fyldesgørende eksempel. Jeg har det klar inden for 1 time til 1½.
Avatar billede viht Nybegynder
30. november 2002 - 13:32 #4
Here goes:

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;

public class TableCellRenderTest {
  public static void main(String[] args) { 
     
      JFrame frame = new TableCellRenderFrame();
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
      /*
      *Sætter JFrame i midten af skærmen
      */   
      int width = Toolkit.getDefaultToolkit().getScreenSize().width;
      int height= Toolkit.getDefaultToolkit().getScreenSize().height;
      frame.setLocation((width-frame.getSize().width)/2,(height-frame.getSize().height) / 2);
     
      frame.show();
  }
}

class TableCellRenderFrame extends JFrame { 
 
  public TableCellRenderFrame() { 
      setTitle("TableEditTest");
      setSize(600, 250);

      TableModel model = new MyTableModel();
      JTable table = new JTable(model);

      table.setDefaultRenderer(Color.class,
        new ColorTableCellRenderer());
      table.setDefaultEditor(Color.class,
        new ColorTableCellEditor());

      JComboBox combo = new JComboBox();
      for (int i = 0; i <= 42; i++)
        combo.addItem(new Integer(i));
       
      TableColumnModel columnModel = table.getColumnModel();
      TableColumn nameColumn = columnModel.getColumn(PlanetTableModel.COMBO_COLUMN);
      nameColumn.setCellEditor(new DefaultCellEditor(combo));

      table.setRowHeight(50);
      getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
  }
}

class MyTableModel extends AbstractTableModel { 
 
  public String getColumnName(int c) { 
      return columnNames[c];
  }

  public Class getColumnClass(int c) { 
      return cells[0][c].getClass();
  }

  public int getColumnCount() { 
      return cells[0].length;
  }

  public int getRowCount() { 
      return cells.length;
  }

  public Object getValueAt(int r, int c) { 
      return cells[r][c];
  }

  public void setValueAt(Object obj, int r, int c) { 
      cells[r][c] = obj;
  }

  public boolean isCellEditable(int r, int c) { 
      /*
      * Kun disse felter vil jeg lade brugeren editere:
      */
      return c == NAME_COLUMN || c == COMBO_COLUMN || c == CHECKBOX_COLUMN || c == COLOR_COLUMN;
  }

  public static final int NAME_COLUMN = 0;
  public static final int COMBO_COLUMN = 2;
  public static final int CHECKBOX_COLUMN = 3;
  public static final int COLOR_COLUMN = 4;

    /*
    * JTable data:
    */
  private Object[][] cells = {
      { "Howdy", new Double(1337),  new Integer(0), Boolean.FALSE, Color.yellow },
      { "Dav", new Double(4711), new Integer(0), Boolean.FALSE, Color.yellow },
      { "Jow jow", new Double(42), new Integer(1), Boolean.FALSE, Color.blue }
  };

  private String[] columnNames = { "Navn", "Nummer", "ComboBox", "Column4", "Column5" };
}

class ColorTableCellRenderer implements TableCellRenderer {
  public Component getTableCellRendererComponent(JTable table,
      Object value, boolean isSelected, boolean hasFocus,
      int row, int column) { 
      panel.setBackground((Color)value);
      return panel;
  }

  private JPanel panel = new JPanel();
}

class ColorTableCellEditor extends AbstractCellEditor implements TableCellEditor {
   
  private Color color;
  private JColorChooser colorChooser;
  private JDialog colorDialog;
  private JPanel panel;
 
  ColorTableCellEditor() { 
       
        /*
        * Definerer min colorchooser
        */
      panel = new JPanel();
      colorChooser = new JColorChooser();
      /*
      * Lader JColorChooser lave dialogboksen og definerer ActionListeners
      */
      colorDialog = JColorChooser.createDialog(null, "Farve", false, colorChooser,
      new ActionListener() { 
        public void actionPerformed(ActionEvent event) { 
            stopCellEditing();
        }
      },
      new ActionListener() { 
        public void actionPerformed(ActionEvent event) { 
            cancelCellEditing();
        }
      });
     
      colorDialog.addWindowListener(
      new WindowAdapter() {
        public void windowClosing(WindowEvent event) {
            cancelCellEditing();
        }
      });
  }

  public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { 
      colorChooser.setColor((Color)value);
      return panel;
  }

  public boolean shouldSelectCell(EventObject anEvent) { 

      colorDialog.setVisible(true);

      return true;
  }

  public void cancelCellEditing() { 
      colorDialog.setVisible(false);
      super.cancelCellEditing();
  }

  public boolean stopCellEditing() { 
      colorDialog.setVisible(false);
      super.stopCellEditing();

      return true;
  }

  public Object getCellEditorValue() { 
      return colorChooser.getColor();
  }
}
Avatar billede viht Nybegynder
30. november 2002 - 14:10 #5
Der er en fejl i det ovenstående.. du får lige det hele igen.. det er nemmere :)
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;

public class TableCellRenderTest {
  public static void main(String[] args) { 
     
      JFrame frame = new TableCellRenderFrame();
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
      /*
      *Sætter JFrame i midten af skærmen
      */   
      int width = Toolkit.getDefaultToolkit().getScreenSize().width;
      int height= Toolkit.getDefaultToolkit().getScreenSize().height;
      frame.setLocation((width-frame.getSize().width)/2,(height-frame.getSize().height) / 2);
     
      frame.show();
  }
}

class TableCellRenderFrame extends JFrame { 
 
  public TableCellRenderFrame() { 
      setTitle("TableEditTest");
      setSize(600, 250);

      TableModel model = new MyTableModel();
      JTable table = new JTable(model);

      table.setDefaultRenderer(Color.class,
        new ColorTableCellRenderer());
      table.setDefaultEditor(Color.class,
        new ColorTableCellEditor());

      JComboBox combo = new JComboBox();
      for (int i = 0; i <= 42; i++)
        combo.addItem(new Integer(i));
       
      TableColumnModel columnModel = table.getColumnModel();
      TableColumn nameColumn = columnModel.getColumn(MyTableModel.COMBO_COLUMN);
      nameColumn.setCellEditor(new DefaultCellEditor(combo));

      table.setRowHeight(50);
      getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
  }
}

class MyTableModel extends AbstractTableModel { 
 
  public String getColumnName(int c) { 
      return columnNames[c];
  }

  public Class getColumnClass(int c) { 
      return cells[0][c].getClass();
  }

  public int getColumnCount() { 
      return cells[0].length;
  }

  public int getRowCount() { 
      return cells.length;
  }

  public Object getValueAt(int r, int c) { 
      return cells[r][c];
  }

  public void setValueAt(Object obj, int r, int c) { 
      cells[r][c] = obj;
  }

  public boolean isCellEditable(int r, int c) { 
      /*
      * Kun disse felter vil jeg lade brugeren editere:
      */
      return c == NAME_COLUMN || c == COMBO_COLUMN || c == CHECKBOX_COLUMN || c == COLOR_COLUMN;
  }

  public static final int NAME_COLUMN = 0;
  public static final int COMBO_COLUMN = 2;
  public static final int CHECKBOX_COLUMN = 3;
  public static final int COLOR_COLUMN = 4;

    /*
    * JTable data:
    */
  private Object[][] cells = {
      { "Howdy", new Double(1337),  new Integer(0), Boolean.FALSE, Color.yellow },
      { "Dav", new Double(4711), new Integer(0), Boolean.FALSE, Color.yellow },
      { "Jow jow", new Double(42), new Integer(1), Boolean.FALSE, Color.blue }
  };

  private String[] columnNames = { "Navn", "Nummer", "ComboBox", "Column4", "Column5" };
}

class ColorTableCellRenderer implements TableCellRenderer {
  public Component getTableCellRendererComponent(JTable table,
      Object value, boolean isSelected, boolean hasFocus,
      int row, int column) { 
      panel.setBackground((Color)value);
      return panel;
  }

  private JPanel panel = new JPanel();
}

class ColorTableCellEditor extends AbstractCellEditor implements TableCellEditor {
   
  private Color color;
  private JColorChooser colorChooser;
  private JDialog colorDialog;
  private JPanel panel;
 
  ColorTableCellEditor() { 
       
        /*
        * Definerer min colorchooser
        */
      panel = new JPanel();
      colorChooser = new JColorChooser();
      /*
      * Lader JColorChooser lave dialogboksen og definerer ActionListeners
      */
      colorDialog = JColorChooser.createDialog(null, "Farve", false, colorChooser,
      new ActionListener() { 
        public void actionPerformed(ActionEvent event) { 
            stopCellEditing();
        }
      },
      new ActionListener() { 
        public void actionPerformed(ActionEvent event) { 
            cancelCellEditing();
        }
      });
     
      colorDialog.addWindowListener(
      new WindowAdapter() {
        public void windowClosing(WindowEvent event) {
            cancelCellEditing();
        }
      });
  }

  public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { 
      colorChooser.setColor((Color)value);
      return panel;
  }

  public boolean shouldSelectCell(EventObject anEvent) { 

      colorDialog.setVisible(true);

      return true;
  }

  public void cancelCellEditing() { 
      colorDialog.setVisible(false);
      super.cancelCellEditing();
  }

  public boolean stopCellEditing() { 
      colorDialog.setVisible(false);
      super.stopCellEditing();

      return true;
  }

  public Object getCellEditorValue() { 
      return colorChooser.getColor();
  }
}
Avatar billede learnmejava Nybegynder
30. november 2002 - 19:50 #6
Du har da vist i så rigelig grad fortjent dine points - jeg takker.
Avatar billede viht Nybegynder
30. november 2002 - 21:16 #7
Tak for det :o)
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