Avatar billede trp79 Nybegynder
11. april 2003 - 22:42 Der er 11 kommentarer og
1 løsning

Bold & Understegning

Jeg har et JTextArea.
Jeg vil gerne have lavet det sådan at hvis jeg markerer noget at den skrevne tekst så kan jeg lave den bold og/eller understrege den markerede del af teksten. Bold/Understregning skal ske ved genvejstaster
Kan dette lade sige gøre? Det kan det vel ikke med et JTextArea?
Hvis det kan lade sig gøre, hvordan gør man det så?
Avatar billede magoo20000 Nybegynder
11. april 2003 - 22:59 #1
Begynd med

http://developer.java.sun.com/developer/onlineTraining/Media/2DText/fonts.html#find

Jeg ser lige også på det lørdag - nu er jeg for træt*g*
Avatar billede viht Nybegynder
11. april 2003 - 23:04 #2
Bad place to start.. det behøver ikke være så svært. Der er masser af predefined styles i APIen.
Se følgende eksempel jeg har fikset:

// TestFrame.java:
import javax.swing.*;
import javax.swing.text.*;
import java.awt.*;
import java.awt.event.*;

public class TestFrame extends JFrame {
   
    private JMenuBar menu;
    private JMenu editMenu;
    private JMenu fileMenu;
   
    private JTextPane pane;
    private DefaultStyledDocument document;
   
    public TestFrame() {
       
        super("Test");
        setSize(400,400);
       
        getContentPane().add(new JScrollPane(createTextPane()), BorderLayout.CENTER);
        setJMenuBar(createMenu());   
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
   
    private JTextPane createTextPane() {
        pane = new JTextPane(document = createDocument());
        return pane;
    }
   
    private DefaultStyledDocument createDocument() {
        document = new DefaultStyledDocument();
       
        String init[] =    {
                                    "Quick brown fox jumps over lazy dog",
                                "Quick brown fox jumps over lazy dog",
                                "Quick brown fox jumps over lazy dog",
                                "Quick brown fox jumps over lazy dog",
                                };
       
        SimpleAttributeSet[] atts = new SimpleAttributeSet[4];
       
        atts[0] = new SimpleAttributeSet();
        StyleConstants.setFontFamily(atts[0], "SansSerif");
        StyleConstants.setFontSize(atts[0], 16);
       
        atts[1] = new SimpleAttributeSet();
        StyleConstants.setBold(atts[1], true);
       
        atts[2] = new SimpleAttributeSet();
        StyleConstants.setItalic(atts[2], true);
       
        atts[3] = new SimpleAttributeSet();
        StyleConstants.setForeground(atts[3], Color.red);
       
        try {
          for (int i = 0; i < init.length; i ++) {
              document.insertString(document.getLength(), init[i] + "\n", atts[i]);
          }
        }
        catch (BadLocationException ble) {
            ble.printStackTrace();
        }
        return document;
    }
   
    private JMenuBar createMenu() {
        menu = new JMenuBar();
       
        menu.add(fileMenu = new JMenu("Filer"));
        JMenuItem exitItem = new JMenuItem("Afslut");
        exitItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                System.exit(0);
            }
        });
        fileMenu.add(exitItem);
       
        menu.add(editMenu = new JMenu("Rediger"));
       
        Action action = new StyledEditorKit.BoldAction();
      action.putValue(Action.NAME, "Fed");
      editMenu.add(action);

        action = new StyledEditorKit.ItalicAction();
        action.putValue(Action.NAME, "Kursiv");
        editMenu.add(action);
       
        action = new StyledEditorKit.UnderlineAction();
        action.putValue(Action.NAME, "Understregning");
        editMenu.add(action);
       
        editMenu.addSeparator();
       
        editMenu.add(new StyledEditorKit.FontSizeAction("12", 12));
        editMenu.add(new StyledEditorKit.FontSizeAction("14", 14));
        editMenu.add(new StyledEditorKit.FontSizeAction("18", 18));
       
        editMenu.addSeparator();
       
        editMenu.add(new StyledEditorKit.FontFamilyAction("Serif", "Serif"));
        editMenu.add(new StyledEditorKit.FontFamilyAction("SansSerif", "SansSerif"));
        editMenu.addSeparator();
       
        editMenu.add(new StyledEditorKit.ForegroundAction("Rød", Color.red));
        editMenu.add(new StyledEditorKit.ForegroundAction("Grøn", Color.green));
        editMenu.add(new StyledEditorKit.ForegroundAction("Blå", Color.blue));
        editMenu.add(new StyledEditorKit.ForegroundAction("Sort", Color.black));
       
        return menu;
    }
   
    public static void main(String[] args) {
      new TestFrame().show();
  }
}
Avatar billede trp79 Nybegynder
11. april 2003 - 23:34 #3
Det virker jo rigtig godt. Jeg har blot erstattet mine JTextAreas med JTextPanes. Jeg har dog ikke brugt "DefaultStyledDocument", hvad gør det?

Jeg har dog et problem. Jeg læser texten fra min JTextPane med pane.getText() og skriver det ned i en fil (xml) hvordan får jeg den til at gemme understregninger osv?
Avatar billede trp79 Nybegynder
11. april 2003 - 23:38 #4
Lige en tilføjelse til min sidste kommentar.... Det jeg gør er at jeg skriver dataene ned i en xml fil ud fra et objekt. Et firma objekt består fx af en note streng. Den er denne streng som JTextPane i første omgang læses ned i.
Skal man så bruge dokument som en paramenter i firma istedet for streng?
Avatar billede =maddog= Nybegynder
11. april 2003 - 23:55 #5
Hvad repræsenterer data? Tekst eller style eller hvad?
Du kan få et HTMLDocument til at skrive din formatterede tekst ud som HTML...
Avatar billede trp79 Nybegynder
12. april 2003 - 00:04 #6
Jeg bruger min xml fil som database.
Jeg henter skriver så til den fra programmet (når man gemmer). Dvs. Jeg skal have skrevet det der står i JTextPane'n i xml-filen, således at når jeg starter programmet næste gang igen, så er der formateringer (rød, grøn, understreget osv.) som jeg sluttede programmet med da jeg forlod det sidst.
Avatar billede =maddog= Nybegynder
12. april 2003 - 00:28 #7
altså i stil med
<kunde>
<navn font="SansSerif" color="#443356" underline="true">
  Børge Holm
</navn>
<firma font="Monotype">
  Spanking Banking A/SS
</firma>
</kunde>

Eller hvad er det HELT nøjagtig du vil. Det er jo svært at flette BÅDE formatering OG data-struktur ind i et XML dokument (kan folk der har lavet et XSLT stylesheet skrive under på).
Avatar billede viht Nybegynder
12. april 2003 - 01:01 #8
Det bliver et større helvede først at omskrive alle styles til XML og derefter parse styles fra det destruktive format. Det er nemmere bare at serialisere textpane objektet ud så.
Avatar billede trp79 Nybegynder
12. april 2003 - 08:16 #9
Nu skriver jeg data fra note feltet til xml filen med:
pw.println(" <noter>" + xmlConvert(current.getNoter()) + "</noter>");

  public static String xmlConvert(String tmp)
  {
      String s = tmp.replaceAll("&", "&amp;");
      tmp = s.replaceAll("<", "&lt;");
      s = tmp.replaceAll(">", "&gt;");
        return s;
  }

Så det kunne være jeg bare skulle holde mig til ren tekst...
Avatar billede trp79 Nybegynder
12. april 2003 - 22:40 #10
Jeg bruger jo ikke min xml fil til andet end en database, jeg bruger den med andre ord ikke som noget der skal ses.
Hvis man udskriver teksten som står i et JTextPane som dit eks. viht, vil det så bare være teksten eller vil det være teksten + koder for farver, str. skrifttype osv. eller hvordan det nu er lavet? For hvis det er det, kan man vel bare indlæse det igen?
Seialisering synes jeg ikke rigtigt om da jeg ændre i mine klasser ret tit....
Avatar billede viht Nybegynder
12. april 2003 - 23:23 #11
getText() returnerer bare teksten i ren tekst. Jeg har endnu ikke fundet ud af hvordan man finder ud hvilken tekst en givet Style er tilknyttet..
Avatar billede trp79 Nybegynder
13. april 2003 - 09:12 #12
Okidoki, jeg nøjes med mit JTextArea indtil videre så...
Forsat god weekend, mvh
Torben
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