2012-09-29 32 views
5

Tengo un problema donde cuando trato de agregar un mouselistener a un JLabel o JButton en un JTextPane obtengo el error "no se puede convertir a Mouselistener mediante la conversión de invocación". Preferiría tener el componente en un JEditorPane. También escuché que podría usarse un HyperlinkEvent.Agregando mouselistener a JLabel/JButton insertado en JTextPane

Básicamente quiero un componente que se puede hacer clic con el botón derecho/izquierdo en un JEditorPane (preffered)/JTextPane. Cualquier ayuda sería apreciada

Ahora funciona (sortof) solo recibe clics con el botón derecho y no necesito dibujar los bordes de los botones. ¿Puedo subrayar el texto del botón?

código de ejemplo sigue ...

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

¿Tienes algún código de muestra? – MadProgrammer

Respuesta

2

Tengo un problema en el que cuando intento y añadir un MouseListener a un JLabel o JButton en un JTextPane I Obtiene el error "no se puede convertir a Mouselistener mediante la conversión de invocación".

El objeto está de paso a addMouseListener() implementa la interfaz MouseListener. ¿Derecha? (Acabo de ver el ejemplo del código. El adaptador del mouse parece correcto).
Ahora dice Ahora funciona (sortof). ¿Significa que ha corregido ese error?

Por cierto si eso se resuelve y tiene problemas posteriores, y son reutilizables por la comunidad, entonces yo le aconsejaría a abrir una cuestión distinta: https://meta.stackexchange.com/questions/48345/what-is-the-etiquette-for-changing-the-substance-of-a-question

yo preferiría tener el componente en un JEditorPane .

Supongo que te refieres al componente que estás escuchando. De todos modos, no estoy seguro de que el JEditorPane esté destinado a ser utilizado como contenedor de otros componentes.

Oí también un HyperlinkEvent podría ser utilizado.

HyperLinkEvent es para los tipos de evento ENTRADA, SALIDA y ACTIVADA. ¿Tiene la intención de manejar eventos de hipervínculo o mouse events?

Básicamente quiero un componente que se puede hacer clic con el botón derecho/izquierdo en un JEditorPane (preffered)/JTextPane. Cualquier ayuda sería apreciada

Aconsejaría la próxima vez dar el alcance/contexto de la pregunta primero. Supongo que quiere decir que quiere algo (¿puede ser más específico?) Encima de un panel de texto en el que se puede hacer clic. De todos modos, me sorprende que pretenda usar JEditorPane de esa manera.

+0

¿Hay alguna forma de que pueda usar HTML en un TextPane? – Confident

+1

@Confident No lo he intentado. Pero parece que se hace en el Tutorial de Swing: ["Cómo utilizar paneles de editor y paneles de texto"] (http://docs.oracle.com/javase/tutorial/uiswing/components/editorpane.html) – Javier

5

No estoy seguro de qué quiere que la pregunta esté en todas partes.

pero mira también subrayar el texto de un JButton simplemente establece el texto del botón con HTML etiquetas:

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

como para el clic izquierdo agregar un cheque a su sentencia if para la MouseEvent.BUTTON1 o SwingUtilities.isLeftMouseButton(MouseEvent me):

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

no llamar las fronteras de la JButton simplemente llame setBorder(null); ya sea en el InlineB c lass o en el InlineB instancia (lo hice dentro de la clase):

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

También veo que usted no establece el tipo de contenido del JTextPane, que debe:

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

Hice una pequeño ejemplo, aunque no hizo uso de un applet, pero es muy fácil de portar:

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 
    } 
}