notsohard4get Skrevet 16. april 2013 Del Skrevet 16. april 2013 Hei Sitter å leker meg med JFrame og Graphics. Har laget en slags "kanon" som skyter ut "kuler" som går i skuddlinje. Men applikasjonen min gjør ting jeg ikke helt forstår: Den tegner bare kulen hvis teksten i programmet mitt blir oppdatert... ?? Jeg har sittet i timesvis nå og prøvd å forstå hvorfor dette skjer, men til ingen nytte. Kan noen forklare meg hvorfor denne "forkludringen" oppstår? På forhånd, takk Min kode: package line; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; public class Application implements KeyListener { private Window window; private Line line; private double angle = 45; public Application() { window = new Window("LineProject", this); line = new Line(window); line.setCoordinate(0,350); line.setAngle(angle); line.setLength(100); } public static void main(String[] args) { new Application(); } @Override public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_LEFT) { angle += 1; if (angle > 90) { angle = 90; } } else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { angle -= 1; if (angle < 0) { angle = 0; } } line.setAngle(angle); window.setLabelText("" + angle); if (e.getKeyCode() == KeyEvent.VK_SPACE) { Bullet bullet = new Bullet(window); bullet.setCoordinates(line.getX2()-10,line.getY2()-10); bullet.setSize(20,20); bullet.shoot(angle, 4); } } @Override public void keyReleased(KeyEvent arg0) { // TODO Auto-generated method stub } @Override public void keyTyped(KeyEvent arg0) { // TODO Auto-generated method stub } } package line; import java.awt.event.KeyListener; import javax.swing.JFrame; import javax.swing.JLabel; class Window extends JFrame { private JLabel label; public Window(String title, KeyListener keyListener) { super(title); addKeyListener(keyListener); setSize(400, 400); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); label = new JLabel(""); label.setVerticalAlignment(JLabel.TOP); label.setHorizontalAlignment(JLabel.LEFT); add(label); setVisible(true); } public void setLabelText(String text) { label.setText(text); repaint(); } } package line; import java.awt.Graphics; import javax.swing.JComponent; import javax.swing.JFrame; class Line extends JComponent { private int x1 = 0, y1 = 0, x2 = 0, y2 = 0; private Graphics graphics; private JFrame frame; private double angle = 0; private int length = 0; public Line(JFrame frame) { x1 = 0; y1 = 0; x2 = 0; y2 = 0; this.frame = frame; graphics = frame.getGraphics(); frame.add(this); paintComponent(graphics); } public void paintComponent(Graphics graphics) { graphics.drawLine(x1, y1, x2, y2); } public void remove() { frame.remove(this); frame.repaint(); } public void setLength(int length) { this.length = length; calculateCoordinate(); frame.repaint(); } public void setAngle(double angle) { this.angle = Math.toRadians(-angle); calculateCoordinate(); frame.repaint(); } public void setCoordinate(int x, int y) { this.x1 = x; this.y1 = y; calculateCoordinate(); } private void calculateCoordinate() { double newX = length * Math.cos(angle); double newY = length * Math.sin(angle); x2 = x1 + (int) newX; y2 = y1 + (int) newY; } public int getX2() { return x2; } public int getY2() { return y2; } } package line; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.Timer; public class Bullet extends JComponent implements ActionListener { private Graphics graphics; private int x, y, width, height; private JFrame frame; private Timer timer; private double angle; private int speed; public Bullet(JFrame frame) { this.frame = frame; graphics = frame.getGraphics(); frame.add(this); paintComponent(graphics); timer = new Timer(10, this); } public void paintComponent(Graphics graphics) { graphics.drawOval(x, y, width, height); } public void setCoordinates(int x, int y) { this.x = x; this.y = y; frame.repaint(); } public void setSize(int width, int height) { this.width = width; this.height = height; frame.repaint(); } public void shoot(double angle, int speed) { this.angle = Math.toRadians(angle); this.speed = speed; timer.start(); } public void actionPerformed(ActionEvent e) { double newX = x + (speed * Math.cos(-angle)); double newY = y + (speed * Math.sin(-angle)); setCoordinates((int) newX, (int) newY); if ((x < 0) || (y < 0) || (x > frame.getWidth()) || (y > frame.getHeight())) { timer.stop(); frame.remove(this); frame.repaint(); } timer.restart(); } } Lenke til kommentar
hjahre Skrevet 19. april 2013 Del Skrevet 19. april 2013 Har du sjekket Java APIet? Ser ut som det finnes en metode som heter JFrame.update . Har du prøvd denne? Hvis ikke kan du prøve med revalidate? Lenke til kommentar
LostOblivion Skrevet 20. april 2013 Del Skrevet 20. april 2013 Du kan sjekke ut hvordan jeg har gjort det i mitt lille "spill". Her har jeg brukt swing og Graphics. https://code.google.com/p/orbito/ Lenke til kommentar
notsohard4get Skrevet 1. mai 2013 Forfatter Del Skrevet 1. mai 2013 Hei igjen og takk for svar! Nå bruker jeg JLabel som container for alle mine komponenter (piler, sirkler ol). Når jeg forandrer noe kaller jeg repaint på JFrame'et, som da kaller paintComponent på alle komponentene som er lagt inn (tror jeg)... Ser ut til å virke som det skal, men usikker på hva som har vært feil tidligere... Du kan sjekke ut hvordan jeg har gjort det i mitt lille "spill". Her har jeg brukt swing og Graphics. https://code.google.com/p/orbito/ Stilig simulator Men hvor får jeg sett kildekoden til applikasjonen din? Lenke til kommentar
quantum Skrevet 2. mai 2013 Del Skrevet 2. mai 2013 Stilig simulator Men hvor får jeg sett kildekoden til applikasjonen din? https://code.google.com/p/orbito/source/checkout $ svn checkout http://orbito.googlecode.com/svn/trunk/ orbito-read-only Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå