Добавяне на mouselistener към 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. Нали? (Току-що видях примерния код. Адаптерът за мишка изглежда правилен).
Сега казвате Сега работи (sortof). Означава ли, че сте коригирали тази грешка?

Между другото, ако това е разрешено и имате последващи проблеми и те могат да се използват повторно от общността, тогава бих ви посъветвал да отворите отделен въпрос: https://meta.stackexchange.com/questions/48345/what-is-the-etiquette-for-changing-the-substance-of-a-question

Бих предпочел да имам компонента в JEditorPane.

Предполагам имаш предвид компонента, който слушаш. Както и да е, не съм сигурен за JEditorPane е предназначен да се използва като контейнер на други компоненти.

Чух също, че може да се използва HyperlinkEvent.

HyperLinkEvent е предназначен за Типове събития ВЛИЗАН, ИЗЛЕЗЕН и АКТИВИРАН. Възнамерявате да обработвате събития с хипервръзки или събития на мишката?

По принцип искам компонент, върху който може да се щракне с десен/ляв бутон в JEditorPane (предпочитан)/JTextPane. Всяка помощ ще бъде оценена

Бих посъветвал следващия път първо да посочите обхвата/контекста на въпроса. Предполагам, че искаш нещо (може ли да бъдеш по-конкретно?) в горната част на текстов панел, върху който може да се щракне. Както и да е, изненадан съм, че възнамерявате да използвате JEditorPane по този начин.

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