首先要掌握一個概念:一個字符串在計算機屏幕中所占的像素,比方說取一個JLabel裡面的Text所占的寬和高,方法如下: (主要用到FontMetrics類)
import java.awt.FontMetrics;
import javax.swing.JLabel;
JLabel label = new JLabel("test Label ");
FontMetrics metrics = label.getFontMetrics(label.getFont());
int textH = metrics.getHeight(); //字符串的高,只和字體有關
int textW = metrics.stringWidth(label.getText()); //字符串的寬
通常情況下,一個空格占3個像素。
具體代碼如下:
Test.java
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Test {
private JFrame frame;
private String scrolledText;
private String str = "滾動文字 Demo";
/** *//**
* Launch the application
* @param args
*/
public static void main(String args[]) {
try {
Test window = new Test();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
/** *//**
* Create the application
*/
public Test() {
initialize();
}
/** *//**
* Initialize the contents of the frame
*/
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 500, 375);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JPanel panel = new JPanel();
panel.setBackground(Color.WHITE);
panel.setLayout(new BorderLayout());
frame.getContentPane().add(panel, BorderLayout.NORTH);
final JLabel label = new JLabel();
label.setText("New JLabel");
panel.add(label);
label_scrolledText(label);
// 當窗體變化時要重新對label的滾動文字進行設置
frame.addComponentListener(new ComponentAdapter() {
public void componentResized(ComponentEvent arg0) {
label_scrolledText(label);
}
});
}
/** *//**
* 滾動文字
* @param label
*/
public void label_scrolledText(JLabel label) {
this.scrolledText = this.str;
label.setText(scrolledText);
FontMetrics metrics = label.getFontMetrics(label.getFont());
int textW = metrics.stringWidth(label.getText());
Dimension frameSize = frame.getSize();
for (int i = 1; i <= (frameSize.width - textW) / 3 - 3; i++)
scrolledText += " ";
label.setText(scrolledText);
Thread thread = new Thread(new TextChanger(label));
thread.start();
}
}
TextChanger.java
import javax.swing.JLabel;
public class TextChanger implements Runnable {
private JLabel label;
public TextChanger(JLabel label) {
this.label = label;
}
public void run() {
try {
while (true) {
String text = label.getText();
if (text.length() > 1) {
text = text.substring(1, text.length()) + text.charAt(0);
label.setText(text);
label.repaint();
}
Thread.sleep(50);
}
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
最終的效果如圖所示: