【问题标题】:Adding moving text to JLabel将移动文本添加到 JLabel
【发布时间】:2014-09-08 13:56:51
【问题描述】:

我愿意添加一个移动的文字和图片(从一侧到另一侧并在它走出“窗口”后重复循环)。

目前我正在使用这种结构在我的应用程序中显示菜单:

try
{
    repaint = ImageIO.read(new File(ReturnPageName(0)));
}catch (IOException e) {
}
image = new ImageIcon(repaint.getScaledInstance(sizeX,sizeY, Image.SCALE_SMOOTH));
imageLabel.setIcon(image);
revalidate();
repaint();

JLabelJFrame 中设置了这样的参数:

    imageLabel = new JLabel();
    imageLabel.setIcon(image);
    imageLabel.setVisible(true);
    add(imageLabel);
    setUndecorated(true);
    setVisible(true);
    setSize(sizeX, sizeY);

我想在显示的菜单图片中添加如上所述的移动文本/图片。我怎样才能轻松做到?尝试使用扩展可运行的新类,但没有成功。

编辑:

我做过类似的事情,

绘图菜单:

public void drawPageZero()
{
    repaint.setData(repaint0.getData());
    Graphics g = repaint.createGraphics();
    g.setFont(font);
    g.setColor(black);
    FontMetrics fm = g.getFontMetrics();
    if (xN < - fm.stringWidth(text))
    {
        xN = 2 * fm.stringWidth(text);
    }
    if (xN < 0 && xN >= -fm.stringWidth(text))
    {
        xN2 = xN + fm.stringWidth(text);
        xN3 = xN + 2 *fm.stringWidth(text);
    }
    else if (xN <= 2*fm.stringWidth(text) && xN >= fm.stringWidth(text))
    {
        xN2 = xN - 2*fm.stringWidth(text);
        xN3 = xN - fm.stringWidth(text);
    }
    else if (xN >= 0 && xN < fm.stringWidth(text))
    {
        xN2 = xN + fm.stringWidth(text);
        xN3 = xN - fm.stringWidth(text);
    }
    g.drawString(text,xN,66);
    g.drawString(text,xN2,66);
    g.drawString(text,xN3,66);
    image = new ImageIcon(repaint.getScaledInstance(sizeX,sizeY, Image.SCALE_SMOOTH));
    imageLabel.setIcon(image);
    revalidate();
    repaint();
    timer = new Timer();
    timer.schedule(new infoBar(), 50);
}

计时器看起来像这样:

class infoBar extends TimerTask
{
    @Override
    public void run() {
        if (page ==0) {
            xN -= 1;
            timer.cancel();
            timer.purge();
            drawPageZero();
        }
        else
        {
            timer.cancel();
            timer.purge();
        }

    }
}

现在的问题是,看着移动的文字会很痛。可能是刷新太慢了,可能是repaint.setData(repaint0.getData());操作造成的。有没有简单快捷的方法将图像从一个BufferedImage 粘贴到另一个?在此之前,我每个周期都在加载图片,但速度也很慢。

【问题讨论】:

  • 最简单的实现方法是在您的 JLabel 集上使用 JScrollPane 以从不显示任一滚动条。然后构造一个javax.swing.Timer,在对应的action中调整JScrollPane的滚动条。
  • 据我所知。我将创建一个具有所需内容的 JScrollPane 并将其添加到代码的第一部分(在 revalidate() 之前)。然后我将添加一个 Timer 来触发滑动条?
  • 是的,你已经掌握了要点。如果遇到问题,请在此处尝试并更新您的代码
  • 遇到了另一个问题:P 当我尝试将 JScrollPane 添加到 JLabel 时,但只显示加载到 JLabel 的图片。当我将 JSP 添加到 JFrame 时,只显示了 JSP 的图片。我怎样才能获取由 JLabel 图片制作的背景的 JSP 内容?
  • 好吧,我觉得我很愚蠢......为什么我没有想到只是将字符串添加到图片中,这些参数将通过计时器更改并重新验证?有时我智障._.'

标签: java swing text jframe jlabel


【解决方案1】:

使用javax.swing.Timer 来安排周期性事件,并从线程执行动画更改,由该计时器触发。正如@ControlAltDel 所指出的,JScrollPane 可能是一个很好的类来实现移动文本。

【讨论】:

  • 教程是一个很好的起点;一个相关的例子显示在here
【解决方案2】:

试试这个,创建一个新的 Java 类并粘贴这段代码:

Image link

import java.util.Timer;
import java.util.TimerTask;

public class TextoDesplazable extends javax.swing.JFrame {

    Timer timer = new Timer();
    int x, y, limite;

    public TextoDesplazable() {
        initComponents();
        this.setLocationRelativeTo(null);
        x = jLabel1.getX();
        y = jLabel1.getY();
        limite = -jLabel1.getWidth();
        System.out.println("X: " + x);

        timer.schedule(task, 0, 5);
    }

    TimerTask task = new TimerTask() {
        @Override
        public void run() {
            if (x < limite) {
                x = TextoDesplazable.this.getWidth();
            }
            jLabel1.setLocation(x--, y);
        }
    };
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jLabel1.setFont(new java.awt.Font("Dialog", 1, 36)); // NOI18N
        jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel1.setText("Hello");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel1)
                .addContainerGap(308, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        

    public static void main(String args[]) {

        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(TextoDesplazable.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }

        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new TextoDesplazable().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JLabel jLabel1;
    // End of variables declaration                   
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多