Добавление прослушивателя мыши к JLabel/JButton, вставленному в JTextPane

У меня проблема: когда я пытаюсь добавить mouselistener в JLabel или JButton в JTextPane, я получаю сообщение об ошибке «невозможно преобразовать в Mouselistener путем преобразования вызовов». Я бы предпочел иметь компонент в JEditorPane. Я также слышал, что можно использовать HyperlinkEvent.

По сути, мне нужен компонент, который можно щелкнуть правой/левой кнопкой мыши в JEditorPane (предпочтительно)/JTextPane. Любая помощь будет оценена

Теперь он работает (вроде как), он получает только правые клики, и мне не нужно рисовать края кнопок. Могу ли я подчеркнуть текст кнопки?

Пример кода следует...

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

person Confident    schedule 29.09.2012    source источник


Ответы (2)


Я не уверен, что вы хотите, вопрос везде.

Но смотрите, слишком подчеркивайте текст JButton, просто установите текст кнопки с HTML-тегами :

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

что касается щелчка левой кнопкой мыши, добавьте проверку в оператор if для MouseEvent.BUTTON1 или SwingUtilities.isLeftMouseButton(MouseEvent me):

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

Чтобы не рисовать границы JButton, просто вызовите setBorder(null); либо в классе InlineB, либо в экземпляре InlineB (я сделал это внутри класса):

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

также я вижу, что вы не установили тип содержимого JTextPane, который вы должны:

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

Я сделал небольшой пример, хотя я не использовал апплет, но его очень легко портировать:

введите здесь описание изображения

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
    }
}
person David Kroukamp    schedule 29.09.2012

У меня проблема: когда я пытаюсь добавить mouselistener в JLabel или JButton в JTextPane, я получаю сообщение об ошибке «невозможно преобразовать в Mouselistener путем преобразования вызовов».

Объект, который вы передаете в addMouseListener(), реализует интерфейс MouseListener. Верно? (Только что видел пример кода. Адаптер мыши кажется правильным).
Теперь вы говорите Теперь это работает (вроде как). Значит ли это, что вы исправили эту ошибку?

Кстати, если это решено и у вас есть последующие проблемы, и они могут быть повторно использованы сообществом, я бы посоветовал открыть отдельный вопрос: https://meta.stackexchange.com/questions/48345/what-есть-этикет-для-изменения-субстанции-вопроса

Я бы предпочел иметь компонент в JEditorPane.

Я думаю, вы имеете в виду компонент, который вы слушаете. Во всяком случае, я не уверен, что JEditorPane предназначен для использования в качестве контейнера других компонентов.

Я также слышал, что можно использовать HyperlinkEvent.

HyperLinkEvent предназначен для Типы событий ENTERED, EXITED и ACTIVATED. Вы собираетесь обрабатывать события Hyperlink или события мыши?

По сути, мне нужен компонент, который можно щелкнуть правой/левой кнопкой мыши в JEditorPane (предпочтительно)/JTextPane. Любая помощь будет оценена

Я бы посоветовал в следующий раз сначала дать объем/контекст вопроса. Я предполагаю, что вы имеете в виду, что хотите что-то (можете быть более конкретным?) поверх текстовой панели, по которой можно щелкнуть. В любом случае, я удивлен, что вы собираетесь использовать JEditorPane таким образом.

person Javier    schedule 29.09.2012
comment
Есть ли способ использовать HTML в TextPane? - person Confident; 29.09.2012
comment
@ Уверен, я этого не пробовал. Но, похоже, это делается в учебном пособии по Swing: Как использовать панели редактора и Текстовые панели - person Javier; 29.09.2012