JFrame und Insets. Ich kriegs einfach nicht hin.
-
Hallo.
Sitze schon seit längerer Zeit an meiner GraphicsEngine für ein kleines Java Spiel. Dabei erscheinen mir weise Ränder rechts und etwas grösere unten.
insx = inets.left | insy = insets.top | insr = insets.right | insb = insets.bottom
Wenn ich in insx und insy von setSize(..,..) abziehe, erscheint alles okay, meine gewünschte canvas größe habe ich aber nicht (in GraphicsEngine.start())
meine gewünschte canvas-gröse habe ich in WIDTH=640 und HEIGHT=480. (siehe reloadCanvas).Eigentlich sitze ich da schon seit Freitag dran und hab keinen blassen schimmer was das problem ist.
Screenshot mit Beschriftungen:
image (imageshack)Completter Code:
http://pastebin.com/zXGtf4UYpackage view; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.awt.image.BufferedImage; import java.util.Vector; import javax.swing.JFrame; @SuppressWarnings("serial") public class GraphicsEngine extends JFrame implements Runnable, KeyListener, MouseMotionListener, MouseListener { private static final String TITLE = "."; public static final int WIDTH = 640; public static final int HEIGHT = 480; static final Color clearcolor = Color.BLACK; static final int frameDelay = 100; // in ms private Thread thread; private long lastTime; protected float delta; private Graphics2D g2d; private BufferedImage canvas; protected int insx; protected int insy; protected int insr; protected int insb; public GraphicsEngine() { frameupdatelisteners = new Vector<FrameUpdateListener>(); mousemotionlisteners = new Vector<MouseMotionL>(); mouselisteners = new Vector<MouseL>(); keylisteners = new Vector<KeyL>(); } @Override public void run() { thread = Thread.currentThread(); reloadCanvas(); while (thread != null) { float diff = System.currentTimeMillis() - lastTime; if (diff > frameDelay) { delta = diff / 1000f; // ms -> s onUpdate(); g2d.setColor(clearcolor); //System.out.println("GE.run.canvas.width: "+canvas.getWidth() + "| .height: " + canvas.getHeight()); g2d.fillRect(0, 0, canvas.getWidth(), canvas.getHeight()); onRender(); repaint(); lastTime = System.currentTimeMillis(); } else { long sleeptime = (long) (frameDelay - diff); try { Thread.currentThread().sleep(sleeptime); } catch (Exception ex) { ex.printStackTrace(); System.out.println("Couldnt sleep!"); } } } System.out.println("Fin"); System.exit(0); } public void paint(Graphics g) { /////////////////////////////////////////////////////////// Fehler ist hier drin glaube ich. if (canvas == null) { System.out.println("view.GraphicsEngine.paint(..): Canvas is null!"); } else { // die nächste linie auszukommentieren und zu gucken ist lustig.... (1) //g.drawImage(canvas, insx+insr, insy+insb, insr+insx+WIDTH, insb+insy+HEIGHT, 0, 0, canvas.getWidth(), canvas.getHeight(), clearcolor, null); g.drawImage(canvas, insx, insy, insx+WIDTH, insy+HEIGHT, 0, 0, canvas.getWidth(), canvas.getHeight(), clearcolor, null); //g.drawImage(canvas, insx, insy, canvas.getWidth() + (insx), canvas.getHeight() + (insy), clearcolor, null); } } private synchronized void reloadCanvas() { // XXX lil horror canvas = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_4BYTE_ABGR); g2d = (Graphics2D) canvas.getGraphics(); } public void start() { //////////////////////////////////////////////////////////////// thread start setTitle(TITLE); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); pack(); insx = getInsets().left; insy = getInsets().top; insr = getInsets().right; insb = getInsets().bottom; setSize(WIDTH+insx+insr, HEIGHT+insy+insb); setVisible(true); reloadCanvas(); new Thread(this).start(); addMouseMotionListener(this); addMouseListener(this); addKeyListener(this); } /* public BufferedImage getCanvas() { return canvas; } public Graphics2D getG2D() { return g2d; } */ // CUSTOM Fs protected synchronized void onUpdate() { // to be overwritten } protected void onRender() { // stub. just for tests for (int i = 0; i < 1024; i++) { set((int) (getWidth() * Math.random()), (int) (getWidth() * Math.random()), Color.GRAY); } } // event spam public void mouseClicked(MouseEvent e) { for (MouseL l : mouselisteners) { l.mouseClicked(e.getX()+insx, e.getY()+insy); } } public void mouseDragged(MouseEvent e) { for (MouseMotionL l : mousemotionlisteners) { l.mouseDragged(e.getX()+insx, e.getY()+insy); } } public void keyTyped(KeyEvent e) { for (KeyL l : keylisteners) { l.keyTyped(e.getKeyChar()); } } public void keyPressed(KeyEvent e) { for (KeyL l : keylisteners) { l.keyPressed(e.getKeyCode()); } } public void set(int x, int y, Color color) { //x = x+=insx; //y = y+=insy; if (x<0 || x>=canvas.getWidth() || y<0 || y>=canvas.getHeight()) return; canvas.setRGB(x, y, color.getRGB()); } public Color get(int x, int y) { //x = x+=insx; //y = y+=insy; if (x<0 || x>=canvas.getWidth() || y<0 || y>=canvas.getHeight()) return clearcolor; try { return new Color(canvas.getRGB(x, y)); } catch (Exception ex) { return clearcolor; } } public void string(int x, int y, Color color, String text) { //x = x+=insx; //y = y+=insy; Color tmp = g2d.getColor(); g2d.setColor(color); g2d.drawString(text, x, y); g2d.setColor(tmp); } public int getWidth() { if (canvas == null) { System.out.println("canvas == null! w"); return 0; } return canvas.getWidth(); } public int getHeight() { if (canvas == null) { System.out.println("canvas == null! h"); return 0; } return canvas.getHeight(); } // weiterer code... (jetzt folgen A-Z pixmaps für meine eigenen Fonts...)
-
Maaaan, Leute.
Ihr habt ja ein wirklich tolles Java subforum...
Ich verwerfe mal diesen Thread, d.h. ich guck nicht mehr rein, frag mal woanders.
Aber echt alle achtung für das C++ forum.(Hoffe mal das war nicht zu offensiv. Ich weis ja, dass das hier ein C++ forum ist)
Gruß. Smiley.
-
Was erwartest du? Du wirfst ein Paint-Bild mit unleserlichen Beschriftungen + 200 Zeilen Müllcode rein und jemand anderes soll sich da die Mühe machen das auseinanderzupfriemeln?
Räum erstmal deinen Code auf, werf den Listener Mist raus, sorg dafür dass die paint() Methode vom Frame nicht überschrieben wird und kürz dann den Code auf das wesentliche dann nimmt sich vielleicht jemand die Zeit
-
Ne, ist ja das ich da schon sehr lange drauf sitze, und keinen blassen schimmer habe was da los ist. Da erkennt man einfach nichts.
ABER, ich habs einfach neu geschrieben, und ist gut jetzt. Funktioniert. Danke trotzdem für die Forumrichtlinien.