2014-09-08 4 views
0

Я хочу добавить движущийся текст и изображения (с одной стороны на другую и после того, как он выходит из «окон», чтобы повторить цикл).Добавление движущегося текста в JLabel

В настоящее время я использую такую ​​конструкцию, чтобы отобразить меню в моем приложении:

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

Где JLabel устанавливается в JFrame с такими параметрами:

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

Я хочу добавить к отображаемому меню изображение движущегося текста/изображений, как указано выше. Как я могу это сделать? Пробовал работать с новым классом, но он не увенчался успехом.

EDIT:

Я сделал что-то вроде этого,

меню Рисунок:

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 в другое? До этого я загружал изображение каждый цикл, но он тоже был медленным.

+2

простой способ сделать это, чтобы использовать JScrollPane на вашем JLabel набор никогда не показывают ни скроллбар. Затем создайте javax.swing.Timer и настройте полосы прокрутки JScrollPane в соответствующем действии. – ControlAltDel

+0

Итак, из того, что я понял. Я создам JScrollPane с нужным содержимым и добавлю его в первую часть кода (до revalidate()). Затем я добавлю таймер, который приведет к сдвигу бара? –

+0

Да, у тебя есть суть. Попробуйте это и обновите свой код здесь, если у вас есть проблемы – ControlAltDel

ответ

1

Используйте javax.swing.Timer для планирования периодических событий и изменения анимации из потока, запускаемого этим таймером. Как отметил @ControlAltDel, JScrollPane может быть хорошим классом для поиска движущихся текстов.

+0

Учебное пособие - хорошая отправная точка; приведенный пример показан [здесь] (http://stackoverflow.com/a/3621417/230513). – trashgod

0

Попробуйте создать новый класс 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     
} 
Смежные вопросы