IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

JScrollPane inutilisable !


Sujet :

AWT/Swing Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2018
    Messages : 5
    Par défaut JScrollPane inutilisable !
    Bonjour tous le monde,

    Je vous expliques brièvement la situation, j'ai trouvé un bout de code sur internet pour rediriger les logs vers un JTextArea jusqu'ici pas de soucis ça marche !
    Sauf qu'au moment d'ajouter un JScrollPane car les logs peuvent être longue il apparaît à l'écran mais est pas fonctionnel du tout du tout j'ai beau cherché d'ou cela pourrait venir, aucune idée..

    Ma ConsoleFrame ou je définis mon JFrame :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    package fr.kedarin.thamosLauncherv2.model;
     
    import javax.swing.JFrame;
     
    import fr.kedarin.thamosLauncherv2.view.ConsolePanel;
    import fr.theshark34.swinger.Swinger;
    import fr.theshark34.swinger.util.WindowMover;
     
    @SuppressWarnings("serial")
    public class ConsoleFrame extends JFrame{
     
    	private static ConsoleFrame instance;
    	private ConsolePanel consolePanel;
     
    	public ConsoleFrame() {
    		this.setTitle("Thamos - Console Debug");
    		this.setSize(577, 425);
    		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    		this.setLocationRelativeTo(null);
    		this.setUndecorated(true);
    		this.setIconImage(Swinger.getResource("icon.jpg"));
    		consolePanel = new ConsolePanel();
    		this.setContentPane(consolePanel = new ConsolePanel());
     
    		WindowMover mover = new WindowMover(this);
    		this.addMouseListener(mover);
    		this.addMouseMotionListener(mover);
     
    		this.setBackground(Swinger.TRANSPARENT);
    		this.getContentPane().setBackground(Swinger.TRANSPARENT);
     
    		this.setVisible(true);
    		instance = this;
    	}
     
    	public static void option() {
    	instance = new ConsoleFrame();
    	}
     
     
    	public static ConsoleFrame getInstance() {
    		return instance;
    	}
     
    	public ConsolePanel getConsolePanel() {
    		return this.consolePanel;
    	}
    }
    Ma ConsolePanel ou il y a tous ce qui est TextArea ScrollPane :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    package fr.kedarin.thamosLauncherv2.view;
     
    import static fr.theshark34.swinger.Swinger.drawFullsizedImage;
    import static fr.theshark34.swinger.Swinger.getResource;
     
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.io.PrintStream;
     
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
     
    import fr.kedarin.thamosLauncherv2.controler.TextAreaOutputStream;
     
    @SuppressWarnings("serial")
    public class ConsolePanel extends JPanel {
     
        //Background
        private Image background = getResource("backgroundconsole.png");
     
        // Text Area
        private JTextArea txtConsole = new JTextArea();
        private JScrollPane scrolltxtPane = new JScrollPane(txtConsole);
     
        public ConsolePanel() {
     
            this.setLayout(null);
     
            // Config JTextArea
            scrolltxtPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
            txtConsole.setBounds(0, 52, 555, 425);
            txtConsole.setEditable(false);
            txtConsole.setVisible(true);
     
            // Afficher les logs Launcher dans le JTextArea
            PrintStream out = new PrintStream( new TextAreaOutputStream( txtConsole ) );   
            System.setOut( out );
            System.setErr( out );
     
            // JScrollPane
            scrolltxtPane.setBounds(555, 52, 22, 375);
            scrolltxtPane.getViewport().setBackground(Color.WHITE);
     
            // Add au panel
            this.add(txtConsole);
            this.add(scrolltxtPane);
        }
     
        @Override
        public void paintComponent(Graphics graphics) {
            super.paintComponent(graphics);
     
            drawFullsizedImage(graphics, this, background);
        }
    }
    Puis le TextAreaOutputStream ou je dis de rediriger les logs dans un JTextAerea :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    package fr.kedarin.thamosLauncherv2.controler;
     
    /*
    *
    * @(#) TextAreaOutputStream.java
    *
    */
     
    import java.io.IOException;
    import java.io.OutputStream;
     
    import javax.swing.JTextArea;
     
    /**
    * An output stream that writes its output to a javax.swing.JTextArea
    * control.
    *
    * @author  Ranganath Kini
    * @see      javax.swing.JTextArea
    */
    public class TextAreaOutputStream extends OutputStream {
        private JTextArea textControl;
     
        /**
         * Creates a new instance of TextAreaOutputStream which writes
         * to the specified instance of javax.swing.JTextArea control.
         *
         * @param control   A reference to the javax.swing.JTextArea
         *                  control to which the output must be redirected
         *                  to.
         */
        public TextAreaOutputStream( JTextArea control ) {
            textControl = control;
        }
     
        /**
         * Writes the specified byte as a character to the
         * javax.swing.JTextArea.
         *
         * @param   b   The byte to be written as character to the
         *              JTextArea.
         */
        public void write( int b ) throws IOException {
            // append the data as characters to the JTextArea control
            textControl.append( String.valueOf( ( char )b ) );
        }
     
    	public JTextArea getTextControl() {
    		return textControl;
    	}  
     
    }

    Merci à vous

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Mets ton code directement dans la discussion (entre balises code (bouton # de l'éditeur)) au lieu de mettre des liens que peu de gens iront voir, d'autant plus qu'il n'y a rien à y voir.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2018
    Messages : 5
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Salut,

    Mets ton code directement dans la discussion (entre balises code (bouton # de l'éditeur)) au lieu de mettre des liens que peu de gens iront voir, d'autant plus qu'il n'y a rien à y voir.
    Salut,
    En effet je n'avais pas vu que le contenu des liens s'effacer au bout de 24 heures et le fait d'y mettre dans des liens auraient fait plus "propre" mais la balise code est très bien effectivement !
    C'est édité

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    setLaypout(null) -> Pour quelle raison? Rien dans le code présenté ne justifie de foutre en l'air la gestion des layouts, d'autant que les JScrollPane il aiment pas trop les layout null
    Tu crée bien un JScrollPane contenant txtConsole, mais en dessous tu va en retirer txtConsole pour aller le mettre directement dans ConsolePanel avec un add
    Et comme tas foutu un layout(null) qui repositionne nada, tu ne te rend pas compte que t'as au final deux composant.



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    package fr.kedarin.thamosLauncherv2.view;
     
    import static fr.theshark34.swinger.Swinger.drawFullsizedImage;
    import static fr.theshark34.swinger.Swinger.getResource;
     
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.io.PrintStream;
     
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
     
    import fr.kedarin.thamosLauncherv2.controler.TextAreaOutputStream;
     
    @SuppressWarnings("serial")
    public class ConsolePanel extends JPanel {
     
        //Background
        private Image background = getResource("backgroundconsole.png");
     
        // Text Area
        private JTextArea txtConsole = new JTextArea();
        private JScrollPane scrolltxtPane = new JScrollPane(txtConsole);
     
        public ConsolePanel() {
            // Config JTextArea
            txtConsole.setEditable(false);
     
            // Afficher les logs Launcher dans le JTextArea
            PrintStream out = new PrintStream( new TextAreaOutputStream( txtConsole ) );   
            System.setOut( out );
            System.setErr( out );
     
            // JScrollPane
            scrolltxtPane.getViewport().setBackground(Color.WHITE);
            scrolltxtPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
            scrolltxtPane.setMinimumSize(new Dimension(555, 425));
            scrolltxtPane.setPreferedSize(new Dimension(555, 425));
     
            // Add au panel
            setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
            add(Box.createRigidArea(new Dimension(0,52)));
            add(scrolltxtPane);
     
        }
     
        @Override
        public void paintComponent(Graphics graphics) {
            super.paintComponent(graphics);
     
            drawFullsizedImage(graphics, this, background);
        }
    }

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2018
    Messages : 5
    Par défaut
    Salut tchize_,
    Alors honnêtement concernant la gestion des layouts je ne sais pas pourquoi je l'ai mis en null, je suis pas sur d'avoir très bien compris tous cela, dans une autre class j'avais un problème et j'avais réussi à le résoudre en mettant le setlayout en null du coup à chaque fois que je duplique mes classe avec un Panel je le laisses, je vais me documenter pour en savoir un peu plus la dessus !

    En tous cas merci à toi ça fonctionne très bien maintenant en revanche j'ai voulu ajouter un Button "fermer" mais il n’apparaît pas à l'écran j'ai procédé de la même manière que sur mes autres panels mais je suppose que c'est lié à le gestion des layouts ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    @SuppressWarnings("serial")
    public class ConsolePanel extends JPanel implements SwingerEventListener {
     
        //Background
        private Image background = getResource("backgroundconsole.png");
     
        //Bouton Fermer
        private STexturedButton fermerButton = new STexturedButton(getResource("fermer.png"));
     
        // Text Area
        private JTextArea txtConsole = new JTextArea();
        private JScrollPane scrolltxtPane = new JScrollPane(txtConsole);
     
        public ConsolePanel() {
     
            fermerButton.setBounds(535, 9);
            fermerButton.addEventListener(this);
     
            // Config JTextArea
            txtConsole.setEditable(false);
     
            // Afficher les logs Launcher dans le JTextArea
            PrintStream out = new PrintStream( new TextAreaOutputStream( txtConsole ) );   
            System.setOut( out );
            System.setErr( out );
     
            // JScrollPane
            scrolltxtPane.getViewport().setBackground(Color.WHITE);
            scrolltxtPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
            scrolltxtPane.setMinimumSize(new Dimension(555, 425));
            scrolltxtPane.setPreferedSize(new Dimension(555, 425));
     
            // Add au panel
            setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
            add(Box.createRigidArea(new Dimension(0,52)));
            add(scrolltxtPane);
            this.add(fermerButton);
    }
    Je supposes que c'est lié à la gestion des Layouts je me renseignerais ce soir la je dois y retourner ! Merci à toi encore

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Les layout managers (de leur petit nom "layout") gèrent automatiquement la position et la taille des composants dans un conteneur (container en anglais, ce dont hérite JPanel entre autres (de la classe java.awt.Container plus exactement)), en fonction :

    • du composant lui-même (un bouton par rapport à la taille du texte en tenant compte de la police entre autres..., par exemple (et en particulier de ses dimensions préférentielles, minimum et maximum), mais aussi (attention avec BoxLayout) des paramètres d'alignement ;
    • des autres composants (leur position et leur taille) ;
    • du conteneur (de sa taille) ;
    • de règles qui sont propres au layout manager, qui sont par exemple de tenir compte ou pas de la taille préférentielle, occuper ou pas tout l'espace disponible en s'étendant ;
    • de paramètres liés au layout manager et appliqué aux composants (ou à un composant), comme par exemple justifier à droite, ou la position du composant dans une grille définie par le layout manager, comme au CENTRE d'un BorderLayout par exemple


    1. Il est donc inutile de chercher à imposer une position ou une taille (ne pas appeler setLocation(), setBounds() etc...), sauf dans le cas très spécifique d'un layout manager qui ne gère pas ça automatiquement (genre AbsoluteLayout par exemple), parce que le layout manager repassera de toute façon derrière toi pour appliquer ses calculs en appelant ces méthodes
    2. Si certains layout manager peuvent gérer un nombre "infini" de composant, certains imposent un nombre de composants (le BorderLayout par exemple, qui en impose 5. Comme un JPanel peut contenir autant de composant qu'on veut, on peut se retrouver avec plus de composants que le layout manager ne sait en gérer et ça donne un résultat imprévisible (soit on ne voit pas les composants "en trop", soit on voit n'importe quoi (le principe c'est de respecter les règles). En particulier, ces layout managers gèrent le placement par un paramètre de la méthode add() du conteneur (en gros JPanel.add( composant, paramètre de layout ), avec JPanel.add(composant) qui utilise une valeur par défaut. Appeler plusieurs fois add() avec des composants différents risque donc pour résultat d'avoir qu'un seul composant affiché.
    3. Il ne faut surtout jamais redéfinir les méthodes de Swing servant au positionnement et au dimensionnement (sinon on fout le dawa en empêchant les layout managers d'avoir le contrôle sur les composants)
    4. Afin d'avoir une IHM qui s'adapte aux préférences de l'utilisateur (aussi bien logicielle (comme la taille et les styles des polices,) que physique (la taille de son écran), en tenant compte des cas spéciaux (comme les écrans adaptés pour non voyant, les terminaux particuliers, ou que sais-je encore)), on évite de mettre le layout à null (on peut, mais ça veut dire qu'il faut tout gérer soi-même dans tous les cas possibles, donc au moins qu'on maîtrise parfaitement l'ensemble de ce qui constitue un environnement graphique et ce pour l'ensemble des OS existant), et autant partir du principe que ce n'est pas le cas (on a tôt fait d'oublier de gérer un truc particulier de la dernière version de "Nain de jardin 36.28.b patché pour wawaille 42bis". Et d'autres problèmes...mais j'arrête là.


    Pour le principe général, outre le fait d'étudier chaque Layout Manager proposé par le JDK, d'en utiliser d'autres fournis dans des bibliothèques externes, ou de s'en faire soi-même, on assemble souvent plusieurs JPanel avec des layout managers différents pour obtenir des résultats complexes qu'on ne peut pas obtenir avec un Layout Manager de base.


    Le souci avec ton code est que tu utilises STexturedButton, un code (récupéré d'un repo git) fait par quelqu'un qui visiblement ignore les règles de base en définissant une méthode setBounds, pour donner une position au bouton, méthode qui n'a pas d'effet sur la taille préférentielle, minimal et maximale du composant, mais ne fait que forcer sa taille en appelant setBounds(x,y,width,height), ce qui, comme je le disais précédemment ne doit jamais être fait lorsqu'on utilise des layouts manager. A noter qu'en plus sa méthode est trompeuse, parce que ses paramètres sont une position (un x et un y) et non des dimensions (une largeur et une hauteur), piège dans lequel à priori tu es tombé, forcément. Autre problème, cette méthode ne peut être appelé que lorsque le bouton a été mis dans un conteneur (sinon NullPointerException).

    Si tu intègres le source de ce composant, n'appelle jamais cette méthode setBounds et au lieu d'appeler fermerButton.setBounds(535, 9);,
    appelle (this représente le jpanel) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            setPreferredSize(image.getWidth(this), image.getHeight(this));
            setMiniumSize(image.getWidth(this), image.getHeight(this));
            setMaximumSize(image.getWidth(this), image.getHeight(this));
    Par ailleurs, question : pourquoi utilises-tu cette classe ?
    Elle donne l'impression de permettre d'afficher des textures au fond d'un bouton, alors qu'elle n'affiche qu'une image en fond, ce qu'on peut faire nativement (et facilement) en Swing :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    JFrame frame = new JFrame();
     
    		JButton button = new JButton("Mon bouton",new ImageIcon("suricate.carre.png"));
    		button.setVerticalTextPosition(SwingConstants.CENTER);
    		button.setHorizontalTextPosition(SwingConstants.CENTER);
    		button.setForeground(Color.WHITE); 
     
    		JPanel panel = new JPanel(new GridBagLayout()); // gridbaglayout juste pour centrer
    		panel.add(button);
     
    		frame.add(panel);
     
    		frame.pack();
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
    qui affiche :
    Nom : Capture.PNG
Affichages : 169
Taille : 30,4 Ko

    Et si c'est pour avoir une image en hover, une image disabled, ou réduire les marges, etc, regarde dans la javadoc de JButton, tu trouveras tout ce qu'il faut pour (setContentAreaFilled(), setIcon(), setRolloverIcon(), setPressedIcon(), setDisabledIcon(), etc)
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2018
    Messages : 5
    Par défaut
    Salut joel.drigo,

    Merci pour les précisions sur les Layouts je comprends un peu mieux mais il faudra que je pratiques à l'avenir pour bien assimiler tous ça, du coup si j'ai bien compris pour ajouter un élément je dois faire comme tchize_ la fait avec le JScrollPane avec des setPreferredSize etc etc

    Sinon cette classe me sers à afficher les logs du reste du programme ( launcher Minecraft )





    Petite question HS d'ailleurs, pour afficher les news j'affiches une page web et pour l'état du serveur & nbr connecté j'affiches la première ligne d'une page web qui elle effectue une requête php pour récupérer les informations.
    Cela peut-être plus optimisé ou c'est la seul solution, car j'ai bidouillé du code trouvé sur le net et un peu de mes connaissances pour l'adapter mais je trouves cela assez lourd et ralentit légérement le launcher ( 2,1 secondes à l'ouverture avec une bonne connexion )


    Voilà Voilà merci à vous encore,

  8. #8
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Disiz2K Voir le message
    Merci pour les précisions sur les Layouts je comprends un peu mieux mais il faudra que je pratiques à l'avenir pour bien assimiler tous ça, du coup si j'ai bien compris pour ajouter un élément je dois faire comme tchize_ la fait avec le JScrollPane avec des setPreferredSize etc etc
    Bah pas forcément, ça dépend des composants et des layout managers. En l'occurence, un composant devrait être correctement programmé pour que sa taille préférentielle soit correcte par défaut (ce qui est le cas avec le JButton de Swing) : cela n'empêche pas de pouvoir la changer pour une raison quelconque, mais pas dans le cas standard.

    Citation Envoyé par Disiz2K Voir le message
    Sinon cette classe me sers à afficher les logs du reste du programme ( launcher Minecraft )
    Je parlais de STexturedButton, pas de la partie "console en textarea". Je ne vois même pas de bouton avec une image dans le fond dans ta capture d'écran... tous les boutons de ton UI sont plats (unicolor), du coup je me demande bien pourquoi tu as besoin de ça.

    Citation Envoyé par Disiz2K Voir le message
    Petite question HS d'ailleurs, pour afficher les news j'affiches une page web et pour l'état du serveur & nbr connecté j'affiches la première ligne d'une page web qui elle effectue une requête php pour récupérer les informations.
    Cela peut-être plus optimisé ou c'est la seul solution, car j'ai bidouillé du code trouvé sur le net et un peu de mes connaissances pour l'adapter mais je trouves cela assez lourd et ralentit légérement le launcher ( 2,1 secondes à l'ouverture avec une bonne connexion )
    Mmm... faudrait voir ton code et le contexte. 2,1 secondes, ça parait long en effet, mais tout dépend comment ça se découpe (si c'est 200ms pour le rendu et l'extraction et 1900ms c'est du réseau/Serveur, tu vas pouvoir faire grand chose de mieux ; en revanche s'il faut 200ms pour récupérer une page en local et 1900 pour récupérer une balise html et l'afficher dans un JLabel, y'a probablement moyen de faire mieux). Il y a plusieurs options :
    1. La solution d'extraire une partie d'une page web et de l'afficher en texte (ce que tu sembles faire). Avec jsoup, cela se fait assez facilement si la page est static. Utiliser HtmlUnit si la page est dynamique. Si possible utiliser une solution en streaming si la page est lourde, surtout si tu as besoin d'un texte qui se trouve plutôt au début de la page. Se méfier des solutions "à la mano", parcourt de chaîne, test sur les caractères, etc : si on peut (vaguement) gagner du temps de parsing, on peut arriver à de sacrées usines à gaz, tout ça pour gagner finalement pas beaucoup sur le temps global.
    2. Il y a bien la solution d'inclure un browser web dans l'application Java Desktop, mais ça peut être lourd juste pour afficher du blahblah (c'est intéressant en cas d'interaction entre l'application et la page web (dans un sens comme dans l'autre), ou si on veut une UI très intégrée, ou si tu veux simplement ne pas que l'utilisateur accède directement à la page dans son navigateur)
    3. Pour du log, de la doc, ou du blahblah, ouvrir l'URL dans le navigateur web du système est bien souvent la meilleure solution : elle est non seulement simple, mais surtout la page s'affiche dans le navigateur de l'utilisateur, son préféré donc à priori, avec sa collec de bookmark et tout... si ça ne te dérange pas que l'utilisateur accède directement à cette page, ne t'embête pas à prendre la main.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2018
    Messages : 5
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Bah pas forcément, ça dépend des composants et des layout managers. En l'occurence, un composant devrait être correctement programmé pour que sa taille préférentielle soit correcte par défaut (ce qui est le cas avec le JButton de Swing) : cela n'empêche pas de pouvoir la changer pour une raison quelconque, mais pas dans le cas standard.


    Je parlais de STexturedButton, pas de la partie "console en textarea". Je ne vois même pas de bouton avec une image dans le fond dans ta capture d'écran... tous les boutons de ton UI sont plats (unicolor), du coup je me demande bien pourquoi tu as besoin de ça.


    Mmm... faudrait voir ton code et le contexte. 2,1 secondes, ça parait long en effet, mais tout dépend comment ça se découpe (si c'est 200ms pour le rendu et l'extraction et 1900ms c'est du réseau/Serveur, tu vas pouvoir faire grand chose de mieux ; en revanche s'il faut 200ms pour récupérer une page en local et 1900 pour récupérer une balise html et l'afficher dans un JLabel, y'a probablement moyen de faire mieux). Il y a plusieurs options :
    1. La solution d'extraire une partie d'une page web et de l'afficher en texte (ce que tu sembles faire). Avec jsoup, cela se fait assez facilement si la page est static. Utiliser HtmlUnit si la page est dynamique. Si possible utiliser une solution en streaming si la page est lourde, surtout si tu as besoin d'un texte qui se trouve plutôt au début de la page. Se méfier des solutions "à la mano", parcourt de chaîne, test sur les caractères, etc : si on peut (vaguement) gagner du temps de parsing, on peut arriver à de sacrées usines à gaz, tout ça pour gagner finalement pas beaucoup sur le temps global.
    2. Il y a bien la solution d'inclure un browser web dans l'application Java Desktop, mais ça peut être lourd juste pour afficher du blahblah (c'est intéressant en cas d'interaction entre l'application et la page web (dans un sens comme dans l'autre), ou si on veut une UI très intégrée, ou si tu veux simplement ne pas que l'utilisateur accède directement à la page dans son navigateur)
    3. Pour du log, de la doc, ou du blahblah, ouvrir l'URL dans le navigateur web du système est bien souvent la meilleure solution : elle est non seulement simple, mais surtout la page s'affiche dans le navigateur de l'utilisateur, son préféré donc à priori, avec sa collec de bookmark et tout... si ça ne te dérange pas que l'utilisateur accède directement à cette page, ne t'embête pas à prendre la main.
    Salut,
    Je réponds tardivement j'avais arrêté le développement de ce launcher temporairement,
    Alors d'ailleurs j'ai demandé à la personne à qui j'utilises les libs pourquoi il défini les layouts à null il m'a répondu : "Parce que les launchers ne sont pas redimensionnables et layout null permet de faire du positionnage absolu".
    Pour ce qui est des STexturedButton, ils sont pas encore mis car je n'arrives pas à les positionner enfaîte, dans prefferredSize & MinimumSize je met la taille du bouton en pixel, met du coup ils apparaissent tout en haut en très gros tandis que leur taille en pixel est faible. Après mettre renseigné j'ai cru comprendre que les layouts ne permettait pas de positionner un élément à un endroit précis ?

    Oui la page html est statique c'est juste du html avec deux trois balises que je changes quand je veux modifier le texte de la news.
    Pour ce qui est des solutions parcours de texte, test sur les caractères , c'est uniquement car ceux des scripts en PHP qui mette l'état du serveur avec un ping qui affiche sur une page statique "En ligne" ou "Hors ligne" & l'autre qui affiche le nombre de connecté 0 à X je penses pas que ce ne sois très gourmand, à pars si je me trompes ? ^^

    Merci à toi,

Discussions similaires

  1. [JFrame][JScrollPane] rafraichissement
    Par iuz dans le forum Agents de placement/Fenêtres
    Réponses: 5
    Dernier message: 14/05/2004, 11h08
  2. [JSCROLLPANE][JTABLE] Probleme de raf...
    Par thibaud dans le forum Composants
    Réponses: 5
    Dernier message: 04/05/2004, 11h26
  3. [JScrollPane]Comment savoir quand une scrollbar apparait ?
    Par FrigoAcide dans le forum Composants
    Réponses: 4
    Dernier message: 29/04/2004, 10h10
  4. Réponses: 7
    Dernier message: 24/05/2003, 15h56
  5. [JScrollPane] élargir la taille
    Par nyny_p dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 03/05/2003, 10h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo