IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants Java Discussion :

[JTable]désactiver (voile blanc) impossible ?!


Sujet :

Composants Java

  1. #1
    Invité
    Invité(e)
    Par défaut [JTable]désactiver (voile blanc) impossible ?!
    Bonjour,

    Pourquoi lorsque je fais jTable.setEnabled(false), celle-ci n'est pas désactivé comme l'est un JButton avec la même méthode ? et comment faire ?

    j'ai essaye avec le JScrollPane, même j'ai le même pb :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    jScrollPane.getHorizontalScrollBar().setEnabled(false);
    jScrollPane.getVerticalScrollBar().setEnabled(false);
    jScrollPane.getViewport().getView().setEnabled(false);
    merci.

  2. #2
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Au pire tu mets ta table dans un LayeredPane et quand apparait le besoin de la bloquer tu rajoutes un panel presque transparent par dessus comme ceci les évènement seront tous bloqués par le panel ajouté au dessus
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  3. #3
    Membre éclairé
    Avatar de bbclone
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 537
    Points : 704
    Points
    704
    Par défaut
    desactiver la JTable ca veut dire rendre les cellule pas editable?
    alors dans ton model tu as la methode boolean isCellEditable(row, col) et tu lui fait qu'elle retourne tout le temps false.

    si tu veut l'apprence gris, tu fait deja ca (isCellEditable retourn toujours false) et ensuite tu override la methode prepareRenderer de ta JTable pour "afficher" la cellule en gris.

  4. #4
    Invité
    Invité(e)
    Par défaut
    non je ne veux pas toucher à l' "editabilité" de mes cellules.

    je veux avoir une sorte de voile blanc comme pour les JButton ou les JList, mais apparement ce n'est pas réalisable automatiquement avec les JTable, dommage.

    Si il n'y a pas d'autre solution, je me tournerai vers celle de sinok, mais ca demande du travail

  5. #5
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Pour faire un panel faisant le voile c'est pas bien sorcier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    public class TranslucentPanel extends JPanel {
        Composite alphaComp;
        public TranslucentPanel() {
            super();
            setBackground(Color.WHITE);
            alphaComp = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f);
            // TODO Auto-generated constructor stub
        }
     
     
        @Override
        protected void paintComponent(Graphics arg0) {
            // TODO Auto-generated method stub
            Graphics2D g2d = (Graphics2D) arg0;       
            g2d.setComposite(alphaComp);
            super.paintComponent(g2d);
        }
    }
    Puis ensuite tu "active/désactive" ta JTable en plaçant ce panel dans une couche supérieure du JLayeredPane (genre tu mets le JScrollPane dans le PALETTE_LAYER et ton Panel bloquant dans le MODAL_LAYER et pis voilà
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  6. #6
    Membre éclairé
    Avatar de bbclone
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 537
    Points : 704
    Points
    704
    Par défaut
    c'est pas sorcier mais ca me semble bizzare.
    parce que si une table est editable pourquoi la rendre setEnabled(false)

    sinon, sort le "Composite alphaComp = ..." de ton paintComponent. ;-)

  7. #7
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Citation Envoyé par bbclone
    c'est pas sorcier mais ca me semble bizzare.
    parce que si une table est editable pourquoi la rendre setEnabled(false)
    je sais pas, pour la bloquer le temps d'un gros traitement par exemple

    Code bbclone : Sélectionner tout - Visualiser dans une fenêtre à part
     sinon, sort le "Composite alphaComp = ..." de ton paintComponent. ;-)
    Mouaip ça pourrait être pas mal en effet ^^codage de bourrin comme d'hab
    j'modifie ça illico.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  8. #8
    Membre éclairé
    Avatar de bbclone
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 537
    Points : 704
    Points
    704
    Par défaut
    Citation Envoyé par sinok
    je sais pas, pour la bloquer le temps d'un gros traitement par exemple
    pourquoi pas utiliser le GlassPane alors?

  9. #9
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    car il doit vouloir le faire que sur une partie de l'application, pas l'intégralité, bienvenue dans le grand monde des suppositions...
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  10. #10
    Membre éclairé
    Avatar de bbclone
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 537
    Points : 704
    Points
    704
    Par défaut
    tu peut dessiner une zone grise juste sur une partie de ton GlassPane si tu veut pas que toute les partie de ton application soit grisee...

    je suppose qu'il doit avoir ses raison :-))

  11. #11
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    voui mais si tu utilise la glasspane tu ne peux plus cliquer nulle part ...
    Alors qu'avec un JLayeredPane oui...
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  12. #12
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Sinon d'une maniere plus simple. En general quand je dois faire un myTable.setEnabled(false) je fais egalement ces operations :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    myTable.setOpaque(false);
    ( (JLabel) myTable.getCellRenderer(0, 0)).setOpaque(false);
    //Penser egalement a le faire pour les renderer customises.
    myTableScrollPane.setOpaque(false);
    myTableScrollPane.getViewPort().setOpaque(false);
    Et ca peut etre aussi utile pour afficher une image en fond de JTable.
    Apres essais, ce n'est guere interessant de rendre les tetes de colonnes transparentes. Mais en modifiant et les cell renderer et les composants charges du rendu des tetes de colonne, on peut faire que le texte devienne grise ou les sous-composant inactifs (nottament dans le cas de renderer customises) nottament en testant tout simplement l'etat isEnabled() du parametre table passe en argument de la methode getTableCellRendererComponent(...), ...
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  13. #13
    Invité
    Invité(e)
    Par défaut
    j'ai essayé le JLayeredPane mais j'ai un pb de layout, j'ai simplement remplacé ma JTable par un JLayeredPane dans mon écran, puis j'ai ajouté mon JScrollPane contenant ma JTable dans ce layeredPane comme sinok m'avait indiqué : layeredPane.add(spTbl, JLayeredPane.PALETTE_LAYER); mais du coup ma JTable n'est pas redimmensionner à la taille de ma fenêtre !?

  14. #14
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Ton JLayeredPane doit contenir le JScrollPane et non la JTable.
    Et si ta table après ça ne prends pas tout l'espace dispo c'est que ton JLayeredPane est mal ajouté au niveau du layout, et sinon utilises la DEFAULT_LAYER pour mettre le JScrollPane je me suis un peu fourvoyé hier en te disant d'utiliser le layer PALETTE
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  15. #15
    Invité
    Invité(e)
    Par défaut
    oui c'est bien le scrollpane que j'ajoute au layeredpane.

    j'utilise un FormLayout pour mon JPanel contenant le LayeredPane, voici les attributs de la cellule :
    pour la colonne : new ColumnSpec(ColumnSpec.FILL, Sizes.DEFAULT, FormSpec.DEFAULT_GROW);
    pour la ligne : FormFactory.DEFAULT_ROWSPEC;
    et coila comment je l'ajoute à mon Panel principal : add(layeredPane, cc.xywh(3, 3, 1, 1, CellConstraints.FILL, CellConstraints.FILL));

    Pour ça c'est ok.

    Je corrige un peu, c'est mon JScrollPane qui ne s'adapte pas à la taille de mon JLayeredPane.

  16. #16
    Invité
    Invité(e)
    Par défaut
    ok j'ai trouvé, j'avais pas vu qu'on pouvait utiliser cette méthode add
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    layeredPane.setLayout(new BorderLayout());
    layeredPane.add(spTbl, BorderLayout.CENTER, JLayeredPane.DEFAULT_LAYER);
    comme ca c'est ok, mais le TranslucentPanel ne fonctionne pas.

  17. #17
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    c'est à dire?
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  18. #18
    Invité
    Invité(e)
    Par défaut
    ben je n'est pas le voile blanc, lorsque je l'ajoute au layeredPane : layeredPane.add(translucentPanel, BorderLayout.CENTER, JLayeredPane.MODAL_LAYER);

    rien ne se passe

  19. #19
    Membre éclairé
    Avatar de bbclone
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 537
    Points : 704
    Points
    704
    Par défaut
    Crash_TeTe, c'est quoi un voile?

    quand tu met setEnabled(false) sur un bouton ou un textField ou des autre composant ca affiche en gris, c'est grace (ou a cause) de ton l&f.
    au niveau des basic dans ton paint, painText il y a des test pour voir si ton model est enabled ou pas et en fonction va utiliser une couleur particuliere.

    si tu veut afficher une table grisee quand elle est setEnabled(false) tu peut extends BasicTableUI et surcharger une serie de methodes...
    paint
    paintGrid
    paintCell
    ...

    j'allais oublier, tu dois aussi alors extend de BasicTableHeaderUI et les afficher d'une autre facon.

    mais je peut te dire (par expereience que c'est bcp bcp de travail).


    ce que je te propose c'est une solution facile.
    teste ce code et dis moi qu'est ce que tu en pense... (c'est le meme code que je t'ai envoyer ce matin par mail ce matin).

    le model
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    import javax.swing.event.TableModelListener;
    import javax.swing.table.TableModel;
     
    /**
     * @author bebe
     */
    public class MyTableModel implements TableModel {
     
        private final int ROW_COUNT = 5;
        private final int COL_COUNT = 5;
     
        Object [][] o = new String[5][5];
     
        public MyTableModel() {
            for (int i = 1; i <= ROW_COUNT; i++) {
                for (int j = 1; j <= COL_COUNT; j++) {
                    o[i - 1][j - 1] = String.valueOf(i * j);
                }
            }
        }
     
        public int getRowCount() {
            return ROW_COUNT;
        }
     
        public int getColumnCount() {
            return COL_COUNT;
        }
     
        public String getColumnName(int columnIndex) {
            return "Column " + (columnIndex + 1);
        }
     
        public Class<?> getColumnClass(int columnIndex) {
            return String.class;
        }
     
        public boolean isCellEditable(int rowIndex, int columnIndex) {
            return true;
        }
     
        public Object getValueAt(int rowIndex, int columnIndex) {
            return o[rowIndex][columnIndex];
        }
     
        public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
            o[rowIndex][columnIndex] = aValue;
        }
     
        public void addTableModelListener(TableModelListener l) {
            // not implemented
        }
     
        public void removeTableModelListener(TableModelListener l) {
            // not implemented
        }
    }
    le tester
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
     
    import java.awt.Color;
    import java.awt.EventQueue;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.HeadlessException;
    import java.awt.Insets;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.UIManager;
    import javax.swing.table.TableCellEditor;
     
    /**
     * @author bebe
     */
    public class EnableDisableJTable extends JFrame implements ActionListener {
     
        JTable myTable = null;
        JButton myButton = null;
     
        public EnableDisableJTable(String s) throws HeadlessException {
            super(s);
     
            /* layout components on the ContenPane */
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.insets = new Insets(5, 5, 5, 5);
            gbc.weightx = gbc.weighty = 1.;
            gbc.fill = GridBagConstraints.BOTH;
     
            /* some usual codes... */
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setLocationByPlatform(true);
            setSize(400, 300);
     
            /* add the table to the ContentPane */
            myTable = new JTable(new MyTableModel());
            add(new JScrollPane(myTable), gbc);
     
            /* add a button to enable/disable the table */
            myButton = new JButton("Click me to disable JTable");
            myButton.setEnabled(false);
            myButton.addActionListener(this);
     
            /* add the button to the ContentPane */
            gbc.weightx = gbc.weighty = gbc.gridx = gbc.insets.top = 0;
            gbc.fill = GridBagConstraints.NONE;
            gbc.anchor = GridBagConstraints.EAST;
            add(myButton, gbc);
        }
     
        /* */
        public void actionPerformed(ActionEvent e) {
            boolean isEnabled = myTable.isEnabled();
            if (isEnabled) {
                myButton.setText("Click me to enable JTable");
            } else {
                myButton.setText("Click me to disable JTable");
            }
     
            // first stop editing. But what if editing doesn't want to stop?
            TableCellEditor tce = myTable.getCellEditor();
            if (tce != null) {
                tce.stopCellEditing();
            }
     
            // disable the table. from now, use !isEnabled i.o. isEnabled
            myTable.setEnabled(!isEnabled);
     
            /* clear the selection, so you won't see anymore which row was previously selected.
               or, (perhaps better) save it and restore it when you enable/disable your table.
            */
            myTable.clearSelection();
     
            /* disable/enable reordering... */
            myTable.getTableHeader().setReorderingAllowed(!isEnabled);
     
            /* you can also enable/disable autoResizeMode, but you'll have to save the mode and restore it */
     
            /* now, set the background color depending on the JTable's state. */
            if (!isEnabled) {
                myTable.setBackground((Color) UIManager.get("TextField.background"));
                /* Although brighter and darker are inverse operations, the results of a series of invocations of these
                   two methods might be inconsistent because of rounding errors. */
                /* change also the tableHeader's background? here we "restore" it */
                myTable.getTableHeader().setBackground(myTable.getTableHeader().getBackground().brighter());
            } else {
                myTable.setBackground((Color) UIManager.get("TextField.inactiveBackground"));
                /* change also the tableHeader's background  to make it darker */
                myTable.getTableHeader().setBackground(myTable.getTableHeader().getBackground().darker());
            }
        }
     
        /** the main method */
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable(){
                public void run() {
                    new EnableDisableJTable("1").setVisible(true);
                }
            });
        }
    }
    si tu enleve les commentaire il reste tres peu de code :-)

  20. #20
    Invité
    Invité(e)
    Par défaut
    merci bbclone ce code marche niquel, mais ce n'est pas vraiment l'effet que je souhaite, quand j'aurais un peu de temps je me pencherais sur une sorte de TranslucentPanel.

Discussions similaires

  1. JTable désactiver sélection ligne
    Par totot dans le forum Composants
    Réponses: 2
    Dernier message: 03/05/2015, 13h14
  2. Probleme de border (trait blanc impossible a enlever)
    Par Naografix dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 01/12/2014, 18h16
  3. Activation/Désactivation de couche impossible
    Par michelD13 dans le forum IGN API Géoportail
    Réponses: 4
    Dernier message: 22/09/2012, 14h04
  4. désactiver touche entrée, impossible!
    Par gwena54 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 20/08/2008, 17h57
  5. JTable : désactiver la sélection d'une celulle
    Par Foub dans le forum Composants
    Réponses: 3
    Dernier message: 19/12/2007, 15h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo