java中的垂直选框JLabel?

java中的垂直选框JLabel?,java,swing,awt,jlabel,marquee,Java,Swing,Awt,Jlabel,Marquee,我需要在java应用程序中构造一个字幕。我认为JLabel是一个很好的控件。我已经用水平选框标签做了一些事情,但使其垂直对我来说并不容易。您可以使用一个内部带有JLabel的JPanel来使用下面的类选框 import java.awt.Color; import java.awt.Dimension; import java.awt.Point; import javax.swing.JLabel; import javax.swing.JPanel; public class Marqeu

我需要在java应用程序中构造一个字幕。我认为JLabel是一个很好的控件。我已经用水平选框标签做了一些事情,但使其垂直对我来说并不容易。

您可以使用一个内部带有JLabel的JPanel来使用下面的类选框

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Point;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class MarqeuePanel extends JPanel implements Runnable
{
    private boolean IsStoped = false;
    private JLabel label;
    public MarqeuePanel(Dimension d,Point p,String text)
    {
        super();
        label = new JLabel();
        label.setText(text);
        add(label);
        setSize(d);
        setOpaque(false);
        setBackground(new Color(0,0,0,0));
        label.setLocation(0,this.getSize().height);
        Thread t = new Thread(this);
        t.start();
    }

    @Override
    public void run() 
    {
        //Marqueue
        label.setLocation(0,this.getSize().height);
        while(!IsStoped)
        {
            if(label.getLocation().y < -label.getSize().height)
            {
                label.setLocation(0,this.getSize().height);
            }
            else
            {
                int x = 0;
                int y = label.getLocation().y - 1;
                label.setLocation(x,y);
            }
            try{Thread.sleep(30);}catch(Exception exc){}
        }
    }

    public void StopMarque()
    {
        IsStoped = true;
    }
}
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Point;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
公共类MarquePanel扩展JPanel实现Runnable
{
私有布尔值IsStoped=false;
私人标签;
公共MarquePanel(维度d,点p,字符串文本)
{
超级();
label=新的JLabel();
label.setText(文本);
添加(标签);
设置大小(d);
设置不透明(假);
挫折背景(新颜色(0,0,0,0));
label.setLocation(0,this.getSize().height);
螺纹t=新螺纹(此);
t、 start();
}
@凌驾
公开募捐
{
//侯爵
label.setLocation(0,this.getSize().height);
而(!IsToped)
{
if(label.getLocation().y<-label.getSize().height)
{
label.setLocation(0,this.getSize().height);
}
其他的
{
int x=0;
int y=label.getLocation().y-1;
标签设置位置(x,y);
}
尝试{Thread.sleep(30);}catch(Exception exc){}
}
}
公共无效StopMarque()
{
IsStoped=true;
}
}
如果您需要新行,请小心,您可以使用tag的


仅水平,但也可能适用于垂直)

不,不要在Swing代码中使用Thread.sleep(int),因为块EDT,此代码是错误的,因为javax.Swing就是这样。Timer@mKorbel此代码在单独的线程上执行,因此不会阻止EDT。不过,建议使用Swing计时器仍然是更好的解决方案,因为代码将在EDT上执行,这是您希望的,因为标签位置正在更改。@camickr我知道这一点,但我记得我有一个问题(old.forums.sun)关于如何使用JButton抖动,结果是。。。因为它可以正确地使用Thread.sleep(int)而不是实现
javax.swing.Timer
,因为它只能正确地用于EDT上的一个JComponent,如果有两个或多个JComponent,那么GUI简单冻结