Avatar billede margitbork Nybegynder
23. marts 2006 - 08:12 Der er 4 kommentarer og
1 løsning

Swing, Hvordan får jeg et JTextField ind i min JTable

Hej
Jeg er fuldkommen novice indenfor Swing og jeg sidder med en JTable hvor jeg vil have et tekstfelt hvor brugeren kan indtaste en oplysning. Min JTable bliver bygget op v.hj.a. en extension af AbstractTableModel. Når jeg indsætter en Boolean får jeg en checkbox (hvilket er fint )men når jeg indsætter et JTextField får jeg blot vist værdien af JTextField.toString(), hvilket ikke er så fint...

Her er koden jeg benytter:
/*
* Created on 25-11-2005
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/

public class DistributeRuleListPane implements EcwPane
{

  private static Logger log = Logger.getLogger(DistributeRuleListPane.class);


  private MainEcWebClientFrame mainpage;



  public DistributeRuleListPane()
  {

  }



  public void init(MainEcWebClientFrame mainpage)
  {
      this.mainpage = mainpage;
      do_init();

  }



  protected void do_init()
  {

  }



  public static void main(String[] args)
  {
  }



  public JScrollPane getJTable(DistributeRuleList listofrules)
  {

      m_table = new JTable();
      m_table.setShowGrid(false);
      m_table.setBackground(EcwLookAndFeel.getColor(EcwLookAndFeel.FILELISTCOLOR));
      m_table.setPreferredScrollableViewportSize(new Dimension(500, 70));


//Create the scroll pane and add the table to it.
      JScrollPane scrollPane = new JScrollPane(m_table);
      scrollPane.setBackground(EcwLookAndFeel.getColor(EcwLookAndFeel.FILELISTCOLOR));
      if (listofrules != null)
      {
        editJTable(listofrules);
      }
      return scrollPane;

  }



  protected JTable m_table;
  protected RuleStockTableData m_data;


  public DistributeRuleList directory;



  public void editJTable()
  {
      editJTable(directory);
  }



  public void editJTable(DistributeRuleList listofrules)
  {
      log.debug("editJTable called");

      directory = listofrules;
      m_data = new RuleStockTableData(listofrules);
      m_table.setModel(m_data);
      TableColumn column = null;
      for (int i = 0; i < RuleStockTableData.m_columns.length; i++)
      {

        column = m_table.getColumnModel().getColumn(i);
        RuleColumnData datainfo = RuleStockTableData.m_columns[i];

        column.setPreferredWidth(datainfo.m_width);
        if (i <= 1)
        {
            column.setMaxWidth(datainfo.m_width);
            column.setResizable(false);
        }

      }
      m_table.validate();
  }



  public ArrayList getSelectedFiles()
  {
      return m_data.getSelectedFiles();
  }
}


class RuleFileData
{

  private static Logger log = Logger.getLogger(RuleFileData.class);

  public String rulename;
  public String ruleString;
  public String priority;

  private SimpleDateFormat formatdate = new SimpleDateFormat("dd-MM-yyyy, hh:mm");



  public RuleFileData(DistributeRule rule)
  {
      log.debug("RuleFileData :" + rule);

      rulename = rule.getName();
      ruleString = rule.toString();
      priority = rule.getPriority();
  }
}


class RuleColumnData
{

  public String m_title;
  public int m_width;
  public int m_alignment;



  public RuleColumnData(String title, int width,
                    int alignment)
  {
      m_title = title;
      m_width = width;
      m_alignment = alignment;
  }
}


class RuleStockTableData
        extends AbstractTableModel
{

  private static Logger log = Logger.getLogger(RuleStockTableData.class);

  static public RuleColumnData m_columns[];


  static final public
  RuleColumnData m_columnsfiles[] = {
      new RuleColumnData("", 1, JLabel.LEFT),
      new RuleColumnData("RuleName", 200, JLabel.LEFT),
      new RuleColumnData("RuleString", 100, JLabel.RIGHT),
      new RuleColumnData("Priority", 50, JLabel.RIGHT)
  };

  protected SimpleDateFormat m_frm;
  protected Vector m_vector;
  private String directory;



  public RuleStockTableData(DistributeRuleList listofrules)
  {
      m_vector = new Vector();
      m_columns = m_columnsfiles;
      setDefaultData(listofrules);
  }



  public void setDefaultData(DistributeRuleList listofrules)
  {
      log.debug("setDefalutData called");


      m_vector.removeAllElements();

      if (listofrules != null && listofrules.size()>0)
      {
        Collection rulecollection = listofrules.values();
        ArrayList rulelist = new ArrayList(rulecollection);
        Collections.sort(rulelist);

        for (int i = 0; i < rulelist.size(); i++)
        {
            DistributeRule rule = (DistributeRule)rulelist.get(i);
            m_vector.addElement(new RuleFileData(rule));
        }
      }

  }



  public int getRowCount()
  {
      return m_vector == null ? 0 :
              m_vector.size();
  }



  public int getColumnCount()
  {
      return m_columns.length;
  }



  public String getColumnName(int column)
  {
      return m_columns[column].m_title;
  }

/*
* JTable uses this method to determine the default renderer/
* editor for each cell.  If we didn't implement this method,
* then the last column would contain text ("true"/"false"),
* rather than a check box.
*/
  public Class getColumnClass(int c)
  {
      return getValueAt(0, c).getClass();
  }

/*
* Don't need to implement this method unless your table's
* editable.
*/
  public boolean isCellEditable(int row, int col)
  {
      //Note that the data/cell address is constant,
      //no matter where the cell appears onscreen.

      boolean returning = true;
      if (col == 0)
      {
        returning = true;
      }
      else
      {
        returning = false;
      }
      return returning;
  }



  public Object getValueAt(int
          nRow, int nCol)
  {
      if (nRow < 0 || nRow
              >= getRowCount())
      {
        return "";
      }


      Object o = m_vector.elementAt(nRow);

      if (o instanceof RuleFileData)
      {
        RuleFileData row = (RuleFileData) o;
        switch (nCol)
        {
            case 1:
              return row.rulename;
            case 2:
              return row.ruleString;
            case 3:
              return row.priority;
        }
      }


      return "";
  }

/*
* Don't need to implement this method unless your table's
* data can change.
*/
  boolean DEBUG = true;



  public void setValueAt(Object value, int nRow, int nCol)
  {
      Object o = m_vector.elementAt(nRow);

      if (o instanceof RuleFileData)
      {
        RuleFileData row = (RuleFileData) o;
        switch (nCol)
        {
            case 1:
              row.rulename = (String) value;
              break;
            case 2:
              row.ruleString = (String) value;
              break;
            case 3:
              row.priority = (String) value;
              break;
        }
      }

      //data[row][col] = value;
      fireTableCellUpdated(nRow, nCol);

      selectRow(nRow, nCol);
  }



  private void selectRow(int nRow, int nCol)
  {
      int numRows = getRowCount();
      int numCols = getColumnCount();
      log.debug("--------------------------");

/*    for (int j=0; j < numCols; j++) {
        if(j!=1){
            log.debug(getValueAt(nRow,j));
        }
        if(j==0){

        }

    }*/
      String filename = filename = (String) getValueAt(nRow, 2);
      if (((Boolean) getValueAt(nRow, 0)).booleanValue())
      {

        selectedFiles.add(directory + "\\" + filename);
      }
      else
      {
        selectedFiles.remove(directory + "\\" + filename);
      }
      log.debug(selectedFiles);

      log.debug("");
      log.debug("--------------------------");
  }



  ArrayList selectedFiles = new ArrayList();



  public ArrayList getSelectedFiles()
  {
      return selectedFiles;
  }
}
Avatar billede margitbork Nybegynder
23. marts 2006 - 09:45 #1
Nå jeg fandt løsningen med at definere min egen TableCellRender. Nu vil jeg så gerne kunne klikke på et felt og så skal der ske noget. Jeg troede bare jeg kunne lave ne TableCellRender der extendede JButton og så placere en action på den. Men det giver ikke noget. Er der nogen forslag til hvordan man gør?
Avatar billede _carsten Nybegynder
24. marts 2006 - 16:04 #2
Der er mange måder at gøre det på - du kan bruge din TableModel, TableCellEditor eller JTable

Hvis jeg fornemmer rigtigt er det nok en TableCellEditor som er den nemmeste måde at angribe det på, her er et lille eksempel.

import java.awt.Component;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.util.EventObject;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.event.CellEditorListener;
import javax.swing.event.ChangeEvent;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableColumn;

public class Exp697395 extends javax.swing.JFrame{
   

    public Exp697395() {
        initComponents();
        TableColumn col = table.getColumnModel().getColumn(0);
       
        col.setCellEditor( new MyEditor());
       
    }
                       
    private void initComponents() {
        scroll = new javax.swing.JScrollPane();
        table = new javax.swing.JTable();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        table.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        scroll.setViewportView(table);

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

        pack();
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Exp697395().setVisible(true);
            }
        });
    }

                   
    private javax.swing.JScrollPane scroll;
    private javax.swing.JTable table;

}

class MyEditor extends JTextField implements TableCellEditor, FocusListener{
    public MyEditor(){
        addFocusListener(this);
    }
   
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        this.row = row;
        this.column = column;
       
        if( value == null)
            setText("");
        else
            setText(value.toString());
       
        this.tbl = table;
        return this;
    }

    public Object getCellEditorValue() {
        return getText();
    }

    public boolean isCellEditable(EventObject anEvent) {
        return true;
    }

    public boolean shouldSelectCell(EventObject anEvent) {
        return true;
    }

    public boolean stopCellEditing() {
        tbl.editingStopped(new ChangeEvent(this));
        System.out.println("Editor mistede focus i række " + (row + 1) + " kolonne " + (column + 1) );
        return true;
    }

    public void cancelCellEditing() {
    }

    public void addCellEditorListener(CellEditorListener l) {
    }

    public void removeCellEditorListener(CellEditorListener l) {
    }

    public void focusGained(FocusEvent e) {
        System.out.println("Editor har focus i række " + (row + 1) + " kolonne " + (column + 1) );
    }

    public void focusLost(FocusEvent e) {
       
    }
   
    private JTable tbl;
    private int row;
    private int column;
}
Avatar billede _carsten Nybegynder
05. april 2006 - 16:50 #3
Kommet videre ?
Avatar billede margitbork Nybegynder
06. april 2006 - 08:47 #4
Undskyld jeg ikke fik svaret tilbage på dit eksempel. Ja jeg er kommet videre med en TableCellEditor. Den kom til at se således ud:
public class JButtonEditor extends AbstractCellEditor implements TableCellEditor
{

  JTableButton buttonJ;
  //  private DistributeRuleListPane distributeRuleListPane;
  private ActionListener listener;
  private String actioncommand;


  public JButtonEditor(ActionListener listener, String actioncommand)
  {
      this.listener=listener;
      this.actioncommand=actioncommand;
      //    final DistributeRuleListPane distpane = distributeRuleListPane;
/*
      button = new JButton("Click Me");
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e){
              JOptionPane.showMessageDialog(null,"Value = " + distpane.getSelectedRule());
          }
            });
*/


  }



  private Map buttonText = new HashMap();



  /* (non-Javadoc)
    * @see javax.swing.table.TableCellEditor#getTableCellEditorComponent(javax.swing.JTable, java.lang.Object, boolean, int, int)
    */
  public Component getTableCellEditorComponent(JTable table, Object value,
                                                boolean isSelected,
                                                int row, int column)
  {
/*
      System.out.println("JButtonEditor.getTableCellEditorComponent value=" + value);
*/
      if (value != null)
      {
        buttonText.put("" + row + column, value);
      }
      else
      {
        value = buttonText.get("" + row + column);
      }

      JTableButton buttonJ = new JTableButton();
      buttonJ.setToolTipText("tooltiptext");
      final String message = value.toString();
      buttonJ.setText(message);
      buttonJ.setActionCommand(actioncommand);
      buttonJ.addActionListener(listener);

      // TODO Auto-generated method stub
      buttonJ.setText(value.toString());
      return buttonJ;
  }



  /* (non-Javadoc)
    * @see javax.swing.CellEditor#getCellEditorValue()
    */
  public Object getCellEditorValue()
  {
      // TODO Auto-generated method stub
      return null;
  }
}
Avatar billede margitbork Nybegynder
16. august 2006 - 11:06 #5
lukker
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

IT-JOB