Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

19.04.2013, 23:35

[java] Anfänger fragen (Frame,draw... ect.)

Ich versuche mich grad mal in ersten Java 'gehversuchen'

Mein erster Schritt sollte werden, ein Fenster zu erstellen was soweit auch geklappt hat:
myWindow.java

Java-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package javaapplication6;

import java.awt.*;
//import java.awt.event.*;


public class myWindow extends Frame {
    public void myWindow(int width, int height, String title) {
        Frame W;
        W = new Frame(title);

        W.addWindowListener(
            new java.awt.event.WindowAdapter() {
                @Override
                public void windowClosing(java.awt.event.WindowEvent e) {
                    System.exit(0);
                } 
            } 
        );
        
    W.setSize(width,height);
    W.setVisible(true);
    } //end (SUB) myWindow
} //end class myWindow


Nun wollte ich etwas in dieses Fenster schreiben oder malen... irgendwas eben ;)
und versuchte das ganze mal so:

Java-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package javaapplication6;

import java.awt.*;
//import java.awt.event.*;


public class JavaApplication6 {

    public static void main(String[] args) {
  
        myWindow win;
        win = new myWindow();
        win.myWindow(640,480,"test");
       
        Graphics test ;
        test = win.getGraphics();
        
        if(test != null){
            test.drawString("test",10,10);
        
            win.paint(test);//??
        } //end if
        

    } //end main()
} //end class


Anfangs bekam ich eine NullPointerException für test, daher das if-konstrukt.
Aber das wird hier wohl das Problem sein...

Warum ist/bleibt test hier null?
Und wie sollte ich es richtig anstellen?

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

2

20.04.2013, 00:04

Soweit ich das noch recht in Erinnerung habe musst du die Funktion paint(Graphics g) vom Frame überschreiben, dann benutzt du einfach g.drawString("test", 10, 10)
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

3

20.04.2013, 01:09

ok, das hat mit googeln dann doch noch geklappt (mehr oder weniger)

myWindow.java

Java-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package javaapplication6;

import java.awt.*;
//import java.awt.event.*;


public class myWindow extends Frame {

    public void myWindow(int width, int height, String title) {
    setSize(width,height);
        setTitle(title);

        addWindowListener(
            new java.awt.event.WindowAdapter() {
                @Override
                public void windowClosing(java.awt.event.WindowEvent e) {
                    System.exit(0);
                } 
            } 
        );

    setVisible(true);
        
    } //end (SUB) myWindow
    
    @Override
    public void paint(Graphics g) {
        g.drawString("test", 0, 40);
    } //end (SUB) paint
    
} //end class myWindow


Anfangs dachte ich das würde nicht klappen (wegen meiner positionen 10,10) denn offensichtlich gelten hier nicht die positionen des drawfields (oder wie ich es nennen sol...) und die position 10,10 liegt im Rahmen des Fensters... gibts eine möglichkeit die richtige anfangsposition des Fensters zu ermitteln?

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

4

20.04.2013, 01:40

Das liegt darin, dass du auf das Fenster zeichnest.

Ist schon ewig her, dass ich mit Java gearbeitet habe, aber schau dir mal die Klasse Canvas aus dem awt-package an und packe die in das ContentPane vom Fenster.
Dann kannst du darauf zeichnen, genau wie mit dem normalen Window.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

5

20.04.2013, 07:26

Ein bisschen googlen und probieren haben mich nicht so wirklich weit gebracht...
zumal ich scheinbar keine guten Tutorials finde... viele sind sich ähnlich aber gehen kaum auf das eigentlich Problem ein

Ich habe nun mal folgendes:
javaapplication6.java

Java-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package javaapplication6;

public class JavaApplication6 {
    
    public static void main(String[] args) {
  
        myWindow win;
        win = new myWindow();
        win.myWindow(640,480,"test");
        
        win.buffer.drawString("das ist ein test",0,0);
        win.buffer.drawString("das ist ein test",20,100);
        win.buffer.drawRect(100,100,200,200);
        win.buffer.drawRect(0,0,90,90);
        win.buffer.drawRect(630, 470, 639, 479);
    }
}


myWindow.java

Java-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package javaapplication6;

import java.awt.*;
import javax.swing.*;

public class myWindow {
    JFrame Window;
    Image backbuffer;
    Graphics buffer;
        
    public void myWindow(int width, int height, String title) {
        Window = new JFrame();
        
        Window.setTitle(title);
        Window.setBounds(0,0,width,height);
        Window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Window.setContentPane(new myComponent());
        
    Window.setVisible(true);
        
        backbuffer = Window.createImage(width,height);
        buffer = backbuffer.getGraphics();
    }
    
    class myComponent extends JComponent {
        @Override
        public void paint(Graphics g) {
            g.drawImage(backbuffer, 0, 0, null);
        }
    }
}


Hier war die Idee, eine art backbuffer als Image zu nutzen wo ich dann von aussen zugreifen kann um dort was auch immer zu zeichnen.
Im groben funktioniert das sogar, nur das neue ContentPane konstrukt hier geht nur so halb... manchmal klappt es direkt, manchmal aber erst wenn ich das Fenster resize... auch scheint es noch immer probleme mit der Position zu geben die ich mir grad nicht ganz erklären kann...
desweiteren gibt es nach wie vor ein grössen problem.. ich erstelle ein Fram 640,480 in diesem Beispiel, aber das ist wirklich der Frame,
Ich möchte aber das innere 640,480 haben und der Frame soll sich entsprechend vergrössern...

vergleichbar wie bei der Winapi mit AdjustWindowRectEx

kann doch wirklich nicht so schwer sein...

finde Java wirklich unglaublich hm.. kompliziert

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

6

20.04.2013, 11:47

Wenn ich mich recht entsinne kannst du einen Frame an die Größe der darin liegenden Objekte anpassen.
Du kannst also die Größe von myComponent auf 640*480 setzen, und dann über irgendeine Funktion dafür sorgen, dass der Frame sich daran anpasst.
Wie gesagt, ist bei mir alles länger her, musst evtl. einfach mal googlen :)
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

7

20.04.2013, 11:57

Da das RootPane eines JFrames bereits initialisiert sein dürfte, musst du dieses auch nicht zuweisen. Du solltest keine Komponente lieber dem Frame hinzufügen.
Dann solltest du das Zeichnen auch tatsächlich in der dafür vorgesehenen Methode (paint(Graphics)) durchführen, unabhängig von Doublebuffering oder nicht.
Wie Nimelrian bereits gesagt hat, kannst du (wahrscheinlich mit pack()) die optimale Größe des Fensters berechnen lassen. Damit das ohne Probleme funktioniert, solltest du lieber PrefferedSize (setPrefferedSize()) verwenden.

Ich finde Java nicht kompliziert. Du bist hast bisher nur mit falschen Vermutungen entwickelt. Das ist das gleiche, wie wenn man die Steuerung im einen 3D-Programm als schlecht bezeichnen, nur weil man eine andere gewohnt ist. ;)

Aber ganz am Rande: Was hast du denn eigentlich vor?
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

8

20.04.2013, 14:12

Wieso denn eigentlich awt? Ist das nicht uralt?

Tobiking

1x Rätselkönig

  • Private Nachricht senden

9

20.04.2013, 15:53

Du solltest dir mal das Tutorial unter http://www.cokeandcode.com/info/tut2d.html angucken. Ich vermute bis zum Game Loop ist es genau das was du gerade versuchst. Und das geht viel einfacher als du es versuchst, weil Java2D bereits Funktionen für double buffering mitbringt.

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

10

20.04.2013, 19:35

Wieso denn eigentlich awt? Ist das nicht uralt?

Die Komponenten die er verwendet sind Swing-Komponenten (JFrame und JComponent).
Dich verwirrt vermutlich der Import von java.awt. Da Swing auf AWT aufbaut, gibt es diverse Dinge aus AWT, die genauso auch unter Swing Einsatz finden, wie möglicherweise diverse Konstanten. Daher könnte es sein, dass der Import notwendig ist.

Und wo ich gerade bei den Imports bin: verwende nach Möglichkeit lieber Imports für die Klassen, ohne Wildcards (den Stern) zu verwenden. Wenn du Eclipse verwendest, dann lässt es sich auch so einstellen, dass die Imports automatisch organisiert werden. ;)
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Werbeanzeige