J'ai créé mon propre cellulaire qui incluent plusieurs chaînes et une barre JProgress dans un article jlist ... mais la barre JProgresse et tout ce que l'article de jlist sera peint une fois et je cherche un moyen de repeindre les articles .. . J'ai essayé de commencer un fil, qui repeindre de manière permanente ... Mais je ne sais pas ce que je dois repeindre pour obtenir le résultat ...
Jlist Repeau ... pas de résultat Cellrenderer Repeindre ... pas de résultat JFRAME Repeindre ... pas de résultat p>
Quelqu'un peut-il comprendre mon problème et savoir un moyen de sortir? P>
Merci beaucoup! P>
mise à jour: [Mise à jour supprimée] p>
mise à jour suivante: p>
5 Réponses :
C'est facile. Le code ci-dessus peut être appelé à partir d'EDT et d'un autre fil. Mais vous devez également lire comment traiter les composants de swing et comprendre les modèles (ListModel, TableModel, etc.). Demander à un élément en Jlist de repeindre, vous devez modifier son objet dans le modèle. P> p>
Cela ne changera rien. En outre, c'est une overcilleuse pour recréer l'intégralité de ListModel avec exactement la même valeur. Vous pouvez simplement appeler myList.Repaint () code> pour avoir le même effet (ce qui ne résoudrait toujours pas le problème).
@Sergiy medvynskyy pas et répondez à ListCellrenderer, veuillez supprimer cette réponse.
Les rendreuses de cellules sont des timbres statiques / caoutchouc de composants, ils ne sont pas "réels", des composants actifs. Ils sont simplement "peints" sur la surface de la vue qui les utilise.
Cela signifie que ce n'est pas (vraiment) de les repeindre en tant que tel. Vous pouvez encourager la liste à mettre à jour en modifiant la valeur de la ligne que vous souhaitez modifier. Cela entraînera la déclenchement du modèle une mise à jour qui fera repeindre la liste. P>
import java.awt.BorderLayout; import java.awt.Component; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.DefaultListModel; import javax.swing.JFrame; import javax.swing.JList; import javax.swing.JProgressBar; import javax.swing.JScrollPane; import javax.swing.ListCellRenderer; import javax.swing.Timer; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class TestProgressListCellRenderer { public static void main(String[] args) { new TestProgressListCellRenderer(); } public TestProgressListCellRenderer() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { } final DefaultListModel<Float> model = new DefaultListModel<>(); model.addElement(0f); JList<Float> list = new JList<>(model); list.setCellRenderer(new ProgressListCellRenderer()); JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(new JScrollPane(list)); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); Timer timer = new Timer(125, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { float value = model.getElementAt(0); value += 0.01; if (value >= 1f) { value = 1f; ((Timer)e.getSource()).stop(); } model.setElementAt(value, 0); } }); timer.setRepeats(true); timer.setCoalesce(true); timer.start(); } }); } public class ProgressListCellRenderer extends JProgressBar implements ListCellRenderer<Float> { @Override public Component getListCellRendererComponent(JList<? extends Float> list, Float value, int index, boolean isSelected, boolean cellHasFocus) { setValue(Math.round(value * 100)); return this; } } }
Donc, peut-être qu'il vaut mieux travailler avec un JPanel sans jlist, ListModel et Cellrenderer et ne développer que le comportement ...
Le problème avec SeinDetermine est que le Progressbarui utilise en réalité une minuterie pour allonger l'animation. Cependant, cela ne se fait que si la barre JProgress est "affichée" qui n'est jamais le cas à cause de l'ensemble du mécanisme de rendu de la jlist. Je ne suis pas sûr que cela puisse être facilement effectué avec la jlist. Je crois que ce serait plus facile d'utiliser des composants "en direct" (mais j'attends d'être prouvé faux)
@TOBIASRAPHAELDIECKMANN Je dirais "Suggérer" Ajout du JPROGRESSBAR CODE> directement au
JLIST CODE>, mais Kleo me chasserait et faire des choses méchantes pour moi ...
C'était ma question dans le commentaire ... Donc, je suppose que j'essaie d'utiliser des composants "en direct" ... devrait être le seul moyen ... ou je baisse la barre JProgress de mon concept ...
+1 pour un problème intéressant, p> li>
mais Vous devez animer cet objet dans votre code, mais pas facile de tâche pour Nécessaire propre OUTRE propre Animation pour Je pense Solution de contournement simple à utiliser mettre ce remplacement RENDERER code> Dans Swing n'est désigné pour montrer des animations, il s'agit uniquement de peinture statique, d'illusion, d'instantané, p> li>
jProgressbar.sedindeterminate (true); code> si possible sans hacks sales, P>
jProgressbar code> p> li>
ListCellRenderer CODE>, et le résultat peut être jusqu'à présent dans le comparateur avec
jProgressbar code> placé dans
jPanel code> par exemple p> li>
ol> li>
ul>
jlist code> ne pouvait pas être approprié
jComponents code>, utiliser
jtalle code> avec une colonne et / ou sans
JTableHeader code> p> li>
jPanel code> (pondé par
gridlayout code>) avec
JPROGRESSBARS code> pour
JPROGRESSBAR.SeDindeterminate (vrai); code>, puis sortie à l'interface graphique Swing sera très similaire au
JTable code> (sans
JTableHeader code> ou
jlist code>) P>
jPanel code> à
jscrollpane code> p> li>
getpreferredsize code> pour
jscrollpane code>, alors vous simuler jlist.setvisiblerowcount correctement p> li>
Vous pourrez peut-être conduire l'animation avec votre propre absent une meilleure solution, vous pouvez utiliser un javax.swing.timer code> dans un
progressbarui code>, vu ICI ;
incrémentanimationindex () code> semble prometteur, mais je n'ai pas essayé. p>
p>
progressicon code> dans un
defaultlistCellrenderer code>; L'approche est illustrée ici dans un
jtabbedpane code>. P>
p>
Comme déjà mentionné, les rendriers ne sont pas des composants en direct, ce qui ne fait pas partie de la hiérarchie des composants. Par conséquent, des effets d'animation «naturels» (comme F.I. Le mouvement de la barre de progression indéterminée) sont perdus. Une astuce qui pourrait travailler - mais attention: c'est très dépendant de la LAF! - est de mentir au système et de signaler la barre comme étant toujours distinctive. Qui combinant avec une minuterie simulant une nouvelle valeur, chaque X ms peut afficher à nouveau l'animation:
public static class ProgressBarRenderer implements TableCellRenderer { /** The bar. */ private JProgressBar indeterminate = new JProgressBar() { // fake displayable to trigger ui animation @Override public boolean isDisplayable() { return true; }; }; /** The bar. */ private JProgressBar determinate = new JProgressBar() ; public ProgressBarRenderer() { indeterminate.setStringPainted(true); indeterminate.setIndeterminate(true); indeterminate.setString(null); } @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { int pbi = (Integer) value; if (pbi < 0) { return indeterminate; } determinate.setValue(pbi); return determinate; } } // a timer driving the animation Action update = new AbstractAction() { int count; @Override public void actionPerformed(ActionEvent e) { table.setValueAt(-1, 0, AncientSwingTeam.INTEGER_COLUMN); } }; new Timer(100, update).start();
SSCCE d'abord, répondez au second;)
Pour une meilleure aide plus tôt après un SSCCE , court, runnable, compilable, juste à propos de A.M. problème
Pour transformer 2 fichiers source en SSCCE, n'avez qu'un seul déclaré comme
public code>. Ajoutez la source de la 2e classe, à la fin de la source pour le premier.
"Est-ce que quelqu'un comprend mon problème ..." I> Je ne le fais pas. Que pensez-vous voir dans l'interface graphique? Que voyez-vous à la place?
Questions 1. Êtes-vous sûr que l'état de
jProgressbar code> est
settinDetermine (true); code>, avez-vous essayé de mettre
jProgressbar code> au
jPanel < / code> ou
jframe code> avec ces propriétés, 2.
Classe publique Mycellrenderer étend jPanel Implements ListCellrenderer { Code> Pourquoi il y a
jPanel code>,
Oui, nous comprenons votre programme, vous ne comprenez pas comment utiliser des cellulrenders
Oui, j'ai essayé d'ajouter la barre JProgress par exemple sur le jframe et le déménagement IST ... J'ai utilisé JPanel parce que c'est un très petit exemple de mon projet où j'ajoute des chaînes à l'article
@Tobiasraphaeldieckmann peut mettre en évidence ce que vous essayez de faire ??