Hi everyone. I wonder why the following code doesn't draw anything.

package AssProgLang;

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

public class AssOutput extends JPanel {
    public AssOutput(Queue translatedQueue) {        
        this.translatedQueue = translatedQueue;
        
        outputFrame = new JFrame();
        outputFrame.getContentPane().add(this);
        
        // outputPanel attributes
        outputFrame.setLocationRelativeTo(null);        
        outputFrame.setPreferredSize(new Dimension(640, 480));
        //this.setPreferredSize(new Dimension(640, 480));
        outputFrame.pack();
        outputFrame.setTitle("ASS™ Output Window");
        outputFrame.setResizable(false);
        outputFrame.setVisible(true);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        int functionNb, thingNb, attribNb;
        
        while(translatedQueue.peek() != null) {
            functionNb = (Integer)translatedQueue.poll();
            thingNb = (Integer)translatedQueue.poll();
            attribNb = (Integer)translatedQueue.poll();
            switch(functionNb) {
                case AssConsts.DISPLAY: // display
                    switch(thingNb) {
                        case AssConsts.DOT: // dot
                            switch(attribNb) {
                                case 0: color = Color.BLACK; break;
                                case 1: color = Color.BLUE; break;
                                case 2: color = Color.CYAN; break;
                                case 3: color = Color.DARK_GRAY; break;
                                case 4: color = Color.GRAY; break;
                                case 5: color = Color.GREEN; break;
                                case 6: color = Color.LIGHT_GRAY; break;
                                case 7: color = Color.MAGENTA; break;
                                case 8: color = Color.ORANGE; break;
                                case 9: color = Color.PINK; break;
                                case 10: color = Color.RED; break;
                                case 11: color = Color.WHITE; break;
                                case 12: color = Color.YELLOW; break;
                            } // end attribNb switch
                    } // end thingNb switch
                    g.setColor(color);            // <-- doesn't draw here
                    g.fillRect(xpos, ypos, 5, 5); // <-- doesn't draw here
                    break; // end display case

                case 2: // move
                    switch(thingNb) {
                        case 3: // cursor
                            switch(attribNb) {
                                case 16: xpos += 5; break;
                                case 17: xpos -= 5; break;
                                case 18: ypos -= 5; break;
                                case 19: ypos += 5; break;
                            }
                    } // end
                    break; // end move case
            } // end functionNb switch
        }
    }

    // field
    private JFrame outputFrame;
    private Color color = Color.BLACK;
    private int xpos = 0, ypos = 0;
    private Queue translatedQueue;    
}

Please help me. Thank you.

There is a display when the

g.setColor(color); // <-- doesn't draw here
g.fillRect(xpos, ypos, 5, 5); // <-- doesn't draw here

are placed outside the while loop

Recommended Answers

Check that the while loop is being executed by putting a print statement in it. Similarly use prints to confirm that the right cases are being executed in all those nested switches

Jump to Post

Are xpos and ypos set properly? - print those as well

Jump to Post

Did you actually print xpos & ypos immediately before the fillRect? - I notice that the code changes these values inside the while loop, so you can't assume they are correct in all places and at all times.

Jump to Post

All 10 Replies

Check that the while loop is being executed by putting a print statement in it. Similarly use prints to confirm that the right cases are being executed in all those nested switches

Yeah... Ive put tests i.e. System.out.println("Pass"); before and after the said lines and it does passes there. But I wonder why the g.fillRect() line is not working. Thanks for the reply.. Please help me more.

Are xpos and ypos set properly? - print those as well

Yes. Actually, as said, I copied and pasted the g.setColor(color); and g.fillRect(xpos, ypos, 5, 5); outside the while loop and it does display a filled rectangle. I tried pasting them just after the while() { line and it doesn't display anything... :( I don't know what's going on.

Did you actually print xpos & ypos immediately before the fillRect? - I notice that the code changes these values inside the while loop, so you can't assume they are correct in all places and at all times.

Yes I did.. It displays the desired xpos and ypos of the calling class.

OK. hmmm. only other thing i can think of is to print those 3 ints at the top of the while to see if they are funny in any way.. this isn't easy, is it?

Yeah i did. It was 0 because i had it initialized to 0. (xpos = 0, ypos = 0). When at runtime, case 2 is accessed, the xpos and ypos will be changed depending on the inner switch case. The ints are working normally as expected... :(

oh i get it. line 12 should be placed after line 21

I'm stuck. Based on the info you have given me I have no idea what could explain the symptoms you describe.
Let me summarise:
With those 2 lines (52,53) at that position you have print statements immediately before and after them that confirm (1) they are executed and (2) the x/ypos values are correct. Move the same 2 statements to after the while (is after line 69) and they do work.
I'm sorry, this is going to need a bigger brain than mine.
If/when you get the answer please post it here.
J

Be a part of the DaniWeb community

We're a friendly, industry-focused community of 1.20 million developers, IT pros, digital marketers, and technology enthusiasts learning and sharing knowledge.