【问题标题】:addMouseListener to a program将鼠标监听器添加到程序中
【发布时间】:2012-03-26 10:32:05
【问题描述】:

我试图覆盖MouseAdaptermouseClicked 函数,然后我可以在我的程序中使用它,如下所示:

import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;
import java.net.URLConnection;
import javax.swing.JFrame;
import javax.xml.parsers.ParserConfigurationException;
import org.lobobrowser.html.HtmlRendererContext;
import org.lobobrowser.html.UserAgentContext;
import org.lobobrowser.html.domimpl.HTMLLinkElementImpl;
import org.lobobrowser.html.gui.HtmlPanel;
import org.lobobrowser.html.parser.DocumentBuilderImpl;
import org.lobobrowser.html.parser.InputSourceImpl;
import org.lobobrowser.html.test.SimpleHtmlRendererContext;
import org.lobobrowser.html.test.SimpleUserAgentContext;
import org.w3c.dom.Document;
import org.w3c.dom.html2.HTMLLinkElement;
import org.w3c.dom.html2.HTMLElement;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

public  class test {



public static void main(String[] args) throws SAXException, 
            IOException, ParserConfigurationException {

        String uri = "http://docs.oracle.com/javase/1.5.0/docs/api/java/awt/event/MouseAdapter.html";
        URL url = new URL(uri);
        URLConnection connection = url.openConnection();
        InputStream in = connection.getInputStream();
        Reader reader = new InputStreamReader(in);
        InputSource is = new InputSourceImpl(reader, uri);
        UserAgentContext uAgent = new SimpleUserAgentContext();
        final HtmlPanel htmlPanel = new HtmlPanel();
        final HtmlRendererContext rendererContext = (HtmlRendererContext) 
                new LocalHtmlRendererContext(htmlPanel, uAgent);
        DocumentBuilderImpl builder = new DocumentBuilderImpl(uAgent, rendererContext);
        Document document = builder.parse(is);
        JFrame frame = new JFrame();
        frame.setContentPane(htmlPanel);


        htmlPanel.addMouseListener(new MouseAdapter() {

            @Override
            public void mouseClicked(MouseEvent e) {
                System.out.println("adr is equal to" + rendererContext.getCurrentURL());

                System.out.println("Clicked!" + e);
            }
        });

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        htmlPanel.setDocument(document, rendererContext);
        frame.setSize(400, 800);
        frame.setVisible(true);
    }

    private static class LocalHtmlRendererContext extends SimpleHtmlRendererContext {

        public LocalHtmlRendererContext(HtmlPanel contextComponent, UserAgentContext uAgent) {
            super(contextComponent);
        }
    }
}

但它不起作用。如果我点击表格的任何部分,什么都不会发生。

我尝试了htmlPanel.addMouseListener(new MouseAdapter()frame.addMouseListener(new MouseAdapter() 都没有帮助。

编辑:

我尝试了你的建议,我选择了 BrowsertPanel 而不是 HtmlPanel,然后我尝试获取它的组件如下:

org.lobobrowser.gui.AddressBarPanel[,0,0,0x0,invalid,layout=javax.swing.BoxLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=]
org.lobobrowser.gui.SharedToolBarPanel[,0,0,0x0,invalid,layout=javax.swing.BoxLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=]
org.lobobrowser.gui.FillerComponent[,0,0,0x0,invalid,layout=org.lobobrowser.util.gui.WrapperLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=0,maximumSize=java.awt.Dimension[width=32767,height=32767],minimumSize=java.awt.Dimension[width=0,height=0],preferredSize=java.awt.Dimension[width=32767,height=32767]]
org.lobobrowser.gui.StatusBarPanel[,0,0,0x0,invalid,layout=javax.swing.BoxLayout,alignmentX=0.0,alignmentY=0.0,border=javax.swing.border.BevelBorder@c2a132,flags=9,maximumSize=,minimumSize=,preferredSize=]

我还添加了一个 navigationListener,当它导航时,我得到如下事件:

org.lobobrowser.ua.NavigationEvent[source=FramePanel[windowId=BrowserPanel.10481519,hashCode=23491286,parent=org.lobobrowser.gui.FillerComponent[,0,25,584x316,layout=org.lobobrowser.util.gui.WrapperLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=0,maximumSize=java.awt.Dimension[width=32767,height=32767],minimumSize=java.awt.Dimension[width=0,height=0],preferredSize=java.awt.Dimension[width=32767,height=32767]]]]

但我觉得我迷失在这些组件中,似乎FillerComponentFramePanel 负责渲染,即便如此,我也不知道如何为它们添加监听器。

还发现这个Link 有人描述了解决问题的步骤,但对我来说似乎很复杂?有伪代码可以分发吗?

【问题讨论】:

  • HtmlPanel 到底是什么?没关系。为了尽快获得更好的帮助,请发布SSCCE。 SSCCE 将回答这个问题,以及我接下来的 10 个问题。
  • @AndrewThompson 如果您的意思是可以通过复制/粘贴运行的代码,我做了,但您需要获取 lobobrowser 库,如何添加它?
  • 我(1) 不准备下载任何东西来测试源代码。如果使用核心 J2SE 无法重现该问题,则可能是第 3 方 API 存在问题。您应该与该 API 的供应商讨论的问题。话虽如此,如果您将HtmlPane 换成JEditotPane 并看到完全相同的“空”行为-那可能是SSCCE。 1) ..可能还有几个人除了我,虽然我只能代表我自己。
  • @AndrewThompson 所以你认为代码一般正确吗?
  • 可能不会。毕竟,它不是检测鼠标点击,是吗?除此之外,它做了两件不太理想的事情,这似乎都不是最直接的问题。 1) setSize 在框架上而不是 setPreferredSize/good layout for content 和 pack 在框架上。 2) GUI 应该在 EDT 上启动(和更新)。

标签: java html swing mouseevent mouselistener


【解决方案1】:

此代码(是 SSCCE &)有效。尝试一次更改一行,直到看到错误清单。

import java.awt.event.*;
import javax.swing.*;
import java.net.URL;

public  class test {

    public static void main(String[] args) throws Exception {

        String uri = "http://docs.oracle.com/javase/1.5.0/docs/api/java/awt/event/MouseAdapter.html";
        final URL url = new URL(uri);
        JEditorPane htmlPanel = new JEditorPane(url);
        JFrame frame = new JFrame();
        frame.setContentPane(htmlPanel);

        htmlPanel.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                System.out.println("adr is equal to" + url);

                System.out.println("Clicked!" + e);
            }
        });

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 800);
        frame.setVisible(true);
    }
}

更新

..似乎错误来自 htmlpanel

根据 StanislavL 的评论,我做了一些挖掘工作。似乎SimpleBrowserFrame 扩展了HtmlPanel 并提供了getComponent() 的方法,其中..

获取渲染框架的组件。 ..

也许如果使用SimpleBrowser,您可以将侦听器添加到孩子,它会工作。诚然,我只是在快速搜索文档后猜测。

【讨论】:

  • 哦,看来 bug 来自 htmlpanel
  • @AndrewThompson 如果你看到我的编辑,看看有没有什么要指出的?
  • 不知道更多的想法,抱歉。
  • @AndrewThompson 我只是想知道如何访问组件的子组件并为其添加监听器,仅此而已,通常适用于任何组件:)
  • simpleBrowserFrame.getComponent().addMouseListener(... 顺便说一句。能够使用支持不佳的 API 的开发人员应该具有丰富的经验。你的问题的性质向我表明你不是。我的建议是你放弃这个 API,如果你找不到合适的替换组件,把 app.暂停。
【解决方案2】:

只是猜测。检查 htmlPanel 的子组件。可能它们覆盖了整个面板。尝试在 HtmlPanel 填充内容后将侦听器附加到所有子组件。

【讨论】:

  • @StanislavL Check children components of the htmlPanel, by ignoring lobobrowser 只是我的好奇心,你是说 Swing JComponet 还是 Html 组件
  • 嗯,更多提示如何?你知道,我是 java 新手,从 4 个月前开始从 C++ 转移,所以你解释事情的方式对我来说似乎并不熟悉。
  • public Component[] getComponents() 面板的方法。检查孩子并检查孩子的孩子。
  • 我输入了 System.out.println(htmlPanel.getComponents().toString()); 它返回了 [Ljava.awt.Component;@337838 [L] 是什么意思?
  • htmlPanel.getComponents() 是一个数组。遍历项目。
猜你喜欢
  • 2013-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-26
  • 2014-12-13
  • 2014-02-21
  • 1970-01-01
相关资源
最近更新 更多