Avatar billede encory Nybegynder
15. september 2002 - 23:44 Der er 28 kommentarer og
1 løsning

Indsætte Images eller Icons i et JTextarea eller JTextPane

Hejsa !!

Jeg ville gerne vide hvordan man kan indsætte et lille billede i et JTextarea eller et JTextPane. Det skal bruge lidt i samme stil som msn Messengers Emoticons. Alt jeg mangler er bare at kunne indsætte en eller anden form for grafik (ikon) sammen med teksten.. Hvordan gør man dette.. og kan det i det hele taget lade sig gøre ???
Avatar billede bearhugx Nybegynder
15. september 2002 - 23:55 #1
Du kan ikke i et JTextArea, men du kan i JTextPane...

Jeg skaber lige noget kode sammen
Avatar billede bearhugx Nybegynder
15. september 2002 - 23:57 #2
i mellemtiden prøv :
JTextPane.insertIcon( new ImageIcon("gfx.gif") );
Avatar billede bearhugx Nybegynder
16. september 2002 - 00:07 #3
lad os antage, at dit JTextPane hedder "jtp"...

Så indsætter du grafikken i "grafik.gif" ved cursorens position (eller udskifter en markering) med følgende kode
  jtp.insertIcon( new ImageIcon("grafik.gif") );


I det følgende indsætter jeg f.eks. EkspertenLogo.png ved cursorens position i dokumentet

import java.awt.*;
import javax.swing.*;

class GFXInTextPaneTest extends JFrame {

    public GFXInTextPaneTest() {
        this.setSize(400,400);
        this.setLocation(100,100);
        this.setTitle( this.getClass().getName() );
        this.getContentPane().setLayout( new BorderLayout() );
        JTextPane jtp = new JTextPane();
        this.getContentPane().add( jtp, BorderLayout.CENTER);

        jtp.insertIcon( new ImageIcon("EkspertenLogo.png"));

        this.setVisible(true);
    }

    public static void main(String args[]) {
        new GFXInTextPaneTest();
    }
}

/Søren Munk Skrøder
Avatar billede encory Nybegynder
16. september 2002 - 00:21 #4
JA det virker... :o)
men man kan ikke sætte flere ikoner ind efter hinanden eller blande dem med teksten hvis man tilføjer nye linier til JTextPane....

Fx. Burde
    Hejsa :o)
    jeg er ked :o( 

se således ud... 
    Hejsa [ikon happy face]
    jeg er ked [ikon surface]
Avatar billede encory Nybegynder
16. september 2002 - 00:24 #5
eller 
Hejsa :o) min ven... er du :o( ??

Hejsa [ikon happyface] min ven... er du [ikon surface] ??

som sagt er stortset alt andet på plads... mangler bare at kunne tilføje de ikoner til JTextPane uanset antal og placering....
Avatar billede bearhugx Nybegynder
16. september 2002 - 00:28 #6
kigger lige på det ... har du evt noget kode, hvor du putter tekst ind i JTextPane'et ???
Avatar billede encory Nybegynder
16. september 2002 - 00:30 #7
jeps jeg kan maile det til dig... det er langt fra færdigt, men det er også kun på det spæde udviklingsstadie...
du kan få et uddrag....
Avatar billede bearhugx Nybegynder
16. september 2002 - 00:31 #8
ok. send til soeren@skroeder.dk
Avatar billede encory Nybegynder
16. september 2002 - 00:47 #9
Mail away....
Avatar billede bearhugx Nybegynder
16. september 2002 - 00:49 #10
Hmmm ... havde JTextPane bare haft en append()-metode, så ville det det hele være meget nemmere :-/

Jeg kan pt. indsætte noget tekst - og derefter noget grafik - men hvis jeg så forsøger at indsætte noget mere tekst, så overskriver jeg det foregående...

Hvis jeg så laver en makeshift append()-metode
  setText( getText()+newText );

så kommer ikonerne (billederne) ikke med !

Derfor - så har jeg en følelse af, at du bliver nød til at kigge lidt mere på Document, hvis du skal bruge JTextPane --
Måske vil det være nemmere at arbejde med tekst-grafik-kombinationen i et Dokument istedet...

/Søren Munk Skrøder
Avatar billede bearhugx Nybegynder
16. september 2002 - 00:51 #11
Den kode jeg arbejder med pt. er :
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;

class GFXInTextPaneTest extends JFrame {

    public GFXInTextPaneTest() {       
        // VIRKER IKKE- af en eller anden grund :-(
        this.addWindowListener( new WindowAdapter() {
            public void windowClosed(WindowEvent e) {
                System.out.println("closing...");
                System.exit(0);
            }
        });
       
        this.setSize(400,400);
        this.setLocation(100,100);
        this.setTitle( this.getClass().getName() );
        this.getContentPane().setLayout( new BorderLayout() );
        JTextPane jtp = new JTextPane();
        this.getContentPane().add( jtp, BorderLayout.CENTER);
       
       
        jtp.setText("bla bla bla BEFORE");
        jtp.setCaretPosition( jtp.getText().length() );
        jtp.insertIcon( new ImageIcon("EkspertenLogo.png"));
        jtp.setCaretPosition( jtp.getText().length() );
        //Her overskrives grafikken - så kun teksten bliver tilbage
        // Hvis den udkommenteres, så kan ses tekst[GFX]
        jtp.setText(jtp.getText()+"bla bla bla AFTER");
        this.setVisible(true);

       
    }

    public static void main(String args[]) {
        new GFXInTextPaneTest();
    }
}
Avatar billede encory Nybegynder
16. september 2002 - 00:52 #12
try {
        // Get the text pane's document
        JTextPane textPane = new JTextPane();
        StyledDocument doc = (StyledDocument)textPane.getDocument();
   
        // The image must first be wrapped in a style
        Style style = doc.addStyle("StyleName", null);
        StyleConstants.setIcon(style, new ImageIcon("imagefile"));
   
        // Insert the image at the end of the text
        doc.insertString(doc.getLength(), "ignored text", style);
    } catch (BadLocationException e) {
    }


Fandt sådan en sag på nettet og testede den men den gjorde ikke det vilde for mig
Avatar billede encory Nybegynder
16. september 2002 - 00:52 #13
Den tager heller ikke billedet med...
Avatar billede encory Nybegynder
16. september 2002 - 00:53 #14
Avatar billede bearhugx Nybegynder
16. september 2002 - 01:08 #15
Følgende virker !!

        try{
            StyledDocument doc = (StyledDocument)jtp.getDocument();
            Style icoEkspertenStyle = doc.addStyle("icoEkspertenStyle", null);
            StyleConstants.setIcon( icoEkspertenStyle, new ImageIcon("EkspertenLogo.png") );
           
            doc.insertString(doc.getLength(), "BEFORE ", null);
           
            // Dette virker - men kun hvis der står noget i string-parameteren
            //Dvs. følgende virker :
            //  doc.insertString(doc.getLength(), ":-)", icoEkspertenStyle);
            //men ikke
            //  doc.insertString(doc.getLength(), "", icoEkspertenStyle);
           
            doc.insertString(doc.getLength(), ":-)", icoEkspertenStyle);

            doc.insertString(doc.getLength(), " AFTER ", null);
        } catch (BadLocationException blEx) {
        }
/Søren Munk Skrøder
Avatar billede bearhugx Nybegynder
16. september 2002 - 01:12 #16
Men hvis jeg copy-paster ovenstående, så får jeg følgende :

BEFORE :-) AFTER

dvs. den tekst, som står i String-parameteren, er den, som vil blive kopieret under en copy-paste...

/Søren
Avatar billede bearhugx Nybegynder
16. september 2002 - 01:14 #17
har FYI ikke modtaget din mail endnu...
Avatar billede encory Nybegynder
16. september 2002 - 01:27 #18
import java.util.StringTokenizer;
import javax.swing.*;
import java.awt.event.*;
import java.net.InetAddress;
import java.net.UnknownHostException;


class SmileyHandler {
    public static final boolean debug = true; //CLASS REF FOR DEBUG PATTERN

    private static ImageIcon[] smileys = new ImageIcon[2];

    public static ImageIcon getSmileys(String text) {
        smileys[0] = new ImageIcon("images/send.jpg");
        smileys[1] = new ImageIcon("images/conn.jpg");
        ImageIcon result = null;
        StringTokenizer strT = new StringTokenizer(text);

        while(strT.hasMoreTokens( )) {
            String testStr = strT.nextToken( );
            if(testStr.equals(":o)")) {
                result = smileys[0];
            }
            else if(testStr.equals(":o(")) {
                result = smileys[1];
            }
        }
        return result;
    }
}


//--------- CLASS GUI HOLDS MAIN( )-METHOD-----------------------------------------------------------

class Gui {
    private JFrame win = new JFrame("TestFrame");
    private String hostName = null;
    JPanel mainPane;

    JButton button;
    JLabel imageLabel;

    JTextPane outputText;
    JTextField inputText;

    Gui( ) {
        try{
            hostName = (InetAddress.getLocalHost( )).getHostName( );
        }
        catch(UnknownHostException uhex){ }

        win.setBounds(400,170,400,600);
        win.getContentPane( ).setLayout(null);

        button = new JButton("Insert");
        button.setBounds(200,470,80,20);
        button.addActionListener(new ButtonController( ));

        inputText = new JTextField( );
        inputText.setBounds(2,470,198,20);

        outputText = new JTextPane( );
        outputText.setBounds(2,2,394,400);

        imageLabel = new JLabel( );
        imageLabel.setBounds(350,400,50,50);

        mainPane = new JPanel( );
        mainPane.setBounds(0,0,400,600);
        mainPane.setLayout(null);
        mainPane.add(outputText);
        mainPane.add(inputText);
        mainPane.add(button);
        mainPane.add(imageLabel);

        win.getContentPane( ).add(mainPane );
        win.setVisible(true);
    }


//------------INNER CLASS GUI$BUTTONCONTROLLER--------------------------------------------------------------


    class ButtonController implements ActionListener {
        public void actionPerformed(ActionEvent event) {
            imageLabel.setIcon(SmileyHandler.getSmileys(inputText.getText( ))); //TEST
            outputText.setText(outputText.getText( ) + hostName + " Says: " + inputText.getText( ) + "\n");
            outputText.insertIcon(SmileyHandler.getSmileys(inputText.getText( )));
            inputText.setText(""); //RESET INPUT

            if (SmileyHandler.debug) {
                System.out.println(SmileyHandler.getSmileys(inputText.getText( )));
            }
        }
    }

//-----------------------------------------------------------------------------------------------------------

    public static void main(String[] args) {
        new Gui( );
    }
}
Avatar billede encory Nybegynder
16. september 2002 - 01:28 #19
Så får du koden på denne måde
Avatar billede encory Nybegynder
16. september 2002 - 01:36 #20
http://www.jalice.net/exmystyle2.htm..
En anden side med noget kode der kan det jeg efterlyser.... kan bare ikke helt gennemskue hvor meget af den jeg skal bruge.... men jeg har testet koden. og det var muligt at sætte flere billeder / ikoner ind i panelet...
Avatar billede bearhugx Nybegynder
16. september 2002 - 01:36 #21
Kunne du bruge min kode @ 16/09-2002 01:08:30 ???
Avatar billede encory Nybegynder
16. september 2002 - 01:39 #22
AddIconAction

    /**
    * An action that adds a JLabel instance to
    * the target text pane when invoked.
    **/
    class AddLabelAction extends TextAction {
       
        /**
        * The label for the JLabel instances
        * added to the text pane.
        **/
        private String labelText;

        /**
        * AddLabelAction, constructor.
        * <p>
        * @param labelText The text for the label added to the text pane
        **/
        public AddLabelAction( String labelText ) {
            super( "AddLabel" );
            putValue( Action.SHORT_DESCRIPTION,
                  "Insert a label into the target" );
            this.labelText = labelText;
        }

        /**
          * Perform the action. If a textpane component can
          * be obtained from the event, add the label. If not,
          * beep.
          * <p>
          * @param event The event causing us to be called.
          **/
        public void actionPerformed( ActionEvent event ) {
            JTextComponent target = getTextComponent( event );
            if( target instanceof JTextPane && labelText != null ) {
                JLabel label = new JLabel( labelText );
                label.setOpaque( true );
                ( ( JTextPane )target ).insertComponent( label );
            }  else {
                Toolkit.getDefaultToolkit().beep();
            }
        }

    }  // AddLabelAction
Avatar billede encory Nybegynder
16. september 2002 - 01:40 #23
Nej synes ikke rigtigt at den virker som den skal har prøvet at indsætte den i min kode....
Avatar billede encory Nybegynder
16. september 2002 - 01:45 #24
Kan ikke komme i gennem til din mailbox... har lige fået to mailerdaemons... Well ligegyldigt. du har fået kildekoden....
Avatar billede bearhugx Nybegynder
16. september 2002 - 01:50 #25
er på vej i seng - hjælper videre senere
Avatar billede bearhugx Nybegynder
16. september 2002 - 02:49 #26
Hmm ... jeg har problemer med at se, hvad du er igang med... ment på den måde, at jeg ingen steder i den sendte kode, kan se, hvor du f.eks. forsøger at indsætte en Style i et Document...

og hvad bruger du AddLabelAction-koden til i dit indlæg @ 16/09-2002 01:39:00



class ButtonController implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        try{
            StyledDocument doc = (StyledDocument)outputText.getDocument();
            Style smiley = doc.addStyle("smiley", null);
           
            // getSmileys er omdøbt til getSmiley, da den kun kan returnere én smiley
            StyleConstants.setIcon( smiley, SmileyHandler.getSmiley(inputText.getText()) ); 
           
            // Indsæt tekst
            String output = hostname + " says : " + inputText.getText() + "\n";
            doc.insertString( doc.getLength(), output, null);
           
            // indsæt smiley
            doc.insertString( doc.getLength(), "-" smiley);
        } catch (BadLocationException blEx) {
        }
    }
}


Her er en ButtonHandler, som burde virke med din kode... Men sådan som jeg ser det, så er der nogle seriøse design-overvejelser, du lige bliver nød til at tage op til revision... F.eks. så vil getSmileys(String) kun sende den første smiley tilbage---
dvs. at den ikke kan håndtere følgende " hejsa :-) :-)" - Den kan hellerikke klare "Hejsa:-)"
Derudover - at skrive smileyen - og så på næste linie indsætte smiley-ikonet --- Hmmm...

Nuvel ... Det var lige, hvad jeg kunne se i denne nattetime :-)

/Søren Munk Skrøder
Avatar billede encory Nybegynder
16. september 2002 - 07:12 #27
Jeg kunne ikke give dig mere ret... der er mange overvejelser tilbage og det skalnok komme på plads.... ville bare gerne have de indsættelser på plads først. Al links og kode jeg sendte efter jeg sendte kildekoden  "Kommentar: encory 16/09-2002 01:27:41" var blot ting jeg havde fundet på nettet, som jeg mente måske kunne "hjælpe dig", de gjorde ingenting for mig, da jeg ikke fuldt ud forstod koden. Er nybegynder på dette område i Java :o)
Avatar billede encory Nybegynder
16. september 2002 - 10:59 #28
JAmen det ser jo ud til at du har løst mit problem.... JEg kan sætte flere smileys ind i textpanen så resten må jeg selv sidde og rode i skuret med.... Mange tak for indsatsen...
Mvh Encory
Avatar billede bearhugx Nybegynder
16. september 2002 - 16:52 #29
takker for points :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester