[Java] Windowsize blijft onbekend

Pagina: 1
Acties:

  • SH4D3H
  • Registratie: Juni 2004
  • Laatst online: 04-10-2025
Ik ben na 'n tijd PHP'en, met 'n vleugje C++ zo nu en dan, aan de slag gegaan met Java.
En ja, daarvoor heb ik 'n boek gehaalt.

Ik ben enthousiast begonnen met leren over applets en zag dat je de width & height van de <applet> tag in de HTML pagina, de grootte van de applet zelf dus, kunt ophalen met getSize.
Alleen wil dat niet werken :(

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Get window size
        Dimension d = getSize( );
        // Width bigger than 0?
        if( d.width > 0 )
        {
            // Save width and set startup x-pos
            this.aDim[0] = d.width;
            this.aDim[2] = d.width / 2;
        }
        // Height bigger than 0?
        if( d.height > 0 )
        {
            // Save height and startup y-pos
            this.aDim[1] = d.height;
            this.aDim[3] = d.height / 2;
        }

Ja, aDim wordt gedefineerd:
code:
1
private int[] aDim = { -1, -1, 0, 0 };


De reden dat ik dit wil weten is om te bepalen waar op het veld iets is, en het volgens het boek ook moet kunnen!
Het probleem is dat zoeken niets heeft opgeleverd omdat ik het goed lijk te doen.
Ook de compiler geeft geen commentaar :?

En als iemand even snel wil melden hoe je 'n applet direct stopt, doe dat dan ook maar :)

  • Eelke Spaak
  • Registratie: Juni 2001
  • Laatst online: 30-04 10:48

Eelke Spaak

- Vlad -

Wat werkt er precies niet? Kan je anders eens even kijken wat er in die Dimension d komt te staan (een toString() of zo)?

TheStreme - Share anything with anyone


  • SH4D3H
  • Registratie: Juni 2004
  • Laatst online: 04-10-2025
Dat het niet werkt is af te leiden uit de startcoördinaten aDim[2] & aDim[3].
Die krijgen de beginwaarde 0 mee, maar d.width / 2; en d.height / 2 zouden ervoor moeten zorgen dat het plaatje precies in het midden begint.
Dat gebeurd dus niet, het plaatje start op 0,0 :?

  • SH4D3H
  • Registratie: Juni 2004
  • Laatst online: 04-10-2025
Edit // Een toString geeft -1 -1.
Ik snap niet dat het in mijn code niet werkt, en die van het boek wel :?
Erg vreemd, maar ik ga even verder zoeken :)

Verwijderd

SH4D3H schreef op zondag 07 augustus 2005 @ 13:22:
Edit // Een toString geeft -1 -1.
Ik snap niet dat het in mijn code niet werkt, en die van het boek wel :?
Erg vreemd, maar ik ga even verder zoeken :)
Misschien wel handig om even te vermelden waar de toString staat. Met de informatie en code die je nu hebt gepost is het erg lastig om er achter te komen waar het fout gaat, voor hetzelfde geldt doe je bij het tekenen iets fout :) Wellicht verstandig om wat meer informatie en code te posten?

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Ik meen me vaag te herinneren dat grafische controls pas afmetingen en tekencontexten krijgen op het moment dat ze ook echt op het scherm getekend worden. Voor die tijd is het onmogelijk om die informatie op te vragen.

Waarschijnlijk heb je die code in de constructor van je eigen form staan?
Probeer het in plaats daar van eens in je paint() event te zetten, goede kans dat het dan wel werkt.

  • Eelke Spaak
  • Registratie: Juni 2001
  • Laatst online: 30-04 10:48

Eelke Spaak

- Vlad -

MrBucket schreef op zondag 07 augustus 2005 @ 14:17:
Ik meen me vaag te herinneren dat grafische controls pas afmetingen en tekencontexten krijgen op het moment dat ze ook echt op het scherm getekend worden. Voor die tijd is het onmogelijk om die informatie op te vragen.

Waarschijnlijk heb je die code in de constructor van je eigen form staan?
Probeer het in plaats daar van eens in je paint() event te zetten, goede kans dat het dan wel werkt.
Nee, afmetingen worden bepaald tijdens het layoutten (wel pas na de constructor idd). Om dus te garanderen dat je components afmetingen hebben, zou je validate() of revalidate() moeten aanroepen.

TheStreme - Share anything with anyone


  • SH4D3H
  • Registratie: Juni 2004
  • Laatst online: 04-10-2025
De code is nog niet netjes, daar ben ik nu mee bezig.
Ik werk met iemand anders aan 'n simpel spelletje, en hij is niet erg in de wieg gelegd voor OOP geloof ik, dus ben ik daar maar mee begonnen.
De code:
code:
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.net.*;
           
           
public class Main extends Applet implements KeyListener
{
    gamewindow w = new gamewindow( );
    Label tekst;
    Image image2;         
              
    public void init( ) 
    {
        addKeyListener( this );
        requestFocus( );
                  
        image2 = getImage( getDocumentBase( ), "test.jpg" );
        //tekst = new Label(getCodeBase(), Label.LEFT);
        //add(tekst);
        
        // If window size is unknown, quit program
        if( ! this.w.gamewindow_dim_known( ) )
            return;
    }
    
    public void paint( Graphics g )
    {
        int[] aDim = this.w.gamewindow_get_pos( );
        g.drawImage( image2, aDim[0], aDim[1], this );
        int[] aTemp = this.w.gamewindow_get_size( );
        g.drawString( Integer.toString( aTemp[0] ) + " " + Integer.toString( aTemp[1] ), 15, 15 );
    }
              
    public void keyTyped( KeyEvent e ){}
               
    public void keyPressed( KeyEvent e )
    {
        switch( e.getKeyCode( ) )
        {
            case KeyEvent.VK_LEFT:
        this.w.gamewindow_set_pos( -10, 'x' );
        break;
            case KeyEvent.VK_RIGHT:
        this.w.gamewindow_set_pos( 10, 'x' );
        break;
            case KeyEvent.VK_UP:
        this.w.gamewindow_set_pos( -10, 'y' );
        break;
            case KeyEvent.VK_DOWN:
        this.w.gamewindow_set_pos( 10, 'y' );
        break;
        }
        repaint( );
    }
    
    public void keyReleased( KeyEvent e ){ }
}

class gamewindow extends Applet
{
    private int[] aDim = { -1, -1, 0, 0 };
    // [0] Window width
    // [1] Window height
    // [2] Current x-pos
    // [3] Current y-pos
    
    // Constuctor, inits window size and startup pos
    gamewindow( )
    {
        // Get window size
        Dimension d = getSize( );
        // Width bigger than 0?
        if( d.width > 0 )
        {
            // Save width and set startup x-pos
            this.aDim[0] = d.width;
            this.aDim[2] = d.width / 2;
        }
        // Height bigger than 0?
        if( d.height > 0 )
        {
            // Save height and startup y-pos
            this.aDim[1] = d.height;
            this.aDim[3] = d.height / 2;
        }
    }
    
    // Check if the size is known
    boolean gamewindow_dim_known( )
    {
        if( this.aDim[0] > 0 && this.aDim[1] > 0 )
            return true;
        else
            return false;
    }
    
    // Set new position
    void gamewindow_set_pos( int move, char axis )
    {
        // Move x
        if( axis == 'x' )
            // Runoff right
            if( this.aDim[2] + move > this.aDim[0] )
                this.aDim[2] = ( this.aDim[2] + move ) - this.aDim[0];
            // Runoff left
            if( this.aDim[2] + move < 0 )
                this.aDim[2] = this.aDim[0] - ( this.aDim[2] + move );
            // Move
            if( this.aDim[2] + move < this.aDim[0] && this.aDim[2] + move > 0 )
                this.aDim[2] += move;
        // Move y
        if( axis == 'y' )
            // Runoff bottom
            if( this.aDim[3] + move > this.aDim[1] )
                this.aDim[3] = ( this.aDim[3] + move ) - this.aDim[1];
            // Runoff top
            if( this.aDim[3] + move < 0 )
                this.aDim[3] = this.aDim[1] - ( this.aDim[3] + move );
            // Move
            if( this.aDim[3] + move < this.aDim[1] && this.aDim[3] + move > 0 )
                this.aDim[3] += move;        
    }
    
    // Get positions
    int[] gamewindow_get_pos( )
    {
        int[] aTemp = { this.aDim[2], this.aDim[3] };
        return aTemp;
    } 
    
    // Debug function
    int[] gamewindow_get_size( )
    {
        int[] aTemp = { this.aDim[0], this.aDim[1] };
        return aTemp;
    }
}


Geeft dus het spelletje en -1 -1 in de bovenhoek :(

[ Voor 4% gewijzigd door SH4D3H op 07-08-2005 15:01 ]


Verwijderd

Ik heb een heleboel aan te merken op deze code :) Ik zal echter alleen opmerken hoe je jouw probleem zou kunnen oplossen. Wat ik zou doen is het volgende, laat GameWindow geen Applet extenden. Je vraagt nu namelijk de afmetingen op van GameWindow en niet van Main. Geef in de constructor van GameWindow de Dimension van Main mee en ga daar wat met de afmetingen doen.

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
GameWindow(Dimension main) {

        // Width bigger than 0?
        if(main.width > 0 )  {
            
            // Save width and set startup x-pos
            this.aDim[0] = main.width;
            this.aDim[2] = main.width / 2;
        }

        // Height bigger than 0?
        if(main.height > 0 )  {
            
            // Save height and startup y-pos
            this.aDim[1] = main.height;
            this.aDim[3] = main.height / 2;
        }
    }
Je moet dan wel in de init() van Main het object aanmaken.
Java:
1
2
3
4
5
6
7
8
GameWindow w;

    public void init()  {

        w = new GameWindow(getSize());

       ...
    }

  • SH4D3H
  • Registratie: Juni 2004
  • Laatst online: 04-10-2025
Verwijderd schreef op zondag 07 augustus 2005 @ 15:24:
Ik heb een heleboel aan te merken op deze code :)
Ik zou het heel fijn vinden als je dat toch deed :)
Maar laat ik zeggen dat dit nog maar het begin is van mijn aanpassingen, omdat dit alles in dezelfde main class zat :r
Daarom ben ik begonnen met dit stukje uit de class te halen en 'n eigen class te geven, en ben ik ook bezig met 'n eigen class voor het karaktertje.

Edit // Kheb iig gezien dat ik { en } vergeten was bij die ifjes, die 2 grote met die andere erin :)

Edit 2 // Ik heb de code enigzins aangepast, maar het wil niet :(

Edit 3 // Nieuwe code

[ Voor 194% gewijzigd door SH4D3H op 07-08-2005 22:20 ]


  • SH4D3H
  • Registratie: Juni 2004
  • Laatst online: 04-10-2025
Om een of andere vage reden wilde deze lap tekst niet in de vorige post :?
Java:
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
// import libs
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.net.*;

// Main class, program runs from this class
public class Main extends Applet
{
    // Create serveral variables of self-made data-type
    protected Window win;
    protected Input in;
    protected Player tux;

    // Main method
    public void init( )
    {
        // Create objects in the previously defined variables
        win = new Window( getSize( ) );
        tux = new Player( win, getImage( getDocumentBase( ) , "test.jpg" ), win.getWidth( ) / 2, win.getHeight( ) / 2 );
        in = new Input( tux );
    }
    
    // Paint method
    public void paint( Graphics g )
    {
        // Draw image to canvas
        g.drawImage( tux.getImage(), tux.getXPos(), tux.getYPos(), this ); 
    }
}

// Window properties are held and managed by the Window class
class Window
{
    // Variables to save window width + height in
    private int width = -1, height = -1;

    // Constuctor
    Window( Dimension d )
    {
        // Window width bigger than 0?
        if( d.width > 0 )
            this.width = d.width;

        // Window height bigger than 0?
        if( d.height > 0 )
            this.height = d.height;
    }

    // Method that returns window width
    int getWidth( )
    {
        return this.width;
    }
    
    // Method that returns window height
    int getHeight( )
    {
        return this.height;
    }
}

// Input is handled by the Input class, eg. keypresses.
class Input implements KeyListener
{
    // Variables to store the keylistener and player in
    protected Player p;

    // Constuctor that takes the keylistener and playerobject as argument
    Input( Player p )
    {
        // Store Player object
                this.p = p;
                
                 // Init keyListener
                addKeyListener( this );
    }
        
    // keyTypep event
    public void keyTyped( KeyEvent e ) { }
    
    // keyReleased event
    public void keyReleased( KeyEvent e ) { }
    
    // KeyPress event
    public void keyPressed( KeyEvent e )
    {
                switch( e.getKeyCode( ) )
                {
                        case KeyEvent.VK_LEFT:
                this.p.setPos( -10, 'x' );
                break;
                        case KeyEvent.VK_RIGHT:
                this.p.setPos( 10, 'x' );
                break;
                        case KeyEvent.VK_UP:
                this.p.setPos( -10, 'y' );
                break;
                        case KeyEvent.VK_DOWN:
                this.p.setPos( 10, 'y' );
                break;
                }
                repaint( );
        }   
}

// Character class defines a standard character.
class Character
{
    // Variables to store character location in
    protected int x = 0, y = 0;

    // Variable to store window class object in
    protected Window w;

    // Method that returns characters x position
    int getXPos( )
    {
        return this.x;
    }
        
    // Method that returns characters x position
    int getYPos( )
    {
        return this.y;
    }

    // Method that sets new position
    void setPos( int move, char axis )
    {
        // Move x
            if( axis == 'x' )
            {
                    // Runoff right
                    if( this.x + move > w.getWidth( ) )
                        this.x = ( this.x + move ) - w.getWidth( );
                    // Runoff left
                    if( this.x + move < 0 )
                        this.x = w.getWidth( ) - ( this.x + move );
                    // Move
                    if( this.x + move < w.getWidth( ) && this.x + move > 0 )
                        this.x += move;
            }
            // Move y
            if( axis == 'y' )
            {
                    // Runoff bottom
                    if( this.y + move > w.getHeight( ) )
                        this.y = ( this.y + move ) - w.getHeight( );
                    // Runoff top
                    if( this.y + move < 0 )
                        this.y = w.getHeight( ) - ( this.y + move );
                    // Move
                    if( this.y + move < w.getHeight( ) && this.y + move > 0 )
                        this.y += move;
            }
    }   
}

// Player class defines the player character
class Player extends Character
{
    // Variables that stores the image used by the player class
    Image im;

    // Constructor that sets the given x and y and calls the loadWindow() method and loads the image
    Player( Window w, Image im, int x, int y )
    {
        // x bigger than 0?
        if( x > 0 )
            this.x = x;

        // y bigger than 0?
        if( y > 0 )
            this.y = y;

        // Load window
        this.w = w;

        // Load image
        this.im = im;
    }
    
    // Constructor that calls the loadWindow() method and loads the image, x and y both remain 0
    Player( Window w, Image im )
    {
        // Load window
        this.w = w;
    
        // Load image
        this.im = im;
    }

    // Methode that returns the image
    Image getImage( )
    {
        return this.im;
    }
}


code:
1
2
3
4
5
6
7
8
E:\JavaProjects\OOPTux\src\ooptux\Main.java:76: cannot find symbol
symbol  : method addKeyListener(Input)
location: class Input
                addKeyListener( this );
E:\JavaProjects\OOPTux\src\ooptux\Main.java:103: cannot find symbol
symbol  : method repaint()
location: class Input
                repaint( );

Ik weet echt niet hoe ik die listener en repaint aan moet pakken :?

Verwijderd

Deze fouten zou je toch echt zelf op moeten kunnen lossen. Voor deze ene keer vertel ik je wat de fouten betekenen. In de klasse Input kan je repaint() niet aanroepen, omdat die methode nou eenmaal niet bestaat! Je moet repaint() aanroepen op Main, die extend namelijk Applet. Om in de klasse Input addKeyListener() aan te roepen moet Input op de juiste manier KeyListener implementeren, door eerst java.awt.event te importeren.. Dan kan je wel addKeyListener() aanroepen :) Ik zou toch maar eens in de boeken duiken want dit zijn basic dingen, bovendien heeft het weinig te maken met je originele vraag.
Pagina: 1