Hallo,
nach vielen gescheiterten Versuchen bitte ich euch, mir bei der Implementierung eines kleinen Tickers behilflich zu sein. Folgenden Beispielcode habe ich im Internet als Grundlage gefunden.
Dieser Code muss nun so modifiziert werden, dass es als Thread laufen kann. Deshalb dachte ich mir, zunächst die Erweiterung der Klasse MyMarquee als JPanel aufzuheben und als Zeichenbereich später in meiner Main-Methode über setPanel() zuzuweisen. Aber daran scheitert es auch schon. Meine TestTicker Klasse sieht nun so aus:
Könnt ihr mir sagen, was ich übersehen oder hier falsch gemacht habe?
nach vielen gescheiterten Versuchen bitte ich euch, mir bei der Implementierung eines kleinen Tickers behilflich zu sein. Folgenden Beispielcode habe ich im Internet als Grundlage gefunden.
Code:
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
/**
* This class is not Thread safe; make calls on the UI Thread
* using SwingUtilities.invokeXXX() calls.
*/
public class MyMarquee extends JPanel implements ActionListener {
private Timer tick;
private int offset;
private String text = null;
private int decrement;
private int textWidth = 0;
private int textHeight = 0;
private Font font;
/**
* @param delay time between ticks
* @param decrement how much the offset changes at each tick
*/
public MyMarquee(int delay, int decrement) {
if ((delay < 0) || (decrement < 0)) {
throw new IllegalArgumentException();
}
this.decrement = decrement;
tick = new Timer(delay, this);
tick.start();
font = new Font("Dialog", Font.BOLD, 20);
}
public void actionPerformed(ActionEvent event) {
if (offset < (-1 * textWidth)) {
offset = getWidth();
} else {
offset -= decrement;
}
repaint();
}
public void paint(Graphics g) {
super.paint(g);
if (text != null) {
g.setFont(font);
textWidth =
g.getFontMetrics().charsWidth(
text.toCharArray(),
0,
text.length());
textHeight = g.getFontMetrics().getHeight();
g.drawString(text, offset, textHeight);
} else {
textWidth = 0;
textHeight = 0;
}
}
public String getText() { return text; }
public void setText(final String string) { text = string; }
public static void main(String[] args) {
MyMarquee marquee = new MyMarquee(100, 5);
marquee.setText("Hello, World!");
JFrame frame = new JFrame();
frame.setSize(300, 300);
frame.setContentPane(marquee);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.show();
}
}
Dieser Code muss nun so modifiziert werden, dass es als Thread laufen kann. Deshalb dachte ich mir, zunächst die Erweiterung der Klasse MyMarquee als JPanel aufzuheben und als Zeichenbereich später in meiner Main-Methode über setPanel() zuzuweisen. Aber daran scheitert es auch schon. Meine TestTicker Klasse sieht nun so aus:
Code:
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JPanel;
import javax.swing.Timer;
/**
* This class is not Thread safe; make calls on the UI Thread
* using SwingUtilities.invokeXXX() calls.
*/
public class Ticker /*extends JPanel*/ implements ActionListener {
private static final long serialVersionUID = -5470650929609724739L;
private Timer tick;
private int offset;
private String text = null;
private int textWidth = 0;
private int textHeight = 0;
private Font font= new Font("Dialog", Font.BOLD, 20);
private int delay = 100;
private int decrement = 5;
private JPanel pane;
/**
* @param delay time between ticks
* @param decrement how much the offset changes at each tick
*/
public Ticker() {
tick = new Timer(delay, this);
tick.start();
}
public Ticker(JPanel p) {
setPanel(p);
tick = new Timer(delay, this);
tick.start();
}
public void actionPerformed(ActionEvent event) {
if (offset < (-1 * textWidth)) {
offset = pane.getWidth();
} else {
offset -= decrement;
}
pane.repaint();
}
public void paint(Graphics g) {
pane.paint(g);
if (text != null) {
g.setFont(font);
textWidth =
g.getFontMetrics().charsWidth(
text.toCharArray(),
0,
text.length());
textHeight = g.getFontMetrics().getHeight();
g.drawString(text, offset, textHeight);
} else {
textWidth = 0;
textHeight = 0;
}
}
public String getText() { return text; }
public void setText(final String string) { text = string; }
public void setPanel(JPanel p) { pane= p; }
}
Code:
public class TickerTest {
public static void main(String[] args) {
JFrame frame = new JFrame();
JPanel pane = new JPanel();
Ticker ticker = new Ticker();
ticker.setText("Hello, World!");
ticker.setPanel(pane);
frame.setContentPane(pane);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(250, 250);
frame.pack();
frame.setVisible(true);
}
Könnt ihr mir sagen, was ich übersehen oder hier falsch gemacht habe?