在java中滚动超链接

时间:2014-01-27 15:02:29

标签: java swing animation jlabel

我即将着手编写一个(我认为会是)快速程序,其中包含来自股票网站的标题,并将它们插入到我要创建的类的ArrayList中,称为Funds / Tickers / WhatHaveYou 。这不是一个大问题。我遇到的主要问题是:

我想只有一个窗口,那个窗口会不断滚动标题。您可以单击标题,这将打开浏览器以阅读该文章。

我最初认为你可以用JLabels做到这一点,但我做了一些实验,我只能让Strings在屏幕上移动,而不是JLabels / JButtons /可点击的东西。有没有办法让JLabel或超链接在Java窗口中滚动?

干杯, 大卫

4 个答案:

答案 0 :(得分:2)

在此example中,RSS Feed中的条目会添加到JTextPane。可以添加HyperlinkListener来接收代表hyerlinks点击的事件。

image

答案 1 :(得分:2)

  

我想只有一个窗口,那个窗口会不断滚动标题。

您可以使用Marquee Panel进行此操作。

  

您可以点击标题,这将打开浏览器阅读文章。

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

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

@Override
public Component getComponentAt(int x, int y)
{
    Point translated = getTranslatedPoint(x, y);

    for (Component c: getComponents())
    {
        if (c.getBounds().contains(translated))
            return c;
    }

    return null;
}

public Point getTranslatedPoint(int x, int y)
{
    int translatedX = x + scrollOffset;

    if (isWrap())
    {
        int preferredWidth = super.getPreferredSize().width;
        preferredWidth += getWrapAmount();
        translatedX = translatedX % preferredWidth;
    }

    return new Point(translatedX, y);
}

2)然后您可以将MouseListener添加到面板。使用以下代码,您现在可以访问被单击的标签:

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

答案 2 :(得分:1)

也许你需要的是一个EditorPane:

http://docs.oracle.com/javase/tutorial/uiswing/components/editorpane.html

希望它有所帮助。

答案 3 :(得分:0)

昨天,当你第一次发布你的问题时,我正在研究这个问题。我累了,不再搞乱了。基本上我所做的就是使用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();
            }
        });
    }
}