JLabel 滚动文本
JLabel scrolling text
我需要通过获取每个字母并将其从一个 jlabel 移动到下一个来制作一段沿着页面滚动的文本。到目前为止,这是我的代码。它需要延迟,因为它太快了,但当字符串完成时它似乎崩溃了。任何帮助将不胜感激?
package Lab4;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
public class Scroll extends JFrame implements ActionListener {
final int scrollNumber = 10;
JTextField inputTextField = new JTextField(10);
JLabel[] output = new JLabel[scrollNumber];
JLabel text = new JLabel("Enter text and press Return",
SwingConstants.CENTER);
public Scroll() {
setLayout(new GridLayout(2, 1));
JPanel row1 = new JPanel(new GridLayout(1, 10));
output[0] = new JLabel();
output[1] = new JLabel();
output[2] = new JLabel();
output[3] = new JLabel();
output[4] = new JLabel();
output[5] = new JLabel();
output[6] = new JLabel();
output[7] = new JLabel();
output[8] = new JLabel();
output[9] = new JLabel();
row1.add(output[9]);
row1.add(output[8]);
row1.add(output[7]);
row1.add(output[6]);
row1.add(output[5]);
row1.add(output[4]);
row1.add(output[3]);
row1.add(output[2]);
row1.add(output[1]);
row1.add(output[0]);
add(row1);
JPanel row2 = new JPanel(new GridLayout(1, 2));
row2.add(text);
row2.add(inputTextField);
add(row2);
inputTextField.addActionListener(this);
}
public void shift() {
output[9].setText(output[8].getText());
output[8].setText(output[7].getText());
output[7].setText(output[6].getText());
output[6].setText(output[5].getText());
output[5].setText(output[4].getText());
output[4].setText(output[3].getText());
output[3].setText(output[2].getText());
output[2].setText(output[1].getText());
output[1].setText(output[0].getText());
}
public void run(String input) {
int length = input.length();
int i = 0;
while (true) {
if (output[0] != null) {
output[0].setText(input.substring(i, i + 1));
} else {
output[0].setText("");
}
i = i + 1;
System.out.println("0" + output[0].getText());
System.out.println("1" + output[1].getText());
System.out.println("2" + output[2].getText());
System.out.println("3" + output[3].getText());
System.out.println("4" + output[4].getText());
System.out.println("5" + output[5].getText());
System.out.println("6" + output[6].getText());
System.out.println("7" + output[7].getText());
System.out.println("8" + output[8].getText());
System.out.println("9" + output[9].getText());
shift();
}
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == inputTextField) {
String j = inputTextField.getText();
run("abcdef");
System.out.println(j);
}
}
}
所以首先。是的,您的应用程序崩溃了。从技术上讲,它是在 run
方法中调用 input.substring(i, i + 1)
时得到的 IndexOutOfBoundsException
。您在无限制的无限循环中递增 i
。因此它变得比您的字符串长度更高,结果 substring
然后抛出该异常。
因此,第一个修复是增加索引时的限制。
[...]
i = i + 1;
if(i > length - 1)
i = 0;
下一个修复应该是一个延迟。但这并不像听起来那么容易。您应该开始学习 Threads
如何在 Java 中工作,因为您需要开始一个。那是因为你永远不应该让你的主线程进入睡眠状态,否则你的 GUI 将变得不负责任。所以我会给你一个简单的解决方案,并提醒你学习线程是如何工作的。
因此,删除您的 run
方法并像这样更改您的 actionPerformed
方法:
public void actionPerformed(ActionEvent e) {
if (e.getSource() == inputTextField) {
String j = inputTextField.getText();
// run("abcdef");
new Thread(new Runnable(){
@Override
public void run() {
int length = j.length();
int i = 0;
while (true) {
if (output[0] != null) {
output[0].setText(j.substring(i, i + 1));
} else {
output[0].setText("");
}
i = i + 1;
if(i > length - 1)
i = 0;
try {
Thread.sleep(500); // your delay in ms
} catch (InterruptedException e) {
e.printStackTrace();
}
shift();
}
}
}).start();
}
}
我需要通过获取每个字母并将其从一个 jlabel 移动到下一个来制作一段沿着页面滚动的文本。到目前为止,这是我的代码。它需要延迟,因为它太快了,但当字符串完成时它似乎崩溃了。任何帮助将不胜感激?
package Lab4;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
public class Scroll extends JFrame implements ActionListener {
final int scrollNumber = 10;
JTextField inputTextField = new JTextField(10);
JLabel[] output = new JLabel[scrollNumber];
JLabel text = new JLabel("Enter text and press Return",
SwingConstants.CENTER);
public Scroll() {
setLayout(new GridLayout(2, 1));
JPanel row1 = new JPanel(new GridLayout(1, 10));
output[0] = new JLabel();
output[1] = new JLabel();
output[2] = new JLabel();
output[3] = new JLabel();
output[4] = new JLabel();
output[5] = new JLabel();
output[6] = new JLabel();
output[7] = new JLabel();
output[8] = new JLabel();
output[9] = new JLabel();
row1.add(output[9]);
row1.add(output[8]);
row1.add(output[7]);
row1.add(output[6]);
row1.add(output[5]);
row1.add(output[4]);
row1.add(output[3]);
row1.add(output[2]);
row1.add(output[1]);
row1.add(output[0]);
add(row1);
JPanel row2 = new JPanel(new GridLayout(1, 2));
row2.add(text);
row2.add(inputTextField);
add(row2);
inputTextField.addActionListener(this);
}
public void shift() {
output[9].setText(output[8].getText());
output[8].setText(output[7].getText());
output[7].setText(output[6].getText());
output[6].setText(output[5].getText());
output[5].setText(output[4].getText());
output[4].setText(output[3].getText());
output[3].setText(output[2].getText());
output[2].setText(output[1].getText());
output[1].setText(output[0].getText());
}
public void run(String input) {
int length = input.length();
int i = 0;
while (true) {
if (output[0] != null) {
output[0].setText(input.substring(i, i + 1));
} else {
output[0].setText("");
}
i = i + 1;
System.out.println("0" + output[0].getText());
System.out.println("1" + output[1].getText());
System.out.println("2" + output[2].getText());
System.out.println("3" + output[3].getText());
System.out.println("4" + output[4].getText());
System.out.println("5" + output[5].getText());
System.out.println("6" + output[6].getText());
System.out.println("7" + output[7].getText());
System.out.println("8" + output[8].getText());
System.out.println("9" + output[9].getText());
shift();
}
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == inputTextField) {
String j = inputTextField.getText();
run("abcdef");
System.out.println(j);
}
}
}
所以首先。是的,您的应用程序崩溃了。从技术上讲,它是在 run
方法中调用 input.substring(i, i + 1)
时得到的 IndexOutOfBoundsException
。您在无限制的无限循环中递增 i
。因此它变得比您的字符串长度更高,结果 substring
然后抛出该异常。
因此,第一个修复是增加索引时的限制。
[...]
i = i + 1;
if(i > length - 1)
i = 0;
下一个修复应该是一个延迟。但这并不像听起来那么容易。您应该开始学习 Threads
如何在 Java 中工作,因为您需要开始一个。那是因为你永远不应该让你的主线程进入睡眠状态,否则你的 GUI 将变得不负责任。所以我会给你一个简单的解决方案,并提醒你学习线程是如何工作的。
因此,删除您的 run
方法并像这样更改您的 actionPerformed
方法:
public void actionPerformed(ActionEvent e) {
if (e.getSource() == inputTextField) {
String j = inputTextField.getText();
// run("abcdef");
new Thread(new Runnable(){
@Override
public void run() {
int length = j.length();
int i = 0;
while (true) {
if (output[0] != null) {
output[0].setText(j.substring(i, i + 1));
} else {
output[0].setText("");
}
i = i + 1;
if(i > length - 1)
i = 0;
try {
Thread.sleep(500); // your delay in ms
} catch (InterruptedException e) {
e.printStackTrace();
}
shift();
}
}
}).start();
}
}