JFrame и бегущая строка - Java
Формулировка задачи:
Вообщем есть код простой бегущей строки сделанной в JFrame, все работает, но только одно но, если запустить программу то самой строки не видно пока мы не развернем окошко во весь экран, только тогда она появляется. Хотелось бы знать причину и как это исправить.
package Thread;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class PrintMain extends Canvas implements Runnable{
int x = 300, y = 20, startX = x;
public static void main(String args[]){
final PrintMain tm = new PrintMain();
JFrame jr = new JFrame();
jr.setSize(600,200);
jr.setBackground(Color.gray);
jr.setLocationRelativeTo(null);
jr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jr.setVisible(true);
JButton b1 = new JButton("Старт");
b1.setLayout(null);
b1.setLocation(20, 10);
b1.setSize(100, 50);
b1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
tm.start();
}
});
jr.add(b1);
jr.add(tm);
}
public void start(){
Thread t = new Thread(this);
t.start();
}
public void paint(Graphics g){
g.drawString("Text", x, y);
}
public void run() {
while(true){
x = x + 1;
try{Thread.sleep(10);}catch(Exception e){}
if (x>=400){
x = startX;
}
repaint();
}
}
}Решение задачи: «JFrame и бегущая строка»
textual
Листинг программы
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class PrintMain extends JFrame implements Runnable {
private int x = 20;
private int y = 20;
private int startX = x;
private MyCanvas canvas;
private class MyCanvas extends JPanel {
public MyCanvas() {
setDoubleBuffered(true);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawString("Hello world", x, y);
}
}
public PrintMain() {
setSize(600, 200);
setBackground(Color.gray);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
canvas = new MyCanvas();
JButton b1 = new JButton("Старт");
b1.setLayout(null);
b1.setLocation(20, 10);
b1.setSize(100, 50);
b1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
start();
}
});
add(b1, BorderLayout.SOUTH);
add(canvas, BorderLayout.CENTER);
}
public static void main(String args[]) {
PrintMain pm = new PrintMain();
pm.setVisible(true);
}
public void start() {
Thread t = new Thread(this);
t.start();
}
public void run() {
while (true) {
x = x + 1;
try {
Thread.sleep(8);
} catch (Exception e) {
}
if (x >= canvas.getWidth() - 100) {
x = startX;
}
canvas.repaint();
}
}
}