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