15. september 2002 - 23:44Der 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 ???
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
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(); } }
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]
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...
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(); } }
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
// 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);
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);
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...
/** * 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(); } }
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()) );
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 :-)
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)
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
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.