2012-09-29 13 views
5

Ho un problema in cui quando provo ad aggiungere un mouselistener a JLabel o JButton in un JTextPane ottengo l'errore "non può essere convertito a Mouselistener per conversione di invocazione". Preferirei avere il componente in un JEditorPane. Ho anche sentito usare un HyperlinkEvent.Aggiunta di mouselistener a JLabel/JButton inserito in JTextPane

In generale, voglio un componente che può essere premuto a destra/a sinistra in un JEditorPane (preffered)/JTextPane. Qualsiasi aiuto sarebbe gradito

Ora funziona (sortof) riceve solo clic destro e non è necessario disegnare i bordi dei pulsanti. Posso sottolineare il testo del pulsante?

codice di esempio segue ...

import java.awt.*; 
import javax.swing.*; 
import java.awt.Color; 
import javax.swing.JTextPane; 
import javax.swing.JButton; 
import java.applet.*; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

public class jlabeltest extends Applet { 

    public void init() { 

     jlabeltest editorPaneExample = new jlabeltest(); 
     editorPaneExample.setSize(550, 300); 
//  editorPaneExample.setText("tutorialData.com"); 
     editorPaneExample.setVisible(true); 
    } 


    public jlabeltest() { 

     JTextPane editorPane = new JTextPane(); 
     editorPane.setSelectedTextColor(Color.red); 
     editorPane.setText("<p color='#FF0000'>Cool!</p>"); 
     InlineB label = new InlineB("JLabel"); 
     label.setAlignmentY(0.85f); 

     label.addMouseListener(new MouseAdapter() { 

     public void mouseReleased(MouseEvent e) 
     { 
     if (e.isPopupTrigger()) 
     { 
      JOptionPane.showMessageDialog(null,"Hello!"); 
      // do your work here 
     } 
    } 
}); 
     editorPane.insertComponent(label); 
     this.add(editorPane); 
    } 
} 

InlineB.java

import javax.swing.JButton; 

    public class InlineB extends JButton { 

     public InlineB(String caption) { 

      super(caption); 
     } 
    } 
+3

Hai qualche codice di esempio? – MadProgrammer

risposta

2

Ho un problema in cui quando provo ed aggiungo un MouseListener ad un JLabel o JButton in un JTextPane I ottenere l'errore "non può essere convertito in Mouselistener per conversione di invocazione".

L'oggetto che si sta passando ad addMouseListener() implementa l'interfaccia MouseListener. Destra? (appena visto l'esempio del codice, l'adattatore del mouse sembra giusto).
Ora si dice Ora funziona (sortof). Significa che hai corretto quell'errore?

BTW se questo è stato risolto e si hanno problemi successivi, e sono riutilizzabili dalla comunità, allora vi consiglio di aprire una domanda separata: https://meta.stackexchange.com/questions/48345/what-is-the-etiquette-for-changing-the-substance-of-a-question

preferirei avere il componente in un JEditorPane .

Immagino tu intenda il componente che stai ascoltando. Ad ogni modo non sono sicuro che lo JEditorPane debba essere usato come contenitore di altri componenti.

Ho anche sentito un HyperlinkEvent che potrebbe essere utilizzato.

HyperLinkEvent è inteso per tipi di evento ENTERED, EXITED e ACTIVATED. Hai intenzione di gestire eventi Hyperlink o mouse events?

In generale, voglio un componente che può essere premuto a destra/a sinistra in un JEditorPane (preffered)/JTextPane. Qualsiasi aiuto sarebbe gradito

Vorrei raccomandare la prossima volta dare l'ambito/contesto della domanda prima. Immagino tu voglia dire che vuoi qualcosa (puoi essere più specifico?) In cima a un riquadro di testo che può essere cliccato. Ad ogni modo sono sorpreso che intendi usare JEditorPane in questo modo.

+0

È possibile utilizzare l'HTML in un TextPane? – Confident

+1

@Confident Non l'ho provato. Ma sembra essere fatto nel Tutorial di Swing: ["Come usare i riquadri dell'editor e i riquadri di testo"] (http://docs.oracle.com/javase/tutorial/uiswing/components/editorpane.html) – Javier

5

Non sono sicuro di cosa vuoi che la domanda sia ovunque.

ma guarda anche sottolineare il testo di un JButton è sufficiente impostare il testo del pulsante con HTML tags:

//added <u></u> to underlone button 
InlineB label = new InlineB("<html><u>JLabel</u></html>"); 

come per la sinistra fare clic su Aggiungi un controllo per la vostra istruzione if per il MouseEvent.BUTTON1 o SwingUtilities.isLeftMouseButton(MouseEvent me):

//added check for MouseEvent.BUTTON1 which is left click 
if (e.isPopupTrigger() || e.getButton() == MouseEvent.BUTTON1) { 
} 

non attirare i confini del JButton semplicemente chiamare setBorder(null); sia nella InlineB c lass o l'istanza InlineB (l'ho fatto all'interno della classe):

  public InlineB(String caption) { 
    super(caption); 
    setBorder(null);//set border to nothing 
} 

anche Vedo che tu non impostare il tipo di contenuto della JTextPane, che è necessario:

//set content as html 
    editorPane.setContentType("text/html"); 

Ho fatto un piccolo esempio anche se non ho usato un Applet ma è molto facile da porto:

enter image description here

import java.awt.Color; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import javax.swing.*; 

public class Test { 

    public static void main(String[] args) throws Exception { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new Test().createAndShowUI(); 
      } 
     }); 
    } 

    private void createAndShowUI() { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     initComponents(frame); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    private void initComponents(JFrame frame) { 
     JTextPane editorPane = new JTextPane(); 
     editorPane.setSelectedTextColor(Color.red); 

     //set content as html 
     editorPane.setContentType("text/html"); 
     editorPane.setText("<p color='#FF0000'>Cool!</p>"); 

     //added <u></u> to underlone button 
     InlineB label = new InlineB("<html><u>JLabel</u></html>"); 

     label.setAlignmentY(0.85f); 

     label.addMouseListener(new MouseAdapter() { 

      @Override 
      public void mouseReleased(MouseEvent e) { 
       //added check for MouseEvent.BUTTON1 which is left click 
       if (e.isPopupTrigger() || e.getButton() == MouseEvent.BUTTON1) { 
        JOptionPane.showMessageDialog(null, "Hello!"); 
        // do your work here 
       } 
      } 
     }); 

     editorPane.insertComponent(label); 
     frame.getContentPane().add(editorPane); 
    } 
} 

class InlineB extends JButton { 

    public InlineB(String caption) { 
     super(caption); 
     setBorder(null);//set border to nothing 
    } 
}