JTable

di il
34 risposte

34 Risposte - Pagina 2

  • Re: JTable

    Sembra che non leggi i post e le domande... boh.
  • Re: JTable

    Siccome non mi risponde nessuno potreste magari indicarmi qualche forum in inglese dove posso postare queste domande? Su StackOverflow non accettano nessuna domanda... Grazie...
  • Re: JTable

    Non mi pare corretto quello che chiedi. Hai avuto risposte, certamente non la pappa pronta se è quello che cerchi.

    Studiare no?
  • Re: JTable

    Sono riuscita a fare sì che le righesiano a colore alternato, il problema adesso è che quando cerco di scrivere in una cella appena clicco fuori si cancella la scritta (ma se provo a stampare con system.out-print il contenuto di quella cella stampa quello che ho scritto. Quindi teoricamente viene memorizzato, ma non si vede... Come faccio a farlo vedere?
  • Re: JTable

    p0ll0_ ha scritto:


    Sono riuscita a fare sì che le righesiano a colore alternato, il problema adesso è che quando cerco di scrivere in una cella appena clicco fuori si cancella la scritta
    Dipende da cosa hai fatto per alternare lo sfondo .... fai vedere.

    Comunque vedo che hai fatto una cosa tipo:
    jLabel1.setLayout(new GridLayout());

    JLabel non si usa solitamente come "contenitore". Anche se tecnicamente lo è, perché tutti i componenti Swing derivano da java.awt.Container.
  • Re: JTable

       public database() {
            initComponents();
            tabella.removeColumn(tabella.getColumnModel().getColumn(0));
            tabella_();
        }
    
        TableColumn[] colonne = new TableColumn[6];
    
        JTable tabella = new JTable(colonne.length, 1);
    
        DefaultTableModel modello = (DefaultTableModel) tabella.getModel();
    
        public void tabella_() {
    
            jPanel1.setLayout(new BorderLayout());
    
            colonne[0] = new TableColumn(0, 170);
            colonne[0].setHeaderValue("Codice prodotto");
    
            colonne[1] = new TableColumn(0, 400);
            colonne[1].setHeaderValue("Descrizione");
    
            colonne[2] = new TableColumn(0, 50);
            colonne[2].setHeaderValue("Q.tà");
    
            colonne[3] = new TableColumn(0, 90);
            colonne[3].setHeaderValue("Prezzo");
    
            colonne[4] = new TableColumn(0, 90);
            colonne[4].setHeaderValue("Totale");
    
            colonne[5] = new TableColumn(0, 120);
            colonne[5].setHeaderValue("Scadenza");
    
            for (int i = 0; i < 6; i++) {
                tabella.addColumn(colonne[i]);
            }
    
            tabella.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
            tabella.getTableHeader().setFont(new java.awt.Font("Tahoma", 0, 20));
    
            tabella.setRowHeight(30);
    
            /**/
            jPanel1.add(new JScrollPane(tabella));
            tabella.setDefaultRenderer(Object.class, new TableCellRenderer() {
                @Override
                public Component getTableCellRendererComponent(
                        JTable table, Object value, boolean isSelected, boolean hasFocus,
                        int row, int column) {
    
                    JPanel pane = new JPanel();
                    if (!isSelected) {
                        if (row % 2 == 1) {
                            pane.setBackground(new java.awt.Color(240, 240, 240));
                        } else {
                            pane.setBackground(Color.WHITE);
    
                        }
                    } else {
                        pane.setBackground(new java.awt.Color(205, 205, 255));
                    }
    
                    return pane;
                }
            });
    
        }
    Ho provato a sostituire JLabel con JPanel, ma niente...
  • Re: JTable

    p0ll0_ ha scritto:


            tabella.setDefaultRenderer(Object.class, new TableCellRenderer() {
                @Override
                public Component getTableCellRendererComponent(
                        JTable table, Object value, boolean isSelected, boolean hasFocus,
                        int row, int column) {
    
                    JPanel pane = new JPanel();
                    if (!isSelected) {
                        if (row % 2 == 1) {
                            pane.setBackground(new java.awt.Color(240, 240, 240));
                        } else {
                            pane.setBackground(Color.WHITE);
    
                        }
                    } else {
                        pane.setBackground(new java.awt.Color(205, 205, 255));
                    }
    
                    return pane;
                }
            });
    No, non è corretto/appropriato sfruttare il "default" cell renderer. E meno ancora restituire come componente da "stampare" nella cella un banale JPanel, perché non è configurato con nulla e non mostra nulla di utile. Non hai sufficienti basi sui renderer.

    Scrivo io un esempio banale dove si estende JTable come dicevo precedentemente.
  • Re: JTable

    andbin ha scritto:


    Non hai sufficienti basi sui renderer.
    Non ho alcunissima base sui renderer
  • Re: JTable

    Ecco un esempio ridotto al minimo. I colori di sfondo sono pure facilmente parametrabili (non sono schiantati nel codice di MyCustomTable).
    import java.awt.Color;
    import java.awt.Component;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.SwingUtilities;
    import javax.swing.table.TableCellRenderer;
    
    public class ProvaFrame extends JFrame {
        public ProvaFrame() {
            super("Prova Frame");
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            setSize(400, 300);
    
            JTable table = new MyCustomTable(40, 6, new Color[] { new Color(0xFFFFA0), new Color(0xA0FFFF) });
            table.setValueAt(1234, 2, 2);
            table.setValueAt(5678, 4, 4);
            add(new JScrollPane(table));
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    new ProvaFrame().setVisible(true);
                }
            });
        }
    }
    
    
    class MyCustomTable extends JTable {
        private Color[] backgroundColors;
    
        public MyCustomTable(int numRows, int numColumns, Color[] backgroundColors) {
            super(numRows, numColumns);
            this.backgroundColors = backgroundColors;
        }
    
        @Override
        public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
            Component comp = super.prepareRenderer(renderer, row, column);
    
            if (!isCellSelected(row, column)) {
                comp.setBackground(backgroundColors[row % backgroundColors.length]);
            }
    
            return comp;
        }
    }
  • Re: JTable

    @p0ll0_

    Non editare i post precedenti. Magari ci sono utenti a cui interesserebbe la discussione che poi si trovano con dei pezzi mancanti.
  • Re: JTable

    andbin ha scritto:


    ...
    Come faccio a far funzionare i codici che mi hai messo? li ho messi nel programma, ma non fa nulla.
  • Re: JTable

    p0ll0_ ha scritto:


    Come faccio a far funzionare i codici che mi hai messo? li ho messi nel programma, ma non fa nulla.
    Quale è la difficoltà? Devi solo mettere una classe in più, io l'ho chiamata "MyCustomTable" ma puoi chiamarla come vuoi ...

    E poi invece di fare new JTable( ..... ) farai new MyCustomTable( ..... )
    Se ti serve una forma particolare di costruttore es. TableModel e Color[] va scritto espressamente (l'esempio è per righe/colonne/colori).
  • Re: JTable

    Le colonne vorrei che avessero delle scritte diverse. Tipo tutte le righe di una colonna hanno la scritta centrata, quella di un'altra hanno la scritta a destra... Come si fa?
  • Re: JTable

    p0ll0_ ha scritto:


    Le colonne vorrei che avessero delle scritte diverse. Tipo tutte le righe di una colonna hanno la scritta centrata, quella di un'altra hanno la scritta a destra... Come si fa?
    E qui purtroppo entrano in gioco i renderer, che hai già detto chiaramente di non conoscere.

    Un discorso leggermente diverso sarebbe se una colonna contiene solo numeri, es Integer, perché in quel caso se il table model espone come tipo (java.lang.Class) della colonna ad esempio Integer.class viene GIÀ scelto automaticamente un renderer che allinea a destra.
  • Re: JTable

    Il capo ha cambiato idea, solo una colonna vuole che sia diversa. È una colonna con un int... come si fa?
    Poi ho un altro problema: Ho creato un'altra finestra che si apre quandoclicco su un bottone. La finestra si apre, ma quando la chiudo tutto il programma si chiude... Grazie mille.
Devi accedere o registrarti per scrivere nel forum
34 risposte