• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

nakuro

Problema com JTable

10 mensagens neste tópico

Boas

Tava aqui a tentar fazer uma brincadeira em java, e estou com um problema:

tenho a seguinte tabela:

capturaecra2gi6.png

A terceira coluna tem uma combo box com varias opções, eu queria que quando se escolhe-se uma opção na combo box, aparecesse na segunda coluna o valor escolhido da combo box, em vez de n/d.

E depois quando se pressiona-se o botão inserir, eu poder receber o valor das celulas da segunda coluna.

Foi ao site da sun, e tentei modificar o exemplo, mas não tou a conseguir, aqui fica o codigo:

/*
* TableRenderDemo.java requires no other files.
*/

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Iterator;
import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.table.TableModel;

/** 
* TableRenderDemo is just like TableDemo, except that it
* explicitly initializes column sizes and it uses a combo box
* as an editor for the Sport column.
*/
public class TableRenderDemo extends JPanel implements  TableModelListener, ActionListener {
    private boolean DEBUG = false;
    MyTableModel temp2;
    JButton botao= new JButton("Inserir");

    public TableRenderDemo() {
        super(new GridLayout(1,0));
        ArrayList<String> array= new ArrayList<String>();
        array.add("7362487634");
        array.add("435345");
        MyTableModel temp=new MyTableModel();
        
        temp.setcolunas(array, 2,3);

        JTable table = new JTable(temp);
        table.setEnabled(true);
        table.setPreferredScrollableViewportSize(new Dimension(500, 70));
        table.setFillsViewportHeight(true);
        table.getModel().addTableModelListener(this);

        //Create the scroll pane and add the table to it.
        JScrollPane scrollPane = new JScrollPane(table);

        //Set up column sizes.
        initColumnSizes(table);

        //Fiddle with the Sport column's cell editors/renderers.
        setUpSportColumn(table, table.getColumnModel().getColumn(2));

        //Add the scroll pane to this panel.
        add(scrollPane);
        temp2=temp;
    }

    /*
     * This method picks good column sizes.
     * If all column heads are wider than the column's cells'
     * contents, then you can just use column.sizeWidthToFit().
     */
    private void initColumnSizes(JTable table) {
        MyTableModel model = (MyTableModel)table.getModel();
        TableColumn column = null;
        Component comp = null;
        int headerWidth = 0;
        int cellWidth = 0;
        Object[] longValues = model.longValues;
        TableCellRenderer headerRenderer =
            table.getTableHeader().getDefaultRenderer();

        for (int i = 0; i < 3; i++) {
            column = table.getColumnModel().getColumn(i);

            comp = headerRenderer.getTableCellRendererComponent(
                                 null, column.getHeaderValue(),
                                 false, false, 0, 0);
            headerWidth = comp.getPreferredSize().width;

            comp = table.getDefaultRenderer(model.getColumnClass(i)).
                             getTableCellRendererComponent(
                                 table, longValues[i],
                                 false, false, 0, i);
            cellWidth = comp.getPreferredSize().width;

            if (DEBUG) {
                System.out.println("Initializing width of column "
                                   + i + ". "
                                   + "headerWidth = " + headerWidth
                                   + "; cellWidth = " + cellWidth);
            }

            column.setPreferredWidth(Math.max(headerWidth, cellWidth));
        }
    }

    public void setUpSportColumn(JTable table,
                                 TableColumn sportColumn) {
        //Set up the editor for the sport cells.
        JComboBox comboBox = new JComboBox();
        comboBox.addItem("escolher");
        comboBox.addItem("TMN");
        comboBox.addItem("Vodafone");
        comboBox.addItem("Optimus");
        comboBox.addItem("outra");
        comboBox.addActionListener(this);
        //comboBox.addItem("None of the above");
        sportColumn.setCellEditor(new DefaultCellEditor(comboBox));
        

        //Set up tool tips for the sport cells.
        DefaultTableCellRenderer renderer =
                new DefaultTableCellRenderer();
        renderer.setToolTipText("Click for combo box");
        sportColumn.setCellRenderer(renderer);
    }

    class MyTableModel extends AbstractTableModel {
        private String[] columnNames = {"numero",
                                        "Operadora",
                                        "escolher"};
        
        public Object[][] data = { //isto e inutil, e usado so pa inicializar o array
            {"Mary", "n/d",
             "escolher"},
            {"Alison", "n/d",
             "escolher"},
            {"Kathy", "n/d",
             "escolher"},
            {"Sharon", "n/d",
             "escolher"},
            {"Philip", "n/d",
             "escolher"}
        };

        public void addTableModelListener(TableModelListener tableModelListener) {
        }
        public void setcolunas(ArrayList<String>array, int i, int y){
            Iterator it= array.iterator();
            Object[][] data2=new Object[i][y];
            int h=0;
            while(it.hasNext()){
                String number= (String) it.next();
                data2[h][0]= number;
                data2[h][1]="n/d";
                data2[h][2]="escolher";
                h++;
                
            }
            this.data=data2;
            
        }

        public final Object[] longValues = {"Sharon", "Campione",
                                            "None of the above",
                                            new Integer(20), Boolean.TRUE};

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

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

        public String getColumnName(int col) {
            return columnNames[col];
        }

        public Object getValueAt(int row, int col) {
            return data[row][col];
        }
        public Object getnumero(int i){
            return data[i][2];
        }

        /*
         * 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.
            if (col < 2) {
                return false;
            } else {
                return true;
            }
        }

        /*
         * Don't need to implement this method unless your table's
         * data can change.
         */
        public void setValueAt(Object value, int row, int col) {
            if (DEBUG) {
                System.out.println("Setting value at " + row + "," + col
                                   + " to " + value
                                   + " (an instance of "
                                   + value.getClass() + ")");
            }

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

            if (DEBUG) {
                System.out.println("New value of data:");
                printDebugData();
            }
        }

        private void printDebugData() {
            int numRows = getRowCount();
            int numCols = getColumnCount();

            for (int i=0; i < numRows; i++) {
                System.out.print("    row " + i + ":");
                for (int j=0; j < numCols; j++) {
                    System.out.print("  " + data[i][j]);
                }
                System.out.println();
            }
            System.out.println("--------------------------");
        }
    }

    /**
     * Create the GUI and show it.  For thread safety,
     * this method should be invoked from the
     * event-dispatching thread.
     */
    public  void createAndShowGUI()  {
        //Create and set up the window.
        JFrame frame = new JFrame("TableRenderDemo");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        //Create and set up the content pane.
        
        TableRenderDemo newContentPane = new TableRenderDemo();
        
        newContentPane.setOpaque(true); //content panes must be opaque
        frame.setContentPane(newContentPane);
        
        botao.setSize(50,50);
        botao.addActionListener(this);
        frame.add(botao);

        //Display the window.
        frame.pack();
        frame.setVisible(true);
    }
     public void actionPerformed(ActionEvent e) {
         //JComboBox com=(JComboBox)temp2.getnumero(0);
         //String tempe=(String)com.getSelectedItem();
         if(e.getSource()!=botao){
            String tempe= (String) temp2.getnumero(0);
            System.out.println(tempe);
         }
         else{
             System.out.println("botao");
         }
        
    }
     
    public void tableChanged(TableModelEvent e) {
        int row = e.getFirstRow();
        int column = e.getColumn();
        TableModel model = (TableModel)e.getSource();
        String columnName = model.getColumnName(column);
        Object data = model.getValueAt(row, column);
        System.out.println("ola");

        // Do something with the data...
    } 

    public  void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
    
    
}

Tentei fazer aqui algumas experiencias, mas não sei se esta minimamente correcto.

O codigo esta muito confuso eu sei por tive que arranjar "manobras" para conseguir alterar o exemplo da sun, mas se poderem arranjar exemplo de como faço para conseguir fazer aquilo que expliquei acima, ja era capaz de me safar.

Espero que me possam ajudar :ipool:

Cumprimentos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não vi o teu código, não tenho possibilidade agora, mas o que disseste é implementado através de eventos. No evento que é disparado automáticamente quando o utilizador escolhe um valor da combobox acedes à celula que queres e alteras o valor para o valor que pretendes.

Não me lembro do nome do evento, deve ser algo como onChange, ou onValueChange, ou coisa parecida.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois mas as combo box são criadas dinamicamente, ou seja não são criadas uma a uma, é conforme o numero de valores que tenho no array.

So que quando gera um evento eu não sei determinar por qual combo box e que foi gerado, quer dizer sei mas depois no codigo não consigo distingir qual a combo box para depois colocar o valor na coluna anterior

as combo box são adicionadas da seguinte forma:

 JComboBox comboBox = new JComboBox();
        comboBox.addItem("escolher");
        comboBox.addItem("TMN");
        comboBox.addItem("Vodafone");
        comboBox.addItem("Optimus");
        comboBox.addItem("outra");
        comboBox.addActionListener(this);
        //comboBox.addItem("None of the above");
        sportColumn.setCellEditor(new DefaultCellEditor(comboBox));

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso é só uma combobox não são várias. Tens várias comboboxes ou tens uma com vários valores?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Segundo percebi eu crio uma combo box, e o metodo põe para cada linha da tabela aquela combobox, as combo boxs nas llinhas da tabela são todas iguais. a questão e:

Eu recebo o evento da combobox, so que eu não sei qual delas foi, ou seja, em que linha da tabela foi, se foi na 4ª ou na 1000 (caso exista), sei apenas que existe um evento de uma combo box, o que eu queria era saber era em que linha e que foi gerado o evento da combo box

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crias um objecto que descenda de JCombobox e que possuem os parametros que pretendes, depois no evento tens forma de diferenciar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas eu não sei quantos preciso de criar, pois o programa lê tabelas de excel e o numero de linhas pode variar muito...Não percebi como fazer aquilo que disses-te, não te importas de dar um exemplo?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Talvez não tenha percebido bem o que pretendes, podes dar um exemplo mais explicito, por exemplo, podes colocar um screenshot de como queres a versão final e que dados tem o ficheiro de excel?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

capturaecra2gi6.png

Tenho este tipo de tabela.

O que o meu programa faz e ir a um ficheiro excel buscar uns numeros a uma determinada coluna, ate aqui tudo bem.

Depois para os numeros que ele não consegue determinar a operadora cria esta tabela e coloca os numeros na primeira coluna, na segunda coluna põe o estatuto de N/D e na terceira coluna coloca uma combo box com as opções: vodafone,optimus, tmn, outras.

O que eu pretendo e que quando o utilizador, numa determinada linha da tabela, selecionar uma operadora, na segunda coluna devia aparecer o valor que o utilizador escolheu na combo box.

O problema e que eu não consigo saber qual a linha em que ele seleccionou a combo box, apenas consigo saber que houve um evento de uma combo box, mas n sei de que linha.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vou tentar explicar, se não perceberes amanhã tento fazer um pedaço de código que ajude.

A solução que me aparece mais fácilmente é criares uma classe, MyCombo, que seja subclasse de JComboBox, à qual acrescentas a tabela à qual a combobox pertence e a posição da combobox dentro da tabela.

Na classe onde tens o métodos para tratar eventos crias mais um para tratar os eventos deste tipo de combobox. Um evento recebe sempre o objecto que o accionou, é automático, apenas precisas de aceder a esse objecto, que sabes ser uma das comboboxes dentro da tabela, aceder aos valores de linha e coluna que esse objecto tem e escrever na linha e coluna correspondente da tabela.

Parece-me um simples problema de POO.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora