Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    Swing JTAble DefaultTableCellRenderer. Aiuto!!!

    Salve,
    ho inserito una Jtable (tramite metbeans)nel mio programma. Il problema si pone quando tramite una condizione chiedo che si colori una riga specifica. Fino qui tutto bene.
    La cosa che non capisco è come mai che dopo che si colora la riga correttamente, se posiziono il mouse sulla tabella anche le le righe vengono colorate?

    Il codice che colora:

    codice:
    class CustomTableCellRenderer1 extends DefaultTableCellRenderer {
    
    
        public Component getTableCellRendererComponent(JTable table, Object obj, boolean isSelected, boolean hasFocus, int row, int column) {
            Component cell = super.getTableCellRendererComponent(table, obj, isSelected, hasFocus, row, column);
            cell.setBackground(Color.yellow);
                   if (cell instanceof JLabel) {
            ((JLabel) cell).setBackground(Color.red);
            ((JLabel) cell).setHorizontalAlignment(CENTER);
            ((JLabel) cell).setFont(new java.awt.Font("Calibri", 1, 12));
        }
     return cell ;
        }
    }
    Il metodo che viene chiamato da un altro frame:

    codice:
    if (sev.equals("Pippo")) {
    
      int B = 9;
    
                int index1 = 0;
    
                for (int i = 0; i < B; i++) {
                    tcol = f3.getJTable().getColumnModel().getColumn(index1);
                    tcol.setCellRenderer(new CustomTableCellRenderer());
                    index1 = i;
    
    
                }
    Qualcuno sa dirmi perché?

    Grazie

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326

    Moderazione

    Ho rimosso la discussione duplicata.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2007
    Messaggi
    55
    Ciao, da quello che hai scritto non si capisce la logica del programma e cioè: quando viene invocato il metodo? Chi è "sev"? Come discrimini la riga?
    Ad ogni modo, nel ciclo che fai per assegnare il Renderer tu scorri le colonne (ogni volta che prendi una tcol stai prendendo tutte le righe di tcol), mentre nel metodo getTableCellRendererComponent del renderer non fai nessun controllo sulla riga (parametro di input row).

  4. #4

    JTAble problemi DefaultTableCellRenderer. Aiuto!!!!

    Intanto grazie.

    Hai perfettamente ragione.
    Premesso che sono un neofita e potrei dire qualche boiata.

    quando viene invocato il metodo? Quando aziono il bottone parte la condizione
    Chi è "sev"? Come discrimini la riga? trattasi di comboBox
    le righe si alimentano e si colorano in maniera sequenziale in questo senso:

    se la stringa selezionata dalla ComboBox = pippo
    allora scrivi nelle celle (ho omesso la scritturw nell'esempio) della prima riga e colorale di rosso.
    Per questo è' stato aggiunto un controllo sulla cella che se vuota incrementa il contatore e va alla riga successiva.
    codice:
    class CustomTableCellRenderer1 extends DefaultTableCellRenderer {
    
        public Component getTableCellRendererComponent(JTable table, Object obj, boolean isSelected, boolean hasFocus, int row, int column) {
            Component cell = super.getTableCellRendererComponent(table, obj, isSelected, hasFocus, row, column);
            cell.setBackground(Color.yellow);
                   if (cell instanceof JLabel) {
            ((JLabel) cell).setBackground(Color.red);
            ((JLabel) cell).setHorizontalAlignment(CENTER);
            ((JLabel) cell).setFont(new java.awt.Font("Calibri", 1, 12));
        }
     return cell ;
        }
    }
    
    
    
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    
           String sev = (String) this.severity.getSelectedItem();
                  
                   TableColumn tcol;
    
    //selezione da ComboBox
                  if (sev.equals("Severe")) {
    
                int index = 0;
                first++;
    //f3 è un riferimento ad un altro Frame che contiene la tabella.
                for (int i = 0; i < f3.getJTable().getRowCount(); i++) {
                    if (f3.getJTable().getValueAt(i, 0) == null) {
                        index = i;
    
                        break;
                    }
                }
    Spero di essere stato più chiaro
    Grazie ancora

  5. #5

    Qualche idea??? Problemi con renderer JTable!!!

    Ho copied le c lassi utilizzate per l'esempio: CustomTableCellRenderer and Table.
    La domanda:
    Avrei bisogno di implementate un certo numero di condizioni che mi facciano colorare in rosso o verde le righe.
    Es.
    if ComboBoX1.equals(Item 1)
    row color must be RED
    if ComboBoX1.equals(Item 2)
    row color must be GREEN
    ecc...

    Il problema è questo. Così come l'ho implementato apparentemente funziona. Il problema è che dopo aver generato l'evento tramite il button, se click su una qualsiasi riga vuota, anche
    questa si colora!

    Ho capito che il metodo è sbagliato e che forse le condizioni andrebbero scritte nella classe
    CustomTableCellRenderer e non nella classe Table. Giusto?
    Potete darmi qualche idea?


    //Class CustomTableCellRenderer

    package prove;

    import java.awt.Color;
    import java.awt.Component;
    import javax.swing.JTable;
    import javax.swing.table.DefaultTableCellRenderer;

    public class CustomTableCellRenderer extends DefaultTableCellRenderer {

    public Component getTableCellRendererComponent(JTable table, Object obj, boolean isSelected, boolean hasFocus, int row, int column) {
    Component cell = super.getTableCellRendererComponent(table, obj, isSelected, hasFocus, row, column);
    cell.setBackground(Color.RED);


    return cell ;
    }

    }


    //Class Table
    package prove;

    import javax.swing.table.TableColumn;

    public class Table extends javax.swing.JFrame {

    public Table() {
    initComponents();
    }

    @SuppressWarnings("unchecked")

    private void initComponents() {

    combo1 = new javax.swing.JComboBox();
    jButton1 = new javax.swing.JButton();
    jScrollPane1 = new javax.swing.JScrollPane();
    table1 = new javax.swing.JTable();

    setDefaultCloseOperation(javax.swing.WindowConstan ts.EXIT_ON_CLOSE);

    combo1.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));

    jButton1.setText("Button");
    jButton1.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
    jButton1ActionPerformed(evt);
    }
    });

    table1.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"
    }
    ));
    jScrollPane1.setViewportView(table1);

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
    layout.createParallelGroup(javax.swing.GroupLayout .Alignment.LEADING)
    .addGroup(layout.createSequentialGroup()
    .addGap(22, 22, 22)
    .addGroup(layout.createParallelGroup(javax.swing.G roupLayout.Alignment.LEADING)
    .addComponent(combo1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
    .addComponent(jButton1)
    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 375, javax.swing.GroupLayout.PREFERRED_SIZE))
    .addContainerGap(77, Short.MAX_VALUE))
    );
    layout.setVerticalGroup(
    layout.createParallelGroup(javax.swing.GroupLayout .Alignment.LEADING)
    .addGroup(layout.createSequentialGroup()
    .addGap(19, 19, 19)
    .addComponent(combo1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
    .addGap(41, 41, 41)
    .addComponent(jButton1)
    .addGap(71, 71, 71)
    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 95, javax.swing.GroupLayout.PREFERRED_SIZE)
    .addContainerGap(31, Short.MAX_VALUE))
    );

    pack();
    }

    //Condiction example. I need to implement a lot of condiction!!!
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

    String string1 = (String) combo1.getSelectedItem();
    TableColumn tcol;

    int index = 0;

    if (string1.equals("Item 1")) {

    for (int i = 0; i < table1.getRowCount(); i++) {
    if (table1.getValueAt(i, 0) == null) {
    index = i;

    break;
    }
    }

    int B = 5;

    int index1 = 0;

    for (int i = 0; i < B; i++) {
    tcol = table1.getColumnModel().getColumn(index1);
    tcol.setCellRenderer(new CustomTableCellRenderer());
    index1 = i;

    }
    table1.setValueAt("pippo1", index, 0);
    table1.setValueAt("pippo1"+ "/"+ "pippo2", index, 1);
    table1.setValueAt("pippo1" + "-" + "pippo2", index, 2);
    }

    }

    public static void main(String args[]) {


    new Table().setVisible(true);

    }
    // Variables declaration - do not modify
    private javax.swing.JComboBox combo1;
    private javax.swing.JButton jButton1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable table1;
    // End of variables declaration
    }

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2007
    Messaggi
    55
    Ciao, forse hai bisogno di un paio di modifche. Aggiungi una variabile Color nel tuo rendered e aggiungi anche un controllo sul numero di riga. Ad esempio:
    codice:
    public class CustomTableCellRenderer extends DefaultTableCellRenderer {
    	private static final long serialVersionUID = -3504101284514011307L;
    
    	private Color color;
    
    	public CustomTableCellRenderer(Color color) {
    		super();
    		this.color = color;
    	}
    
    	public Component getTableCellRendererComponent(JTable table, Object obj, boolean isSelected, boolean hasFocus,
    			int row, int column) {
    		Component cell = super.getTableCellRendererComponent(table, obj, isSelected, hasFocus, row, column);
    		if (row == 0) {
    			cell.setBackground(color);
    		} else {
    			cell.setBackground(new Color(255, 255, 255));
    		}
    		return cell;
    	}
    }
    Non ho capito un bel po di cose nel tuo listener (USA I TAG CODE!!!) tra tutti i cicli strani che vedo, comunque, pulito un po', con un rapaint() alla fine, prova una cosa del genere:
    codice:
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    		String string1 = (String) combo1.getSelectedItem();
    		TableColumn tcol;
    		int index = 0;
    		if (string1.equals("Item 1")) {
    			int B = 4;
    			// int index1 = 0;
    			for (int i = 0; i < B; i++) {
    				tcol = table1.getColumnModel().getColumn(i);
    				tcol.setCellRenderer(new CustomTableCellRenderer(Color.RED));
    				// index1 = i;
    			}
    			table1.setValueAt("pippo1", index, 0);
    			table1.setValueAt("pippo1" + "/" + "pippo2", index, 1);
    			table1.setValueAt("pippo1" + "-" + "pippo2", index, 2);
    		}
    		table1.repaint();
    	}
    Non ho testato, se non dovesse colorarsi tutta la prima riga al click del bottone, prova uno SwingUtilities.invokeLater per il repaint.

  7. #7

    Problema risolto! Grazie

    Grazie infinite borras. Hai capito e risolto perfettamente il mio problema.

  8. #8
    Scuate, ma ancora non funziona.
    In realtà in questo modo funziona solo per la riga 0.
    Io ho bisogno che man mano che le righe vengono popolate, vengano colorate le stesse righe e quindi con lo stesso criterio.
    Nel senso che se ho una certa condizione, popolerò la riga e la colorerò ed al click successivo andrò alla riga successiva.

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    28
    Non è necessario, oltre che dispendioso, creare un nuovo renderer ogni volta... Una soluzione semplice è quella di utilizzare un vettore "parallelo" di booleani in cui riporti quale riga colorare... Forse uno snippet è più comprensibile di tante parole:

    codice:
    Object rowData[] = new Object[nrRow];
     
    boolean redColoring[] = new boolean[nrRow];
      
    String columnNames[] = new String[nrCol];
    
    JTable table = new JTable(rowData, columnNames);
        
    table.setDefaultRenderer(Object.class, new TableCellRenderer() {
        
       @Override
       public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column){
            
            JLabel label = new JLabel(value.toString());
            
            label.setOpaque(true);
    
            if (redColoring[row]) {
            
              label.setBackground(Color.RED);
            
            }
                   
            return label;
                   
         }
        
        });
    A questo punto ti gestisci il vettore di booleani, alzando e/o abbassando l'elemento (riga i-sima) che vuoi colorare.

  10. #10
    Non credo di aver capito! Vabbè colpa della mia ignoranza naturalmente.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.