2013-04-21 16 views
7

Mam JTextPane zadeklarowane tak:Clickable tekstu w JTextPane

JTextPane box = new JTextPane(); 
JScrollPane scroll = new JScrollPane(); 
StyledDocument doc = box.getStyledDocument(); 
scroll.setViewportView(box); 
scroll = new JScrollPane(box); 

A ja dodanie do niego tekstu w następujący sposób:

public void appendChatText(String text) 
{ 
    try 
    { 
     doc.insertString(doc.getLength(), text, null); 
     box.setAutoscrolls(true); 
     box.setCaretPosition(box.getDocument().getLength());  
    } 
    catch(BadLocationException e) 
    { 
     e.printStackTrace(); 
    } 
} 

I udało się również łatwo dostać JTextPane do wyświetlaj obrazy i komponenty w razie potrzeby, ale nie mogę wymyślić, jak zakodować klikalny tekst w JTextPane. Na przykład chcę, aby wydrukował komunikat, który mówi coś w stylu "Plik przesłany na serwer." Zaakceptuj * Odrzuć * "i jeśli użytkownik kliknie na łańcuchy akceptowania lub odrzucania, wówczas wykonuje odpowiednią funkcję. Wszelkie pomysły na to, jak można to skutecznie osiągnąć?

Odpowiedz

7

Skończyło się na rozwiązaniu tego problemu za pomocą MouseListener i klasy rozszerzającej AsbstractAction. Dodałem tekst chciałem być klikalny link do JTextPane następująco:

`Style regularBlue = doc.addStyle("regularBlue", StyleContext.getDefaultStyleContext().getStyle(StyleContext.DEFAULT_STYLE)); 
StyleConstants.setForeground(regularBlue, Color.BLUE); 
StyleConstants.setUnderline(regularBlue, true); 
regularBlue.addAttribute("linkact", new ChatLinkListener(textLink)); 
doc.insertString(doc.getLength(), textLink, regularBlue);` 

I zainicjowany w MouseListener na JTextPane gdzie indziej i dodaje następujący kod do mojej klasy słuchacza:

public void mouseClicked(MouseEvent e) 
     { 
      Element ele = doc.getCharacterElement(chatbox.viewToModel(e.getPoint())); 
      AttributeSet as = ele.getAttributes(); 
      ChatLinkListener fla = (ChatLinkListener)as.getAttribute("linkact"); 
      if(fla != null) 
      { 
       fla.execute(); 
      } 
     } 

I w końcu, to odwołuje się do klasy, która faktycznie wykonuje czynność:

class ChatLinkListener extends AbstractAction 
    { 
     private String textLink; 

     ChatLinkListener(String textLink) 
     { 
      this.textLink = textLink; 
     } 

     protected void execute() 
     { 
      if("accept".equals(url)) 
      { 
       //execute code 
      } 
      else if("decline".equals(url)) 
      { 
       //execute code 
      } 
     } 

     public void actionPerformed(ActionEvent e) 
     { 
      execute(); 
     } 
    } 
2

Dodaj mouselistener do tekstu, który ma być klikalny i wykonaj odpowiednie działanie.

0

Myślę swoją klasę „JOptionPane” który chcesz To powinno dać przyciski opcji do wyboru - np :(„OK”/„anuluj”)

3

I udało się również łatwo dostać JTextPane do wyświetlania obrazów i komponentów jako niezbędnego ... chcę go wydrukować komunikat, który mówi coś w stylu „Plik przesłany na serwer. Zebrane Odrzuć

Dlaczego nie dodać przyciski na „Akceptuj” i "Upadek"?

W przeciwnym razie można użyć JEditorPane do wyświetlenia HTML. Następnie możesz dodać HyperlinkListener do tekstu "Accept" i "Decline". Przeczytaj przykład interfejsu API JEditorPane. HyperlinkListener spodziewa się adresu URL po kliknięciu na tekście, ale nie sądzę, że istnieje jakikolwiek powód, dla którego nie może być po prostu ciągiem.

+0

Dzięki, wypróbuję to, gdy będę miał czas za kilka dni. Jeśli problem zostanie rozwiązany, przyjmuję odpowiedź. Osobowość starająca się unikać używania przycisków, aby wyglądała schludnie i czysto, więc HyperLinkListener brzmi jak droga, którą zabiorę. :) – Joe

2

Jeśli nie chcesz używać przycisków, a następnie użyć JLabel.

Jeśli używasz JTextPane, możesz użyć metody insertComponent(), aby wstawić nowy JLabel, który jest tej samej czcionki co czcionka JTextPane, i możesz dostosować JLabel tak, jak chcesz, np. Ustawiając kursor na kursor co daje mu klikalny wygląd i styl.

JLabel l=new JLabel("Click me"); 
l.setFont(textPane.getFont()); 
l.setCursor(new Cursor(Cursor.HAND_CURSOR)); 
l.addMouseListener(new MouseAdapter(){ 
    public void mouseClicked(MouseEvent me) 
    { 
     // your code 
    } 
}); 
textPane.insertComponent(l); 
Powiązane problemy