我即将着手编写一个(我认为会是)快速程序,其中包含来自股票网站的标题,并将它们插入到我要创建的类的ArrayList中,称为Funds / Tickers / WhatHaveYou 。这不是一个大问题。我遇到的主要问题是:
我想只有一个窗口,那个窗口会不断滚动标题。您可以单击标题,这将打开浏览器以阅读该文章。
我最初认为你可以用JLabels做到这一点,但我做了一些实验,我只能让Strings在屏幕上移动,而不是JLabels / JButtons /可点击的东西。有没有办法让JLabel或超链接在Java窗口中滚动?
干杯, 大卫
答案 0 :(得分:2)
在此example中,RSS Feed中的条目会添加到JTextPane
。可以添加HyperlinkListener
来接收代表hyerlinks点击的事件。
答案 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();
}
});
}
}