2011-01-22 11 views

Répondre

3

Je suppose que vous voulez dire que vous voulez une case à cocher plus grand. Si c'est le cas, vous devez créer des images pour représenter les icônes non sélectionnées et sélectionnées de la case à cocher. Ensuite, vous pouvez créer un moteur de rendu et un éditeur en utilisant ces icônes. Enfin, vous devrez augmenter la hauteur de chaque ligne de la table. Le code pourrait ressembler à:

Icon normal = new ImageIcon(...); 
Icon selected = new ImageIcon(...); 
JTable table = new JTable(...); 
table.setRowHeight(...); 

TableCellRenderer renderer = table.getDefaultRenderer(Boolean.class); 
JCheckBox checkBoxRenderer = (JCheckBox)renderer; 
checkBoxRenderer.setIcon(normal); 
checkBoxRenderer.setSelectedIcon(selected); 

DefaultCellEditor editor = (DefaultCellEditor)table.getDefaultEditor(Boolean.class); 
JCheckBox checkBoxEditor = (JCheckBox)editor.getComponent(); 
checkBoxEditor.setIcon(normal); 
checkBoxEditor.setSelectedIcon(selected); 
+0

J'ai mon propre moteur de rendu pour la colonne Boolean.class .. mais quand je mets les icônes il ne sera pas affiché et quand je clique dessus, il affiche pour une courte seconde la case normale .. –

+0

Oui, lorsque vous cliquez dessus, l '"éditeur" s'affiche, c'est pourquoi vous avez besoin d'un moteur de rendu et d'un éditeur personnalisés. Si les icônes ne sont pas affichées, votre code personnalisé ne fonctionne pas.Essayez d'utiliser le moteur de rendu et l'éditeur par défaut pour comprendre le concept. Ensuite, si vous pensez toujours avoir besoin d'un moteur de rendu et d'un éditeur personnalisés, vous pouvez les modifier tous les deux. – camickr

+0

mais je dois redéfinir le defaultcelleditor? –

3

NOTE IMPORTANTE: Ce ne serait testé que la valeur par défaut look 'Metal' et se sentir. Je ne garantis pas que cela fonctionnera pour n'importe quel autre aspect. Aussi, je ne suis pas tout à fait sûr de savoir comment cela fonctionne, car il est certes un peu un hack.

j'ai pu résoudre cela d'une manière légèrement différente. Je voulais utiliser les images existantes et juste appliquer une échelle à celle-ci. Je redimensionne déjà la police de mon application en utilisant les valeurs par défaut de l'interface utilisateur et j'ai donc une police plutôt grande. Je me demandais si je pouvais tirer parti de cela et mettre à l'échelle les cases à cocher en conséquence.

Après avoir écumé l'Internet et d'essayer un tas de choses que je suis venu avec cette méthode:

public static void scaleCheckBoxIcon(JCheckBox checkbox){ 
    boolean previousState = checkbox.isSelected(); 
    checkbox.setSelected(false); 
    FontMetrics boxFontMetrics = checkbox.getFontMetrics(checkbox.getFont()); 
    Icon boxIcon = UIManager.getIcon("CheckBox.icon"); 
    BufferedImage boxImage = new BufferedImage(
     boxIcon.getIconWidth(), boxIcon.getIconHeight(), BufferedImage.TYPE_INT_ARGB 
    ); 
    Graphics graphics = boxImage.createGraphics(); 
    try{ 
     boxIcon.paintIcon(checkbox, graphics, 0, 0); 
    }finally{ 
     graphics.dispose(); 
    } 
    ImageIcon newBoxImage = new ImageIcon(boxImage); 
    Image finalBoxImage = newBoxImage.getImage().getScaledInstance(
     boxFontMetrics.getHeight(), boxFontMetrics.getHeight(), Image.SCALE_SMOOTH 
    ); 
    checkbox.setIcon(new ImageIcon(finalBoxImage)); 

    checkbox.setSelected(true); 
    Icon checkedBoxIcon = UIManager.getIcon("CheckBox.icon"); 
    BufferedImage checkedBoxImage = new BufferedImage(
     checkedBoxIcon.getIconWidth(), checkedBoxIcon.getIconHeight(), BufferedImage.TYPE_INT_ARGB 
    ); 
    Graphics checkedGraphics = checkedBoxImage.createGraphics(); 
    try{ 
     checkedBoxIcon.paintIcon(checkbox, checkedGraphics, 0, 0); 
    }finally{ 
     checkedGraphics.dispose(); 
    } 
    ImageIcon newCheckedBoxImage = new ImageIcon(checkedBoxImage); 
    Image finalCheckedBoxImage = newCheckedBoxImage.getImage().getScaledInstance(
     boxFontMetrics.getHeight(), boxFontMetrics.getHeight(), Image.SCALE_SMOOTH 
    ); 
    checkbox.setSelectedIcon(new ImageIcon(finalCheckedBoxImage)); 
    checkbox.setSelected(false); 
    checkbox.setSelected(previousState); 
} 

Ce qu'il fait est d'obtenir la taille de la police à partir des mesures de police de la case à cocher. Puis en utilisant cela, il dérive une nouvelle icône basée sur l'icône trouvée dans le 'Look and Feel'.

Une chose étrange que je ne suis pas capable d'expliquer est comment l'icône de la case à cocher dans son état «non sélectionné» ou par défaut, change à l'icône «sélectionné», lorsque j'accède à la même propriété pour obtenir chaque un.

Je commence par enregistrer l'état du contrôle afin que je puisse le restaurer à la fin. Ceci est fait parce que pour que les icônes soient correctement définies, l'état doit être décoché quand vous demandez d'abord l'icône à UIManager et ensuite il doit être vérifié quand vous demandez l'icône la deuxième fois pour obtenir le 'sélectionné 'icône. Je ne suis pas tout à fait sûr du fonctionnement d'UIManager ni de la raison pour laquelle l'icône de case à cocher change lorsque nous appelons la même propriété en définissant la valeur 'selected' d'une seule case, mais c'est ce qui est nécessaire pour obtenir icônes nécessaires. Si vous ne voulez pas baser la taille sur la police, vous pouvez facilement passer la hauteur et la largeur comme paramètres et les utiliser à la place de la hauteur de la police lors de la définition de la taille de l'image mise en mémoire tampon.

I might mention that this same methodology works with radiobuttons

+0

Excellent travail, merci! J'utilise l'aspect et la convivialité de Windows et cela fonctionne pour moi jusqu'à présent. Le seul inconvénient est que vous n'obtenez pas les effets "mouseover" que vous obtenez avec les cases normales de Windows 7. Normalement, lorsque vous pointez sur une case à cocher, elle devient bleue. Mais vous perdez cet effet lorsque cette méthode de mise à l'échelle est utilisée. – Michael