在我的代码的try块中,setText()或setLocation()中的任何一个都可以单独运行,如下所述:
以下代码根据给定的睡眠以正确的方式移动标签(每次50 pxl):
.........
label.setLocation((label.getLocationOnScreen().x+50),0);
Thread.sleep(time[i]);
...............
以下代码根据给定的睡眠正确设置文本(“名称1”,“名称2”等):
...................
label.setText(name[i]);
Thread.sleep(time[i]);
....................
以下代码根据给定的睡眠正确设置文本(“名称1”,“名称2”等),但不移动JLabel:
....................
label.setText(name[i]);
label.setLocation((label.getLocationOnScreen().x+50),0);
Thread.sleep(time[i]);
....................
我需要他们两个。换句话说,在第一个动作中,它应该在第二个动作“名称2”中显示“名称1”,依此类推。
我是java和编程的新手。所以请帮助我获得所需的输出。感谢您的期待。
我的完整代码如下:
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
class Move {
JFrame frame = new JFrame();
JLabel label = new JLabel("Journey");
static int x=0;
public Move() {
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setSize(800,600);
frame.setLayout(new GridLayout());
frame.add(label);
label.setLocation(0, 0);
frame.setVisible(true);
doAll();
}
void doAll(){
Thread t = new Thread(new Runnable() {
@Override
public void run() {
try{
String[] name={"Name 1","Name 2","Name 3","Name 4","Name 5","Name 6","Name 7","Name 8","Name 9","Name 10"};
int time []={2000,1000,2000,1000,2000,1000,2000,1000,2000,1000};
for (int i=0; i<10; i++){
label.setText(name[i]);
label.setLocation((label.getLocationOnScreen().x+50),0);
Thread.sleep(time[i]);
}
}catch(Exception ae){
}
}
});
t.start();
}
public static void main(String[]args){
new Move();
}
}
答案 0 :(得分:2)
您可以在JPanel上绘制图像并移动图像,而不是尝试移动Swing组件。
这是我创建的GUI。
您必须通过调用SwingUtilities invokeLater方法启动Swing应用程序。此方法将所有Swing组件的创建和使用放在Event Dispatch thread (EDT)。
每当您尝试协调2个或更多数组时,都应考虑创建模型类。我创建了Leg类来保存名称和延迟。这样,我只需要在Journey类中创建一个List。
我从JPanel创建了一个DrawingPanel。始终在JPanel上创建GUI。切勿直接在JFrame上创建GUI。
在单独的Runnable,Thread或Swing Timer中运行动画。 GUI在自己的线程上运行,动画代码必须在不同的线程中运行,或阻止GUI更新。
由于动画在单独的线程中运行,因此绘图面板中Leg的设置将包含在SwingUtilities invokeLater方法中。这可确保绘图发生在Event Dispatch线程(EDT)上。
当我创建JFrame时,我向JFrame添加了一个WindowListener。这样我就能检测到窗口关闭,并在退出程序之前停止动画。
这是代码。
a: 010101
b: 001100
a^b: 011001
答案 1 :(得分:0)
问题看起来框架的LayoutManager正在为您设置标签的位置。
您需要做的是将布局设置为null:
frame.setLayout(null);
这将使框架不会尝试自行布局组件。
然后你可以做
label.setLocation((label.getLocationOnScreen().x+50),0);
然而,没有布局并不理想,但GridLayout
对你想要的东西也不是很好。
原因:GridLayout
将始终按您编写的顺序对组件进行排序&#34; container.add(component)
&#34;声明。您不能将组件放在特定的位置,除非之前为所有位置插入虚拟组件。
您可能想尝试GridBagLayout
..在GridBagLayout
中,您在关键事件中所做的一切就是更新动态面板的位置,它应显示在顶部该位置的固定面板。