简体   繁体   English

我的Java小程序中有任何错误吗?

[英]Are there any errors in my java applet?

I'm currently in my High School Programming 1 class and am working on my final project. 我目前正在参加高中程序设计1课,目前正在完成我的最终项目。 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. 我们被允许创建我们想要的任何东西,我决定制作一个程序,其中有吉他琴颈的前12个品格,您可以单击品格中的弦,它会告诉您这是什么音符以及演奏什么音符听起来像。 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: http://imgur.com/N86wkkq 附加信息:-我的高中班级使用Expo Java文件作为applet-这是我运行applet时的样子: http : //imgur.com/N86wkkq

The problem is your if -cascade in mouseDown . 问题是您的if -cascade在mouseDown As you don't use else if , all if statements are evaluated, no matter which one actually yields true . 正如您不使用else if ,所有if语句都经过评估,无论哪一个实际产生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 . 这不是一个大问题,但是最后一个if包含else部分, 每次您不单击s6f12都会执行该s6f12

So sf will always be either 12 or 100. 因此, sf始终为12或100。

Solution: Use else if : 解决方案:在以下情况下使用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;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM