2016-07-16 5 views
0

Un Custom Cell Renderer peut-il définir les propriétés d'un objet comme un formulaire?Un Custom Cell Renderer peut-il définir les propriétés d'un objet comme un formulaire?

Je cherchais un moyen de définir les éléments d'un JList pour refléter l'état actuel d'un objet plutôt que d'utiliser simplement une chaîne d'informations. c'est-à-dire au lieu d'utiliser du texte, dites un bouton radio, des zones de texte et des étiquettes. D'une manière pré-formatée comme un modèle.

Les éléments que j'ai besoin d'afficher dans une liste sont les intervalles de temps pour les décalages, chacun représentant une heure de début et de fin et diverses propriétés booléennes. Ce serait mieux si je pouvais utiliser des composants pour montrer l'état de chaque objet afin que quelqu'un puisse le sélectionner. Lorsque son sélectionné l'édition serait fait sous la liste, pas dans la liste. Juste pour l'affichage.

Quelque chose comme ceci:

http://i.stack.imgur.com/3MoeQ.png

+1

Oui les moteurs de rendu/éditeurs de cellules peuvent utiliser n'importe quelle visualisation que vous voulez utiliser, pas seulement du texte. avez-vous une question spécifique? – MeBigFatGuy

Répondre

2

Si tout ce que vous voulez est de render les composants Swing à l'intérieur des cellules JTable, alors pas de problème: il suffit de retourner les instances JPanel pertinentes de la CellRenderer . Cependant, vous risquez de rencontrer des problèmes si vous souhaitez que le contenu soit entièrement accessible. JPanel s.

La question, essentiellement, est la suivante: JList (et JTable, pour référence) utilisez le panneau retourné de la CellRenderer ne pour rendre l'élément. Une fois le rendu terminé, l'instance est supprimée. Cela signifie que vous ne pouvez pas modifier de manière externe l'état de l'un des composants que vous renvoyez d'un rendu de cellule et attendez qu'il se mette à jour dans la table. Cependant, vous pouvez vous en sortir dans certaines circonstances, car une fois que l'utilisateur clique sur une cellule, la liste passe en mode d'édition et à ce moment la cellule éditée par l'utilisateur contient réellement des instances réelles de composants swing, pas seulement les rend.

J'ai trouvé généralement mieux - et même plus simple - d'utiliser un gestionnaire de disposition personnalisé pour des tâches comme celle-ci. Un exemple:

static class ListLayout implements LayoutManager { 
    private final int myItemHeight; 

    public ListLayout(int itemHeight) { 
     myItemHeight = itemHeight; 
    } 

    @Override 
    public void addLayoutComponent(String name, Component comp) { 
    } 

    @Override 
    public void removeLayoutComponent(Component comp) { 
    } 

    public Dimension preferredLayoutSize(Container parent) { 
     int h = 0; 
     int w = 0; 
     for (Component c : parent.getComponents()) { 
      h += c.getPreferredSize().height; 
      w = Math.max(w, c.getPreferredSize().width); 
     } 
     return new Dimension(w, h); 
    } 

    public Dimension minimumLayoutSize(Container parent) { 
     int w = 0; 
     for (Component c : parent.getComponents()) { 
      w = Math.max(w, c.getMinimumSize().width); 
     } 
     return new Dimension(w, 0); 
    } 

    public void layoutContainer(Container parent) { 
     int y = 0; 
     // Note: should really deal with parent's border insets here as well 
     // Additionally, can add fields like padding, margin, etc. to make this 
     // class more generally useful 
     for (Component c : parent.getComponents()) { 
      c.setBounds(0, y, parent.getWidth(), myItemHeight); 
      y += myItemHeight; 
     } 
    } 
} 

Et le code d'appel:

JFrame frame = new JFrame(); 
    JPanel content = new JPanel(); 
    content.setLayout(new ListLayout(25)); 
    JScrollPane scroll = new JScrollPane(content); 

    for (int i = 0; i < 20; ++i) { 
     content.add(new JButton(Integer.toString(i))); 
    } 

    frame.setContentPane(scroll); 
    frame.pack(); 
    frame.setVisible(true); 

Bien sûr, ce faisant de cette façon vous faire perdre des fonctionnalités supplémentaires de JList, comme la sélection hilighting, etc. donc tout dépend de ce que vous vouloir faire. Ce qui précède, cependant, vous donnera des composants entièrement interactifs dans une mise en page semblable à une liste.