1

I'm currently in my High School Programming 1 class and am working on my final project. We were allowed to create anything we want and I decided to make a program where there is the first 12 frets of a guitar neck and you can click on a string in a fret and it will tell you what note it is as well as play what the note sounds like. I managed to get my program to tell me what note I picked on the first rectangle I set. I then duplicated that code a bunch and changed the values to make the rest of the frets. However, it is no longer telling me what note I'm pressing when I try to click on one. My program builds and executes fine with no errors so I'm not too sure what to do and I could really use a hand. Any and all replies are much appreciated!

import java.awt.*;
import java.applet.Applet;

public class Final extends Applet
{
    //s6f1 stands for string 6 fret 1
    int sf;
    Rectangle s6f1, s6f2, s6f3, s6f4, s6f5, s6f6, s6f7, s6f8, s6f9, s6f10, s6f11, s6f12;

    public static void main (String[] args)
    {

    }

    public void paint (Graphics g)
    {
        drawNeck(g);
        int x = 690;
        int y = 153;
        Expo.setColor(g,Expo.red);
        Expo.setFont(g,"Arial",Font.BOLD,28);

        switch (sf)
        {
                case 1 : 
            Expo.drawString(g,"F",x,y);
            break;
                case 2 : 
            Expo.drawString(g,"F#/Gb",x,y);
            break;
                case 3 : 
            Expo.drawString(g,"G",x,y);
            break;
                case 4 : 
            Expo.drawString(g,"G#/Ab",x,y);
            break;
                case 5 : 
            Expo.drawString(g,"A",x,y);
            break;
                case 6 : 
            Expo.drawString(g,"A#,Bb",x,y);
            break;
                case 7 : 
            Expo.drawString(g,"B",x,y);
            break;
                case 8 : 
            Expo.drawString(g,"C",x,y);
            break;
                case 9 : 
            Expo.drawString(g,"C#/Db",x,y);
            break;
                case 10 : 
            Expo.drawString(g,"D",x,y);
            break;
                case 11 : 
            Expo.drawString(g,"D#/Eb",x,y);
            break;
                case 12 : 
            Expo.drawString(g,"E",x,y);
            break;
        }


    }




    public void init()
    {
        int m = 50;
        int n = 10;
        //s stands for string, f stands for fret; ex: s6f1 means String 6 Fret 1
        s6f1  = new Rectangle (50,198,m,n);
        s6f2  = new Rectangle (101,198,m,n);
        s6f3  = new Rectangle (151,198,m,n);
        s6f4  = new Rectangle (201,198,m,n);
        s6f5  = new Rectangle (251,198,m,n);
        s6f6  = new Rectangle (301,198,m,n);
        s6f7  = new Rectangle (351,198,m,n);
        s6f8  = new Rectangle (401,198,m,n);
        s6f9  = new Rectangle (451,198,m,n);
        s6f10 = new Rectangle (501,198,m,n);
        s6f11 = new Rectangle (551,198,m,n);
        s6f12 = new Rectangle (601,198,m,n);
        sf = 0;
    }


    public boolean mouseDown(Event e, int x, int y)
    {
        if(s6f1.inside(x,y))
            sf = 1;
        if(s6f2.inside(x,y))
            sf = 2;
        if(s6f3.inside(x,y))
            sf = 3;
        if(s6f4.inside(x,y))
            sf = 4;
        if(s6f5.inside(x,y))
            sf = 5;
        if(s6f6.inside(x,y))
            sf = 6;
        if(s6f7.inside(x,y))
            sf = 7;
        if(s6f8.inside(x,y))
            sf = 8;
        if(s6f9.inside(x,y))
            sf = 9;
        if(s6f10.inside(x,y))
            sf = 10;
        if(s6f11.inside(x,y))
            sf = 11;
        if(s6f12.inside(x,y))
            sf = 12;
        else
            sf = 100;
        repaint();
        return true;
    }

    public static void drawNeck (Graphics g)
    {
        int a = 50;
        int b = 225;
        int c = 650;
        //The Background
        Expo.setColor(g,Expo.black);
        Expo.fillRectangle(g,0,0,1000,650);
        Expo.setColor(g,Expo.lightPink);
        Expo.fillRectangle(g,10,10,990,640);
        //The neck
        Expo.setColor(g,Expo.brown);
        Expo.fillRectangle(g,50,50,650,225);
        //The frets
        Expo.setColor(g,Expo.black);
        Expo.drawLine(g,100,a,100,b);
        Expo.drawLine(g,150,a,150,b);
        Expo.drawLine(g,200,a,200,b);
        Expo.drawLine(g,250,a,250,b);
        Expo.drawLine(g,300,a,300,b);
        Expo.drawLine(g,350,a,350,b);
        Expo.drawLine(g,400,a,400,b);
        Expo.drawLine(g,450,a,450,b);
        Expo.drawLine(g,500,a,500,b);
        Expo.drawLine(g,550,a,550,b);
        Expo.drawLine(g,600,a,600,b);
        Expo.drawLine(g,650,a,650,b);
        //The Inlays
        Expo.setColor(g,Expo.white);
        Expo.fillCircle(g,175,137,10);
        Expo.fillCircle(g,275,137,10);
        Expo.fillCircle(g,375,137,10);
        Expo.fillCircle(g,475,137,10);
        Expo.fillCircle(g,625,112,10);
        Expo.fillCircle(g,625,163,10);  
        //The Strings
        Expo.setColor(g,Expo.grey);
        Expo.fillRectangle(g,a,73,c,77);
        Expo.fillRectangle(g,a,98,c,102);
        Expo.fillRectangle(g,a,123,c,127);
        Expo.fillRectangle(g,a,148,c,152);
        Expo.fillRectangle(g,a,173,c,177);
        Expo.fillRectangle(g,a,198,c,202);
        //String names and Fret numbers
        Expo.setColor(g,Expo.blue);
        Expo.setFont(g,"Arial",Font.BOLD,14);
        Expo.drawString(g,"E",20,210);
        Expo.drawString(g,"A",20,180);
        Expo.drawString(g,"D",20,155);
        Expo.drawString(g,"G",20,130);
        Expo.drawString(g,"B",20,105);
        Expo.drawString(g,"e",20,75);
        Expo.drawString(g,"Note:",680,120);
        Expo.setFont(g,"Arial",Font.ITALIC,24);
        Expo.drawString(g,"Created by Mitchell",640,635);
        //The User-interface
            //The Chords area
            int t = 150;
        Expo.setFont(g,"Arial",Font.BOLD,28);
        Expo.drawString(g,"Chords:",800,50);
        Expo.setColor(g,Expo.lightBlue);
        Expo.fillRectangle(g,700+t,80,740+t,120);
        Expo.fillRectangle(g,750+t,80,790+t,120);
        Expo.fillRectangle(g,700+t,130,740+t,170);
        Expo.fillRectangle(g,750+t,130,790+t,170);
        Expo.fillRectangle(g,700+t,180,740+t,220);
        Expo.fillRectangle(g,750+t,180,790+t,220);
            //The note area
        Expo.fillRectangle(g,680,123,745,163);

    }

}

Additional info: -My High School class uses the Expo java file for applets -This is what my applet looks like when I run it: https://i.stack.imgur.com/V4KE8.jpg

Andrew Thompson
  • 168,117
  • 40
  • 217
  • 433
  • Think about using a hashmap mapping the fret number `sf`to the notes. – TobiMcNamobi May 18 '15 at 21:29
  • 1) Since 'applet' seems to be due to the teacher specifying it, please refer them to [Why CS teachers should **stop** teaching Java applets](http://programmers.blogoverflow.com/2013/05/why-cs-teachers-should-stop-teaching-java-applets/). 2) Why use AWT? See [this answer](http://stackoverflow.com/questions/6255106/java-gui-listeners-without-awt/6255978#6255978) for many good reasons to abandon AWT using components in favor of Swing. .. – Andrew Thompson May 19 '15 at 05:24
  • .. 3) Please learn common Java nomenclature (naming conventions - e.g. `EachWordUpperCaseClass`, `firstWordLowerCaseMethod()`, `firstWordLowerCaseAttribute` unless it is an `UPPER_CASE_CONSTANT`) and use it consistently. 4) A single blank line of white space in source code is all that is *ever* needed. Blank lines after `{` or before `}` are also typically redundant. 5) Use a logical and consistent form of indenting code lines and blocks. The indentation is intended to make the flow of the code easier to follow! 6) *"..class uses the Expo java file.."* What is that? Link to it. .. – Andrew Thompson May 19 '15 at 05:28
  • .. 7) `public static void main (String[] args) { }` An applet would usually not have a `main` method, and that one is doing nothing at all. – Andrew Thompson May 19 '15 at 05:29

1 Answers1

1

The problem is your if-cascade in mouseDown. As you don't use else if, all if statements are evaluated, no matter which one actually yields true. Not a big problem, but the last if has an else part, that will be executed every time you don't click in s6f12.

So sf will always be either 12 or 100.

Solution: Use else if:

if (s6f1.inside(x,y)) sf = 1;
else if (s6f2.inside(x,y)) sf = 2;
else if (s6f3.inside(x,y)) ...
...
else sf = 100;
isnot2bad
  • 24,105
  • 2
  • 29
  • 50