2010-07-11 12 views
5

J'ai créé une colonne avec des cellules qui contiennent un JTextArea + A DButton l'intérieur, comme vous pouvez le voir dans l'image ci-dessous dans la colonne 3:Puis-je créer une colonne JTable sans bordure?

alt text

Mais j'ai fait face à beaucoup de problèmes avec mon CellRenderer et CellEditor lors de la mise à jour des valeurs des cellules dans cette colonne, car mon code est un peu compliqué. Donc, je veux remplacer cette colonne avec 2 colonnes. Une colonne doit être de les cellules de la chaîne normale et l'autre doit être de les cellules JButton mais ces 2 colonnes doivent avoir le même aspect que la colonne 3 apparaît dans l'image ci-dessus. Donc mes questions sont:

1. Comment puis-je fusionner les en-têtes des 2 colonnes ensemble?

2. Comment puis-je supprimer les bordures gauches de la colonne JButtons?

Si elles sont fixes, les 2 colonnes auront le même aspect que l'image ci-dessus + la mise à jour des valeurs des cellules sera beaucoup plus facile.

-------------------------------- Modifier: Mon code exemples de problèmes:

Ok les gars ... Vous l'avez demandé. Mon code est énorme mais si vous pouvez m'aider à le réparer, ce serait parfait. J'ai créé un échantillon en cours d'exécution pour mon problème & inclus mon code source aussi. Vous pouvez le télécharger ici:

Jar sample

Le problème est que j'utiliser un bouton pour permettre le tri des lignes de table (les déplacer vers le haut/bas), mais quand je fais quelques-unes des cellules déplacées valeurs ne sont pas actualisé !

Vous pouvez voir la capture d'écran suivante: alt text Le problème est dans l'éditeur de cellule je suis en utilisant ... Mais je ne peux pas réparer.

+0

Montrez-nous votre code de construction de l'interface utilisateur afin que nous puissions vous aider plus avec précision. – msw

+0

J'abandonne, ce code ne fonctionne pas, désolé. –

+0

Ne fonctionne pas? ... Il suffit de double-cliquer sur le pot pour l'exécuter. – Brad

Répondre

0

Vous pouvez créer un JButton sans bordure (bordure vide) qui implémente TableCellRenderer?

+1

Je dois enlever la bordure de la cellule (bordure gauche) ... Pas la bordure du bouton! – Brad

2

MISE À JOUR lorsque vous créez un modèle de table vide, créez deux instances de ButtonCellRenderer (au lieu de 4), et définir une instance à la fois comme un éditeur et un moteur de rendu pour la colonne 2 et la seconde pour la colonne 3. Cette fixe montrer de fausses valeurs lors du déplacement de lignes, mais dessine parfois une cellule vide en survol. Et à propos du code qui ne fonctionne pas, le redémarrage de l'édition de cellule à chaque déplacement d'une souris peut entraîner des problèmes car vous basculez entre l'éditeur de cellule et le moteur de rendu à chaque déplacement de la souris. Je ne pouvais pas modifier les valeurs même si vous utilisez JTextArea (qui devrait être JTextField). La recréation d'un modèle de table à chaque fois que vous changez l'ordre des lignes est acceptable, mais il est préférable de créer une classe contenant des valeurs pour toutes les colonnes et d'utiliser le vecteur Vector de ces classes en tant que modèle de table. De cette façon, vous pouvez réorganiser les valeurs dans le vecteur et le modèle de table sera mis à jour.

Si vous souhaitez fusionner deux en-têtes, remplacez getHeaderRect(int col) de JTableHeader pour renvoyer l'union de super.getHeaderRect() pour deux colonnes. Vous pourriez également avoir besoin de surcharger la méthode paint() de BasicTableHeaderUI pour peindre l'en-tête large sur deux précédents.

C'est l'approche que j'ai utilisée pour fusionner des cellules de tableau, mais cela devrait aussi fonctionner pour les en-têtes. Désolés, je ne peux pas vous donner le code exact.

Désolé, je ne peux pas vous donner le code exact. Personnellement, je ferais avec l'écriture de rendu cellulaire personnalisé, c'est-à-dire votre première approche.

EDIT Si vous voulez utiliser le métal LaF, ce code ne peu l'astuce de ne pas peindre l'en-tête de la deuxième colonne:

final TableCellRenderer defaultRenderer = getTableHeader().getDefaultRenderer(); 
    getTableHeader().setDefaultRenderer(new DefaultTableCellRenderer() { 
     @Override 
     public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
      JLabel c = (JLabel) defaultRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
      if (column == 1) 
       c.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 0, Color.gray)); 
      else if (column == 2) { 
       c.setBorder(BorderFactory.createMatteBorder(1, 0, 1, 1, Color.gray)); 
       c.setText(null); 
      } else 
       c.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, Color.gray)); 
      return c; 
     } 
    }); 
+0

Merci pour l'effort tulskiy ... J'ai édité ma question pour mettre un échantillon de code de mes problèmes. – Brad

+0

Merci tulskiy pour votre aide ... Pouvez-vous me donner un exemple pour contourner getHeaderRect (...) pour retourner 2 colonnes? – Brad