Zu halten, wie ein Verfahren läuft kontinuierlich im hintergrund, bis das Programm beendet wird?
Will ich wissen, wie zu halten, eine Methode, die im hintergrund laufen. dh. diese Methode beginnt, wenn das Programm startet und hält die Ausführung seiner Anweisungen, bis das Programm geschlossen ist.
Für die ex. können sagen, ich habe eine Methode, die "Schwerkraft" ()", die kontinuierlich dekrementiert einen bestimmten Wert, während das Programm ausgeführt wird.
Jetzt versuchen dies aus im mit Sie das folgende Programm, wobei im Versuch, ziehen Sie den Herzog nach unten (Schwerkraft), wenn keine Tasten gedrückt werden. ist aber nicht passiert.
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.*;
import java.util.HashMap;
import java.util.Map;
import javax.imageio.ImageIO;
import javax.swing.*;
public class MoveIcon extends JPanel {
private static final long serialVersionUID = 1L;
private static final String IMAGE_PATH = "http://duke.kenai.com/misc/Bullfight.jpg";
private static final String IMAGE_PATH_PLAYER = "http://duke.kenai.com/iconSized/duke4.gif";
public static final int STEP = 3;
private static final int TIMER_DELAY = STEP * 8;
private BufferedImage bkgrndImage = null;
private BufferedImage playerImage = null;
private Map<Direction, Boolean> directionMap = new HashMap<Direction, Boolean>();
private int playerX = 0;
private int playerY = 0;
enum Direction {
UP(KeyEvent.VK_UP, 0, -1), DOWN(KeyEvent.VK_DOWN, 0, 1),
LEFT(KeyEvent.VK_LEFT, -1, 0), RIGHT(KeyEvent.VK_RIGHT, 1, 0);
private int keyCode;
private int xDirection;
private int yDirection;
private Direction(int keyCode, int xDirection, int yDirection) {
this.keyCode = keyCode;
this.xDirection = xDirection;
this.yDirection = yDirection;
}
public int getKeyCode() {
return keyCode;
}
public int getXDirection() {
return xDirection;
}
public int getYDirection() {
return yDirection;
}
}
public MoveIcon() {
try {
URL bkgrdImageURL = new URL(IMAGE_PATH);
URL playerImageURL = new URL(IMAGE_PATH_PLAYER);
bkgrndImage = ImageIO.read(bkgrdImageURL);
playerImage = ImageIO.read(playerImageURL);
setPreferredSize(new Dimension(bkgrndImage.getWidth(), bkgrndImage.getHeight()));
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
for (Direction direction : Direction.values()) {
directionMap.put(direction, false);
}
setKeyBindings();
Timer timer = new Timer(TIMER_DELAY, new TimerListener());
timer.start();
}
private void setKeyBindings() {
InputMap inMap = getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
ActionMap actMap = getActionMap();
for (final Direction direction : Direction.values()) {
KeyStroke pressed = KeyStroke.getKeyStroke(direction.getKeyCode(), 0, false);
KeyStroke released = KeyStroke.getKeyStroke(direction.getKeyCode(), 0, true);
inMap.put(pressed, direction.toString() + "pressed");
inMap.put(released, direction.toString() + "released");
actMap.put(direction.toString() + "pressed", new AbstractAction() {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
directionMap.put(direction, true);
}
});
actMap.put(direction.toString() + "released", new AbstractAction() {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
directionMap.put(direction, false);
}
});
}
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (bkgrndImage != null) {
g.drawImage(bkgrndImage, 0, 0, null);
}
if (playerImage != null) {
g.drawImage(playerImage, playerX, playerY, null);
}
}
private class TimerListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
boolean moved = false;
for (Direction direction : Direction.values()) {
if (directionMap.get(direction)) {
playerX += STEP * direction.getXDirection();
playerY += STEP * direction.getYDirection();
moved = true;
}
}
if (moved) {
int x = playerX - 2 * STEP;
int y = playerY - 2 * STEP;
int w = playerImage.getWidth() + 4 * STEP;
int h = playerImage.getHeight() + 4 * STEP;
MoveIcon.this.repaint(x, y, w, h); //!! repaint just the player
}
}
}
private static void createAndShowUI() {
JFrame frame = new JFrame("MoveIcon");
frame.getContentPane().add(new MoveIcon());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
createAndShowUI();
}
});
}
}
Danke.
Ein thread, der kontinuierlich ausgeführt werden, die Methode
InformationsquelleAutor md1hunox | 2012-06-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der einfachste Weg, könnte man etwas wie dieses:
Bearbeiten
Hinzugefügt-Beispiel mit swing worker:
guter Punkt, ist korrigiert!
Danke, das ist genau das, was ich suchte.
Swing ist nicht thread-sicher. dies ist ein einfaches Beispiel, damit Ausnahmen kann nicht auftreten, sonst InterruptedExceptions werden oft geworfen. Es ist besser ein SwingWorker.
Lesen Sie diese (wie auf dem SwingWorker-Klasse java-doc): "Beim schreiben von multi-threaded-Anwendung mit Swing gibt es zwei Einschränkungen zu beachten: (bitte Wie zu Verwenden Threads für weitere details): zeitaufwändige Aufgaben sollten nicht ausgeführt werden, auf dem Event Dispatch Thread. Andernfalls wird die Anwendung nicht mehr reagiert. Swing-Komponenten zugegriffen werden soll, die auf dem Event Dispatch Thread nur."
InformationsquelleAutor Francisco Spaeth
"SWING ist nicht thread-safe" wie Sie vielleicht gesehen haben, kann der Java-Docs.
Beste Weg ist die Verwendung eines SwingWorker-Klasse. Es stellt Funktionen für die Berechnung von Ergebnissen oder die Leistung der Aufgaben, die lange Ausführungszeiten.
InformationsquelleAutor vedant