java中的滚动超链接

java中的滚动超链接,java,swing,animation,jlabel,Java,Swing,Animation,Jlabel,我将要开始写一个(我认为会是)快速程序,从股票网站上提取标题,并将它们插入我将要创建的一个类的ArrayList,名为Funds/Tickers/WhatHaveYou。这不是大问题。我的主要问题是: 我只想有一个窗口,该窗口将持续滚动标题。你可以点击标题,这将打开一个浏览器来阅读文章 我最初以为可以用JLabels来实现这一点,但我做了一些实验,我只能让字符串在屏幕上移动,而不是JLabels/JButtons/clickable。有没有一种方法可以让jlabel或超链接在Java窗口中滚动访

我将要开始写一个(我认为会是)快速程序,从股票网站上提取标题,并将它们插入我将要创建的一个类的ArrayList,名为Funds/Tickers/WhatHaveYou。这不是大问题。我的主要问题是:

我只想有一个窗口,该窗口将持续滚动标题。你可以点击标题,这将打开一个浏览器来阅读文章

我最初以为可以用JLabels来实现这一点,但我做了一些实验,我只能让字符串在屏幕上移动,而不是JLabels/JButtons/clickable。有没有一种方法可以让jlabel或超链接在Java窗口中滚动访问

干杯,
大卫

也许你需要的是一个编辑版:


希望有帮助。

也许你需要的是一个编辑工具:

希望对您有所帮助。

在这里,RSS源中的条目将添加到。可以添加以接收表示单击HyerLink的事件

在这种情况下,RSS源中的条目将添加到。可以添加以接收表示单击HyerLink的事件

我只想有一个窗口,该窗口将持续滚动标题

您可以使用

你可以点击标题,这将打开一个浏览器来阅读文章

上面的类不支持单击组件。然而,我一直在玩弄这个概念。使用JLabel时,它似乎工作正常,但我认为它不适用于其他组件

1) 首先,您需要向MarquePanel类添加几个方法,这些方法将转换鼠标点以映射到面板上的真实组件(如果您使用的是包装选项):

2) 然后,您可以向面板添加鼠标侦听器。使用如下代码,您现在可以访问单击的标签:

marquee.addMouseListener( new MouseAdapter()
{
    @Override
    public void mousePressed(MouseEvent e)
    {
        Component c = marquee.getComponentAt(e.getPoint());

        if (c == null) return;

        if (c insstanceof JLabel)
        {
            JLabel label = (JLabel)c;
            System.out.println(label.getText());
        }
    }
});
我只想有一个窗口,该窗口将持续滚动标题

您可以使用

你可以点击标题,这将打开一个浏览器来阅读文章

上面的类不支持单击组件。然而,我一直在玩弄这个概念。使用JLabel时,它似乎工作正常,但我认为它不适用于其他组件

1) 首先,您需要向MarquePanel类添加几个方法,这些方法将转换鼠标点以映射到面板上的真实组件(如果您使用的是包装选项):

2) 然后,您可以向面板添加鼠标侦听器。使用如下代码,您现在可以访问单击的标签:

marquee.addMouseListener( new MouseAdapter()
{
    @Override
    public void mousePressed(MouseEvent e)
    {
        Component c = marquee.getComponentAt(e.getPoint());

        if (c == null) return;

        if (c insstanceof JLabel)
        {
            JLabel label = (JLabel)c;
            System.out.println(label.getText());
        }
    }
});

我昨天正在做这个,当你第一次发布你的问题的时候。我累了,不再胡闹了。基本上,我所做的就是使用JPanel,并根据每个计时器的滴答声设置它们的位置。我怀疑这是最好的方法,我真的厌倦了尝试解决一些问题,所以我就停下来。你可以随意玩弄它,看看是否能从中得到更好的结果。最令人沮丧的是,当你点击面板时,所有的东西都会快速移动一秒钟。希望你能用它做点什么,或者至少得到一些想法。我只是不想把它扔掉,以防万一你能把它做成什么

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.LinkedList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class TestLabelMove {

    List<MovingLabel> labels;
    private int count = 1;
    private JLabel statusLabel;
    private final int SEPARATION = 100;
    private final int SCREEN_W = 800;
    int XLOC = SCREEN_W;

    public TestLabelMove() {

        statusLabel = new JLabel("Status");
        statusLabel.setHorizontalAlignment(JLabel.CENTER);

        JFrame frame = new JFrame("Test Labels");
        frame.add(statusLabel, BorderLayout.CENTER);
        frame.add(new LabelPanel(), BorderLayout.SOUTH);
        frame.setSize(800, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

    }

    private class LabelPanel extends JPanel {


        private static final int INC = 5;

        public LabelPanel() {
            labels = new LinkedList<>();
            for (int i = 0; i < 8; i++) {
                MovingLabel label = new MovingLabel(XLOC);
                labels.add(label);
                XLOC -= SEPARATION;
                add(label);
            }

            Timer timer = new Timer(100, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    for (MovingLabel label : labels) {
                        if (isWrap(label.getXLoc())) {
                            label.setXLoc(SCREEN_W);
                            label.setLocation(label.getXLoc(), 0);
                        } else {
                            label.setLocation(label.getXLoc(), 0);
                            label.setXLoc(label.getXLoc() - INC);
                        }
                    }

                }
            });
            timer.start();
        }
    }

    public boolean isWrap(int x) {
        return x <= -40;
    }

    private class MovingLabel extends JPanel {

        int xLoc;
        String phrase;
        public MovingLabel(int xLoc) {
            this.xLoc = xLoc;
            phrase = "Panel " + count;
            count++;

            this.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    statusLabel.setText(phrase);
                    repaint();
                }
            });
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Font font = new Font("Helvetica", Font.BOLD, 14);
            FontMetrics fm = g.getFontMetrics(font);
            int w = fm.stringWidth(phrase);
            int h = fm.getAscent();
            g.setFont(font);
            g.drawString(phrase, getWidth()/2 - w/2, getHeight()/2 + h/2);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(100, 20);
        }

        public void setXLoc(int xLoc) {
            this.xLoc = xLoc;
        }

        public int getXLoc() {
            return xLoc;
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new TestLabelMove();
            }
        });
    }
}
导入java.awt.BorderLayout;
导入java.awt.Dimension;
导入java.awt.Font;
导入java.awt.FontMetrics;
导入java.awt.Graphics;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入java.util.LinkedList;
导入java.util.List;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.SwingUtilities;
导入javax.swing.Timer;
公共类TestLabelMove{
列出标签;
私有整数计数=1;
专用JLabel状态标签;
私有最终整数间隔=100;
专用最终整数屏幕W=800;
int XLOC=屏幕;
公共测试标签移动(){
statusLabel=新的JLabel(“状态”);
statusLabel.setHorizontalAlignment(JLabel.CENTER);
JFrame=新JFrame(“测试标签”);
frame.add(statusLabel、BorderLayout.CENTER);
添加(新LabelPanel(),BorderLayout.SOUTH);
框架设置尺寸(800300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
私有类LabelPanel扩展了JPanel{
专用静态最终int INC=5;
公共标签面板(){
labels=newlinkedlist();
对于(int i=0;i<8;i++){
移动标签=新移动标签(XLOC);
标签。添加(标签);
XLOC-=分离;
添加(标签);
}
计时器计时器=新计时器(100,新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
用于(移动标签:标签){
if(isWrap(label.getXLoc())){
label.setXLoc(屏幕W);
label.setLocation(label.getXLoc(),0);
}否则{
label.setLocation(label.getXLoc(),0);
label.setXLoc(label.getXLoc()-INC);
}
}
}
});
timer.start();
}
}
公共布尔isWrap(int x){

return x当你第一次发布你的问题时,我昨天正在做这件事。我累了,不再搞它了。基本上我所做的就是使用JPanel,并用每个计时器的滴答声设置它们的位置。我怀疑这是最理想的方式,我真的厌倦了尝试解决一些问题,所以我就停下来了。你是fre