6
votes

CellRenderer Article Repeindre

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

Quelqu'un peut-il comprendre mon problème et savoir un moyen de sortir?

Merci beaucoup!

mise à jour: [Mise à jour supprimée]

mise à jour suivante: xxx


8 commentaires

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 . Ajoutez la source de la 2e classe, à la fin de la source pour le premier.


"Est-ce que quelqu'un comprend mon problème ..." 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 est settinDetermine (true); , avez-vous essayé de mettre jProgressbar au jPanel < / code> ou jframe avec ces propriétés, 2. Classe publique Mycellrenderer étend jPanel Implements ListCellrenderer { Pourquoi il y a jPanel ,


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 ??


5 Réponses :


0
votes

C'est facile. XXX

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.


2 commentaires

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 () 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.



3
votes

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;
        }            
    }        
}


4 commentaires

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 directement au JLIST , 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 ...



3
votes
  • +1 pour un problème intéressant,

  • mais RENDERER Dans Swing n'est désigné pour montrer des animations, il s'agit uniquement de peinture statique, d'illusion, d'instantané,

  • Vous devez animer cet objet dans votre code, mais pas facile de tâche pour jProgressbar.sedindeterminate (true); si possible sans hacks sales,

    1. Nécessaire propre jProgressbar

    2. OUTRE propre Animation pour ListCellRenderer , et le résultat peut être jusqu'à présent dans le comparateur avec jProgressbar placé dans jPanel par exemple



0 commentaires

3
votes

Vous pourrez peut-être conduire l'animation avec votre propre javax.swing.timer dans un progressbarui , vu ICI ; incrémentanimationindex () semble prometteur, mais je n'ai pas essayé.

image

absent une meilleure solution, vous pouvez utiliser un progressicon dans un defaultlistCellrenderer ; L'approche est illustrée ici dans un jtabbedpane .

image


0 commentaires

4
votes

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();


0 commentaires