Partage
  • Partager sur Facebook
  • Partager sur Twitter

Swing JTextArea & JScrollPane

    22 octobre 2018 à 11:51:56

    Bonjour à tous,

    Je suis actuellement entrain de développer un launcher Minecraft avec les libraries de Litarvan ( https://github.com/Litarvan ), tous ce passe très bien sauf depuis quelques temps j'ai voulu ajouter une "console de log" ( en gros afficher celle d'eclipse dans un JTextArea ).

    J'ai essayé deux méthodes celle de mettre les layouts en l'air ( null ) car j'y comprends pas grand chose pour le moment, parfait sauf que mon JScrollPane ne marche pas. ( Le launcher n'est pas redimensionnable donc pas besoin de layout )

    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.Dimension;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.Toolkit;
    import java.awt.datatransfer.Clipboard;
    import java.awt.datatransfer.StringSelection;
    import java.io.PrintStream;
    import java.time.LocalDateTime;
    import java.time.format.DateTimeFormatter;
    
    import javax.swing.Box;
    import javax.swing.BoxLayout;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    
    import fr.kedarin.thamosLauncherv2.controler.TextAreaOutputStream;
    import fr.kedarin.thamosLauncherv2.model.ConsoleFrame;
    import fr.theshark34.swinger.event.SwingerEvent;
    import fr.theshark34.swinger.event.SwingerEventListener;
    import fr.theshark34.swinger.textured.STexturedButton;
     
    @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"));
       
        // Affichage heure
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm:ss");
        LocalDateTime now = LocalDateTime.now();
       
        // Text Area
        private JTextArea txtConsole = new JTextArea();
        private JScrollPane scrolltxtPane = new JScrollPane(txtConsole, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
       
        // Copier les logs
        private STexturedButton copylogButton = new STexturedButton(getResource("copylog.png"));
        public ConsolePanel() {   
        	
        	this.setLayout(null);
        	
        	
            // Fermeture console logs
    		fermerButton.setBounds(545, 20);
    		fermerButton.addEventListener(this);
           
            // Copier les logs
            /*copylogButton.setMinimumSize(new Dimension(430, 390));
            copylogButton.setPreferredSize(new Dimension(430, 390));
            copylogButton.addEventListener(this);*/
            
            // Config JTextArea
            scrolltxtPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
            txtConsole.setBounds(0, 52, 555, 425);
            txtConsole.setEditable(false);
            txtConsole.setVisible(true);
            txtConsole.setText("Launcher développé par Kedarin pour Thamos\n" +
                    "(" + dtf.format(now) + ") "  + "Systéme d'env : " + System.getProperties().getProperty("os.name") + "\n" +
                    "(" + dtf.format(now) + ") "  + "Version OS : " + System.getProperties().getProperty("os.version") + "\n" +
                    "(" + dtf.format(now) + ") "  + "OS Arch : " + System.getProperties().getProperty("os.arch") + "\n" +
                    "(" + dtf.format(now) + ") "  + "Version JAVA : " + System.getProperties().getProperty("java.version") + "\n" +
                    "(" + dtf.format(now) + ") "  + "Java Vendor : " + System.getProperties().getProperty("java.vendor") + "\n" +
                      "");
            
            // 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(fermerButton);
            this.add(txtConsole);
            this.add(scrolltxtPane);
            
            
            
         /*  
            // JScrollPane
            scrolltxtPane.getViewport().setBackground(Color.WHITE);
            scrolltxtPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
            scrolltxtPane.setMinimumSize(new Dimension(555, 425));
            scrolltxtPane.setPreferredSize(new Dimension(555, 425));
     
            // Add au panel
            setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
            add(Box.createRigidArea(new Dimension(0,52)));
            add(scrolltxtPane);
            add(copylogButton);
            
            */
            
        }
       
        final Clipboard clipboard = this.getToolkit().getSystemClipboard();
        public void onEvent(SwingerEvent e){
            if(e.getSource() == fermerButton)
                ConsoleFrame.getInstance().dispose();
            else if(e.getSource() == copylogButton) {
                String Copy = txtConsole.getText();
                StringSelection stringSelection = new StringSelection(Copy);
                Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
                clipboard.setContents(stringSelection, null);
                System.out.println("Les logs ont ete copie dans le presse papier");
                }
            }
     
        @Override
        public void paintComponent(Graphics graphics) {
            super.paintComponent(graphics);
           
            drawFullsizedImage(graphics, this, background);
        }
    }


    Puis on m'avait aidé un peu pour utiliser les layouts, tous marche niquel sauf que je n'arrives pas à positionner des buttons ou je le souhaites ( un pour fermer l'appli tout en haut à droite  et un autre en bas à droite pour copier les logs de la console )

    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.Dimension;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.Toolkit;
    import java.awt.datatransfer.Clipboard;
    import java.awt.datatransfer.StringSelection;
    import java.io.PrintStream;
    import java.time.LocalDateTime;
    import java.time.format.DateTimeFormatter;
    
    import javax.swing.Box;
    import javax.swing.BoxLayout;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    
    import fr.kedarin.thamosLauncherv2.controler.TextAreaOutputStream;
    import fr.kedarin.thamosLauncherv2.model.ConsoleFrame;
    import fr.theshark34.swinger.event.SwingerEvent;
    import fr.theshark34.swinger.event.SwingerEventListener;
    import fr.theshark34.swinger.textured.STexturedButton;
     
    @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"));
       
        // Affichage heure
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm:ss");
        LocalDateTime now = LocalDateTime.now();
       
        // Text Area
        private JTextArea txtConsole = new JTextArea();
        private JScrollPane scrolltxtPane = new JScrollPane(txtConsole);
       
        // Copier les logs
        private STexturedButton copylogButton = new STexturedButton(getResource("copylog.png"));
        public ConsolePanel() {     
            // Fermeture console logs
    		fermerButton.setBounds(545, 20);
    		this.add(fermerButton);
    		fermerButton.addEventListener(this);
           
            // Copier les logs
            copylogButton.setMinimumSize(new Dimension(430, 390));
            copylogButton.setPreferredSize(new Dimension(430, 390));
            copylogButton.addEventListener(this);
            
            // Config JTextArea
            txtConsole.setEditable(false);
            txtConsole.setText("Launcher développé par Kedarin pour Thamos\n" +
                    "(" + dtf.format(now) + ") "  + "Systéme d'env : " + System.getProperties().getProperty("os.name") + "\n" +
                    "(" + dtf.format(now) + ") "  + "Version OS : " + System.getProperties().getProperty("os.version") + "\n" +
                    "(" + dtf.format(now) + ") "  + "OS Arch : " + System.getProperties().getProperty("os.arch") + "\n" +
                    "(" + dtf.format(now) + ") "  + "Version JAVA : " + System.getProperties().getProperty("java.version") + "\n" +
                    "(" + dtf.format(now) + ") "  + "Java Vendor : " + System.getProperties().getProperty("java.vendor") + "\n" +
                      "");
            
            // 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.setPreferredSize(new Dimension(555, 425));
     
            // Add au panel
            setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
            add(Box.createRigidArea(new Dimension(0,52)));
            add(scrolltxtPane);
            add(copylogButton);
            
        }
       
        final Clipboard clipboard = this.getToolkit().getSystemClipboard();
        public void onEvent(SwingerEvent e){
            if(e.getSource() == fermerButton)
                ConsoleFrame.getInstance().dispose();
            else if(e.getSource() == copylogButton) {
                String Copy = txtConsole.getText();
                StringSelection stringSelection = new StringSelection(Copy);
                Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
                clipboard.setContents(stringSelection, null);
                System.out.println("Les logs ont ete copie dans le presse papier");
                }
            }
     
        @Override
        public void paintComponent(Graphics graphics) {
            super.paintComponent(graphics);
           
            drawFullsizedImage(graphics, this, background);
        }
    }

    Si vous pourriez sois m'aider à faire marcher le ScrollPane en absolu ou m'éclaircir sur le placement grâce au Layout je vous en serais reconnaissant. :D

    Merci à vous,

    -
    Edité par ThamosThamos 22 octobre 2018 à 15:37:19

    • Partager sur Facebook
    • Partager sur Twitter

    Swing JTextArea & JScrollPane

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown