为什么要添加组件到JPanel,可以显示面板,但是当组件首先添加到框架中时,不能显示面板

问题描述 投票:-2回答:1

我想让用户一次选择要播放的歌曲以及渲染的移动乐谱。希望用户可以选择一首歌曲,然后单击“播放”按钮来启动它。因此,我想在JComboBox中放置一个JFrame,并且每次用户选择一首歌曲时,我都可以为移动乐谱渲染一个对应的JPanel。但是,当我将组合框和其他组件放入框架中时,无法显示面板。

下面列出了将这些组件放入面板的代码:

import java.awt.*;

import java.awt.event.*;
import javax.swing.*;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;

import java.io.*;
import sun.audio.*;
import java.io.IOException; 

class MyPanel extends JPanel{   
    public int x[] = new int[59]; 
    public int y[] = new int[59]; 
    public int width[] = new int[59];
    public int height = 20;
    Color color[] = new Color[59];//the color of each note

    String[] lyric = {"一", " 根", "紫~", "竹", "直~", "苗~", "苗,", "送", "給", "寶", "寶", "做", "管", "簫,",
                      "簫", "兒", "對", "準", "口,", "口", "兒", "對", "準", "簫,", 
                      "簫~", "中", "吹~", "出", "新~", "時~ ", "調,",
                      "小", "寶~", "寶,", "小", "寶~", "寶,", 
                      "咿", "底", "咿", "底", "學 ", "會", "了,", "啊 ~     ~    ~"};//共45個

    int[] numNotes = {1, 1, 2, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 
                      1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
                      2, 1, 2, 1, 2, 2, 1,
                      1, 2, 1, 1, 2, 1, 
                      1, 1, 1, 1, 1, 1, 1, 6};//共45個

    int[][] notes = {{5,2},{8,2},{6,1},{5,1},{3,2},{5,1},{2,1},{3,1},{2,1},{1,4},{6,1},{8,1},
                     {3,1},{5,1},{6,2},{3,2},{5,8},{8,1},{6,1},{3,1},{6,1},{5,4},{6,1},{8,1},
                     {3,1},{6,1},{5,4},{5,1},{6,1},{8,2},{6,1},{5,1},{3,2},{5,1},{2,1},{3,1},
                     {2,1},{1,4},{1,2},{1,1},{3,1},{2,4},{1,2},{1,1},{3,1},{2,4},{6,1},{8,1},
                     {6,1},{8,1},{9,2},{6,2},{5,3},{6,1},{2,1},{3,1},{5,1},{6,1},{5,8}};//共59個

    String[] simplifiedNote = {"| 5", "  1", " 6", "5", "3", "| 5", "2", "3", "2", "1  - ", "| 6", "1", 
                               "3", "5", "6", " 3", " 5  -  -  -", "| 1", "6", "3", "6", "5  - ", "| 6", "1", 
                               "3", "6", "5  -", "| 5", "6", "1", "6", "5", " 3", "| 5", "2", "3",
                               "2", "1   -", "| 1", "1", "3", "2   -", "| 1", "1", "3", "2  -", "| 6", "1", 
                               "6", "1", "2", "6", "| 5   .", "6", "2", "3", "5", "6", "| 5  -  -  - "};//共59個

    Color color0 = new Color(255,255,255); //白色 
    Color color1 = new Color(255,0,0); //紅色
    Color color2 = new Color(255,165,0); //橙色
    Color color3 = new Color(255,255,0); //黃色
    Color color4 = new Color(0,128,0); //綠色
    Color color5 = new Color(0,0,255); //藍色
    Color color6 = new Color(75,0,130); //靛色
    Color color7 = new Color(100,0,153); //紫色
    Color color8 = new Color(153,0,0); //暗紅
    Color color9 = new Color(0,0,0); //黑色

    public void display(){
        for (int i = 0;i < notes.length; i++) {
            //System.out.println("notes[" + i + "][0] = " + notes[i][0]);
            switch (notes[i][0]) {
                case 1:
                     y[i] = 400;
                     color[i] = color1;
                     break;
                case 2:
                     y[i] = 400 - 20;
                     color[i] = color2;
                     break;
                case 3:
                     y[i] = 400 - 20*2;
                     color[i] = color3;
                     break;
                case 4:
                     y[i] = 400 - 20*3;
                     color[i] = color4;
                     break;
                case 5:
                     y[i] = 400 - 20*4;
                     color[i] = color5;
                     break;
                case 6:
                     y[i] = 400 - 20*5;
                     color[i] = color6;
                     break;
                case 7:
                     y[i] = 400 - 20*6;
                     color[i] = color7;
                     break;
                case 8:
                     y[i] = 400 - 20*7;
                     color[i] = color1;
                     break;
                case 9:
                     y[i] = 400 - 20*8;
                     color[i] = color2;
            }

            switch (notes[i][1]) {
                case 1: width[i] = 20;     
                        break;
                case 2: width[i] = 20 * 2; 
                        break;
                case 3: width[i] = 20 * 3; 
                        break;
                case 4: width[i] = 20 * 4; 
                        break;
                case 5: width[i] = 20 * 5; 
                        break;
                case 6: width[i] = 20 * 6; 
                        break;
                case 7: width[i] = 20 * 7; 
                        break;
                case 8: width[i] = 20 * 8;
            }
        }

        x[0] = 100;
        for (int i = 1; i < notes.length; i++){
             x[i] = x[i-1] + width[i-1];
        }

        int timeLast = 0;
        //timeLast = total executing time
        while(timeLast < 900){ 
            for (int i = 0; i < notes.length; i ++){
                x[i]--;
            }
            this.repaint(); 
            try {Thread.sleep(155);}
            catch (InterruptedException e){
                e.printStackTrace();
            }
            timeLast = timeLast + 1; 
        }
    }

    public void paintComponent(Graphics g){
        super.paintComponent(g);    
        Graphics2D g2d = (Graphics2D)g;

        g2d.setFont(new Font("新細明體", Font.BOLD, 20));

        int y1 = 130; //C調 4/4 Y坐標
        int y2 = 180; //簡譜行Y坐標
        int y3 = 210; //歌詞行Y坐標
        int y4 = 163; //加高音點
        int y5 = 180; //加八分音符底線
        int y6 = 470; //色彩音符說明

        int chrPosition = 0;
        g2d.drawString("C調  4/4", 16, y1);

        //繪出最底下的色彩音符說明
        g2d.drawString("色彩音符說明:", 16, y6);

        g2d.setColor(color1);
        g2d.fillRoundRect(176, y6-16, 20,20, 3,3);
        g2d.setColor(color9);
        g2d.drawString(": Do", 200, y6);

        g2d.setColor(color2);
        g2d.fillRoundRect(256, y6-16, 20,20, 3,3);//220 + 56
        g2d.setColor(color9);
        g2d.drawString(": Re", 280, y6);

        g2d.setColor(color3);
        g2d.fillRoundRect(336, y6-16, 20,20, 3,3);//230 + 56
        g2d.setColor(color9);
        g2d.drawString(": Mi", 360, y6);

        g2d.setColor(color4);
        g2d.fillRoundRect(416, y6-16, 20,20, 3,3);//322 + 56
        g2d.setColor(color9);
        g2d.drawString(": Fa", 440, y6);//366 + 24

        g2d.setColor(color5);
        g2d.fillRoundRect(496, y6-16, 20,20, 3,3);//390 + 56
        g2d.setColor(color9);
        g2d.drawString(": So", 520, y6);//446 + 24

        g2d.setColor(color6);
        g2d.fillRoundRect(576, y6-16, 20,20, 3,3);//470 + 56
        g2d.setColor(color9);
        g2d.drawString(": La", 600, y6);

        //寫出簡譜
        for (int i = 0;i < simplifiedNote.length; i++){

            g2d.drawString(simplifiedNote[i], x[i], y2);
        }

        //在簡譜下方寫出歌詞
        g2d.setColor(color9);
        for (int i = 0;  i < lyric.length; i++){
            if (i != 0 && numNotes[i-1] == 2) {
                chrPosition = chrPosition + 1;
                g2d.drawString(lyric[i], x[chrPosition], y3);
            }
            else {
                g2d.drawString(lyric[i], x[chrPosition], y3);
            }
            chrPosition = chrPosition + 1;
        }

        //在簡譜上方加高音點
        g2d.setColor(color9);
        g2d.drawString(".", x[1]+14, y4);
        g2d.drawString(".", x[11]+2, y4);
        g2d.drawString(".", x[17]+11, y4);
        g2d.drawString(".", x[23]+2, y4);
        g2d.drawString(".", x[29]+2, y4);
        g2d.drawString(".", x[47]+2, y4);
        g2d.drawString(".", x[49]+2, y4);
        g2d.drawString(".", x[50]+2, y4);

        //在簡譜下方加八分音符底線
        g2d.setColor(color9);
        g2d.drawString("_", x[2]+4, y5);
        g2d.drawString("_", x[3], y5);
        g2d.drawString("_", x[5]+8, y5);
        g2d.drawString("_", x[6], y5);
        g2d.drawString("_", x[7], y5);//5
        g2d.drawString("_", x[8], y5);
        g2d.drawString("_", x[10]+8, y5);
        g2d.drawString("_", x[11], y5);
        g2d.drawString("_", x[12], y5);
        g2d.drawString("_", x[13], y5);//10
        g2d.drawString("_", x[17]+8, y5);
        g2d.drawString("_", x[18], y5);
        g2d.drawString("_", x[19], y5);
        g2d.drawString("_", x[20], y5);
        g2d.drawString("_", x[22]+8, y5);//15
        g2d.drawString("_", x[23], y5);
        g2d.drawString("_", x[24], y5);
        g2d.drawString("_", x[25], y5);
        g2d.drawString("_", x[27]+8, y5);
        g2d.drawString("_", x[28], y5);//20
        g2d.drawString("_", x[30], y5);
        g2d.drawString("_", x[31], y5);
        g2d.drawString("_", x[33]+8, y5);
        g2d.drawString("_", x[34], y5);
        g2d.drawString("_", x[35], y5);
        g2d.drawString("_", x[36], y5);//25
        g2d.drawString("_", x[39], y5);
        g2d.drawString("_", x[40], y5);
        g2d.drawString("_", x[43], y5);//1
        g2d.drawString("_", x[44], y5);//3
        g2d.drawString("_", x[46]+8, y5);//6
        g2d.drawString("_", x[47], y5);//1
        g2d.drawString("_", x[48], y5);//6
        g2d.drawString("_", x[49], y5);//1
        g2d.drawString("_", x[53], y5);//6
        g2d.drawString("_", x[54], y5);//2
        g2d.drawString("_", x[55], y5);//3
        g2d.drawString("_", x[56], y5);//5
        g2d.drawString("_", x[57], y5);//6

        //在歌詞下方繪出彩色譜        
        for (int i = 0;i < notes.length; i++){

            g2d.setColor(color[i]);
            g2d.fillRoundRect(x[i], y[i], width[i], height, 3,3); //畫圓角方塊

            g2d.setColor(color8);
            g2d.drawLine(x[i],230, x[i]+width[i], 230);//畫水平上線

            g2d.setColor(color8);
            g2d.drawLine(x[i],231, x[i], 429);//畫直紅線

            g2d.setColor(color8);
            g2d.drawLine(x[i],430, x[i]+width[i], 430);//畫水平下線
        }
        g2d.setColor(color8);
        g2d.drawLine(x[notes.length-1]+ width[notes.length - 1],231, x[notes.length - 1] + width[notes.length - 1],429);//畫邊界直紅線
    }
}

public class Test7 {
    public static void main(String[] args)  throws IOException
    {
        JFrame  jf = new JFrame("康樂彩歌");
        jf.setBounds(0, 0, 1368, 730);      
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        MyPanel jp = new MyPanel();
        //jp.setBackground(Color.lightGray);
        jp.setBorder(BorderFactory.createLineBorder(Color.black));

        JLabel label1 = new JLabel("選歌:");    //創建標簽
        label1.setFont(new Font("新細明體", Font.PLAIN, 20));
        JComboBox cmbox = new JComboBox();    //創建JComboBox
        cmbox.setFont(new Font("新細明體", Font.PLAIN, 20));

        cmbox.addItem("紫竹調");
        cmbox.addItem("走一同去郊遊");
        cmbox.addItem("我家門前有小河");

        JRadioButton rb1 = new JRadioButton("加人聲", false);
        rb1.setFont(new Font("新細明體", Font.PLAIN, 20));

        JButton btPlay = new JButton("PLAY");
        btPlay.setFont(new Font(Font.DIALOG_INPUT, Font.BOLD, 25));

        jp.add(label1);
        jp.add(cmbox);
        jp.add(rb1);
        jp.add(btPlay);

        jf.setVisible(true);
        jf.add(jp); 
        jp.display();
    }
}

下面列出了将这些组件放入框架的代码:

import java.awt.*;

import java.awt.event.*;
import javax.swing.*;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;

import java.io.*;
import sun.audio.*;
import java.io.IOException; 

class Panel1 extends JPanel{    
    public int x[] = new int[59]; 
    public int y[] = new int[59]; 
    public int width[] = new int[59];
    public int height = 20;
    Color color[] = new Color[59];//the color of each note

    //一根紫 竹 直 苗 苗,      5  ?  65 3 │ 52 32 1 ─ 
    //送給寶寶做管 簫,      6 ?   3 5  6 3 │5 ─ ─ ─
    //簫兒對準口,            ? 6 3 6 5 ─ 
    //口兒對準簫,           6 5 3 6  5 ─
    //簫 中吹 出  新 時 調, 56  ?  65 3 │ 52 32 1 ─
    //小寶寶, 小寶 寶,      1 13 2 ─  | 1 13 2  ─   
    //咿底 咿底學會了.啊~~  6 ?   6  ?  2 6 | 5 . 6  23 56│ 5 ─ ─ ─

    String[] lyric = {" 一", " 根", "紫~", "竹", "直~", "苗~", "苗,",
                      "送", "給", "寶", "寶", "做", "管", " 簫,",
                      "簫", "兒", "對", "準", "口,", "口", "兒", "對", "準", "簫,", 
                      "簫~", "中", "吹~", "出", "新~", "時~ ", "調,",
                      "小", "寶~", "寶,", "小", "寶~", "寶,", 
                      "咿", "底", "咿", "底", " 學 ", "會", "了,", "啊 ~     ~    ~"};//共45個

    int[] numNotes = {1, 1, 2, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 
                      1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
                      2, 1, 2, 1, 2, 2, 1,
                      1, 2, 1, 1, 2, 1, 
                      1, 1, 1, 1, 1, 1, 1, 6};//共45個

    int[][] notes = {{5,2},{8,2},{6,1},{5,1},{3,2},{5,1},{2,1},{3,1},{2,1},{1,4},{6,1},{8,1},
                     {3,1},{5,1},{6,2},{3,2},{5,8},{8,1},{6,1},{3,1},{6,1},{5,4},{6,1},{5,1},
                     {3,1},{6,1},{5,4},{5,1},{6,1},{8,2},{6,1},{5,1},{3,2},{5,1},{2,1},{3,1},
                     {2,1},{1,4},{1,2},{1,1},{3,1},{2,4},{1,2},{1,1},{3,1},{2,4},{6,1},{8,1},
                     {6,1},{8,1},{9,2},{6,2},{5,3},{6,1},{2,1},{3,1},{5,1},{6,1},{5,8}};//共59個

    String[] simplifiedNote = {"  5", "  1", " 6", "5", "3", "  5", " 2", " 3", "2", "1  - ",
                               "  6", " 1"," 3", " 5", " 6", " 3", "  5  -  -  -", 
                               " 1", " 6", " 3", " 6", " 5  - ", " 6", " 5", " 3", " 6", " 5  -",
                               " 5", " 6", " 1", " 6", "5", " 3", " 5", "2", " 3"," 2", "1   -", 
                               " 1", " 1", "3", "2   -", " 1", " 1", "3", "2  -",
                               " 6", "1","6", "1", " 2", "6", " 5 .", "6", 
                               " 2", "3", " 5", "6", " 5  -  -  - "};//共59個

    Color color0 = new Color(255,255,255); //白色 
    Color color1 = new Color(255,0,0); //紅色
    Color color2 = new Color(255,165,0); //橙色
    Color color3 = new Color(255,255,0); //黃色
    Color color4 = new Color(0,128,0); //綠色
    Color color5 = new Color(0,0,255); //藍色
    Color color6 = new Color(75,0,130); //靛色
    Color color7 = new Color(100,0,153); //紫色
    Color color8 = new Color(153,0,0); //暗紅
    Color color9 = new Color(0,0,0); //黑色

    //Constructor for initializing the color, y position, width, length of each note
    Panel1(){
        for (int i = 0;i < notes.length; i++) {
            //System.out.println("notes[" + i + "][0] = " + notes[i][0]);
            switch (notes[i][0]) {
                case 1:
                     y[i] = 400;
                     color[i] = color1;
                     break;
                case 2:
                     y[i] = 400 - 20;
                     color[i] = color2;
                     break;
                case 3:
                     y[i] = 400 - 20*2;
                     color[i] = color3;
                     break;
                case 4:
                     y[i] = 400 - 20*3;
                     color[i] = color4;
                     break;
                case 5:
                     y[i] = 400 - 20*4;
                     color[i] = color5;
                     break;
                case 6:
                     y[i] = 400 - 20*5;
                     color[i] = color6;
                     break;
                case 7:
                     y[i] = 400 - 20*6;
                     color[i] = color7;
                     break;
                case 8:
                     y[i] = 400 - 20*7;
                     color[i] = color1;
                     break;
                case 9:
                     y[i] = 400 - 20*8;
                     color[i] = color2;
            }

            switch (notes[i][1]) {
                case 1: width[i] = 20;     
                        break;
                case 2: width[i] = 20 * 2; 
                        break;
                case 3: width[i] = 20 * 3; 
                        break;
                case 4: width[i] = 20 * 4; 
                        break;
                case 5: width[i] = 20 * 5; 
                        break;
                case 6: width[i] = 20 * 6; 
                        break;
                case 7: width[i] = 20 * 7; 
                        break;
                case 8: width[i] = 20 * 8;
            }
        }

        x[0] = 100;
        for (int i = 1; i < notes.length; i++){
             x[i] = x[i-1] + width[i-1];
        }
    }

    public void display1(){
        //*
        int timeLast = 0;
        //timeLast = total executing time
        while(timeLast < 1000){ 
            for (int i = 0; i < notes.length; i ++){
                x[i]--;
            }
            this.repaint(); 
            try {Thread.sleep(30);}
            catch (InterruptedException e){
                e.printStackTrace();
            }
            timeLast = timeLast + 1; 
        }
    }

    public void paintComponent(Graphics g){
        super.paintComponent(g);    
        Graphics2D g2d = (Graphics2D)g;

        g2d.setFont(new Font("新細明體", Font.BOLD, 20));

        int y1 = 130; //C調 4/4 Y坐標
        int y2 = 180; //簡譜行Y坐標
        int y3 = 210; //歌詞行Y坐標
        int y4 = 163; //加高音點
        int y5 = 180; //加八分音符底線
        int y6 = 470; //色彩音符說明

        int chrPosition = 0;
        g2d.drawString("C調  4/4", 16, y1);

        //繪出最底下的色彩音符說明
        g2d.drawString("色彩音符說明:", 16, y6);

        g2d.setColor(color1);
        g2d.fillRoundRect(176, y6-16, 20,20, 3,3);
        g2d.setColor(color9);
        g2d.drawString(": Do", 200, y6);

        g2d.setColor(color2);
        g2d.fillRoundRect(256, y6-16, 20,20, 3,3);//220 + 56
        g2d.setColor(color9);
        g2d.drawString(": Re", 280, y6);

        g2d.setColor(color3);
        g2d.fillRoundRect(336, y6-16, 20,20, 3,3);//230 + 56
        g2d.setColor(color9);
        g2d.drawString(": Mi", 360, y6);

        g2d.setColor(color4);
        g2d.fillRoundRect(416, y6-16, 20,20, 3,3);//322 + 56
        g2d.setColor(color9);
        g2d.drawString(": Fa", 440, y6);//366 + 24

        g2d.setColor(color5);
        g2d.fillRoundRect(496, y6-16, 20,20, 3,3);//390 + 56
        g2d.setColor(color9);
        g2d.drawString(": So", 520, y6);//446 + 24

        g2d.setColor(color6);
        g2d.fillRoundRect(576, y6-16, 20,20, 3,3);//470 + 56
        g2d.setColor(color9);
        g2d.drawString(": La", 600, y6);

        //在簡譜下方寫出歌詞
        g2d.setColor(color9);
        for (int i = 0;  i < lyric.length; i++){
            if (i != 0 && numNotes[i-1] == 2) {
                chrPosition = chrPosition + 1;
                g2d.drawString(lyric[i], x[chrPosition], y3);
            }
            else {
                g2d.drawString(lyric[i], x[chrPosition], y3);
            }
            chrPosition = chrPosition + 1;
        }

        //在簡譜上方加高音點
        g2d.setColor(color8);
        g2d.drawString(".", x[1]+14, y4);
        g2d.drawString(".", x[11]+8, y4);
        g2d.drawString(".", x[17]+7, y4);
        g2d.drawString(".", x[29]+8, y4);
        g2d.drawString(".", x[47]+2, y4);
        g2d.drawString(".", x[49]+2, y4);
        g2d.drawString(".", x[50]+8, y4);
        //*
        //在簡譜下方加八分音符底線
        g2d.setColor(color8);
        g2d.drawLine(x[2]+5,y5+5,x[4]-10,y5+5);
        g2d.drawLine(x[5]+10,y5+5,x[7]-5,y5+5);
        g2d.drawLine(x[7]+3,y5+5,x[9]-8,y5+5);
        g2d.drawLine(x[10]+10,y5+5,x[11],y5+5);
        g2d.drawLine(x[11]+5,y5+5,x[12]-5,y5+5);
        g2d.drawLine(x[12]+5,y5+5,x[13]-5,y5+5);
        g2d.drawLine(x[13]+5,y5+5,x[14]-5,y5+5);
        g2d.drawLine(x[17]+5,y5+4,x[18]-5,y5+4);
        g2d.drawLine(x[18]+5,y5+4,x[19]-5,y5+4);
        g2d.drawLine(x[19]+5,y5+4,x[20]-5,y5+4);
        g2d.drawLine(x[20]+5,y5+4,x[21]-5,y5+4);
        g2d.drawLine(x[22]+5,y5+5,x[23]-2,y5+5);
        g2d.drawLine(x[23]+5,y5+5,x[24]-5,y5+5);
        g2d.drawLine(x[24]+5,y5+5,x[25]-5,y5+5);
        g2d.drawLine(x[25]+5,y5+5,x[26]-5,y5+5);

        g2d.drawLine(x[27]+5,y5+5,x[29]-3,y5+5);
        g2d.drawLine(x[30]+1,y5+5,x[32]-5,y5+5);
        g2d.drawLine(x[33]+5,y5+4,x[35]-5,y5+4);
        g2d.drawLine(x[35]+5,y5+4,x[37]-5,y5+4);
        g2d.drawLine(x[39]+5,y5+4,x[41]-8,y5+4);
        g2d.drawLine(x[43]+5,y5+5,x[45]-8,y5+5);
        g2d.drawLine(x[46]+5,y5+5,x[47]-5,y5+5);
        g2d.drawLine(x[47],y5+5,x[48]-8,y5+5);
        g2d.drawLine(x[48],y5+5,x[49]-10,y5+5);
        g2d.drawLine(x[49],y5+5,x[50]-8,y5+5);
        g2d.drawLine(x[53]-2,y5+4,x[58]-5,y5+4);

        //在歌詞下方繪出彩色譜        
        for (int i = 0;i < notes.length; i++){

            //畫簡譜小節線
            g2d.setColor(color9);
            if (i==0||i==5||i==10||i==16||i==17||i==22||i==27||i==33||i==38||
                i==42||i==46||i == 52||i == 58) {
                g2d.drawString("|", x[i], y2);
                }

            //畫出簡譜
            g2d.setColor(color8);
            g2d.drawString(simplifiedNote[i], x[i], y2);

            g2d.setColor(color[i]);
            g2d.fillRoundRect(x[i], y[i], width[i], height, 3,3); //畫圓角方塊

            g2d.setColor(color8);
            g2d.drawLine(x[i],230, x[i]+width[i], 230);//畫水平上線

            g2d.setColor(color8);
            g2d.drawLine(x[i],231, x[i], 429);//畫直紅線

            g2d.setColor(color8);
            g2d.drawLine(x[i],430, x[i]+width[i], 430);//畫水平下線
        }
        g2d.setColor(color9);
        g2d.drawString("|",x[notes.length-1]+ width[notes.length - 1]-5 , y2);
        g2d.drawString("|",x[notes.length-1]+ width[notes.length - 1]-10 , y2);
        g2d.setColor(color8);
        g2d.drawLine(x[notes.length-1]+ width[notes.length - 1],231, x[notes.length - 1] + width[notes.length - 1],429);//畫邊界直紅線
    }
}

public class Move1 {
    public static void main(String[] args)  throws IOException
    {
        JFrame  jf = new JFrame("康樂彩歌(v0)");
        jf.setBounds(0, 0, 1368, 730);      
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setLayout(null);

        Panel1 jp1 = new Panel1();
        //jp.setBackground(Color.lightGray);
        jp1.setBorder(BorderFactory.createLineBorder(Color.black));

        JComboBox cmbox = new JComboBox();
        cmbox.setBounds(10, 40, 250, 40);
        cmbox.setLocation(370,25);
        cmbox.setFont(new Font("新細明體", Font.PLAIN, 30));
        cmbox.addItem("紫竹調");
        cmbox.addItem("走一同去郊遊");
        cmbox.addItem("我家門前有小河");
        jf.add(cmbox);

        JRadioButton rb2 = new JRadioButton("加人聲", false);
        rb2.setFont(new Font("新細明體", Font.PLAIN, 20));
        rb2.setBounds(635, 28, 90, 30);
        jf.add(rb2);

        JButton btPlay = new JButton("PLAY");
        btPlay.setFont(new Font(Font.DIALOG_INPUT, Font.BOLD, 25));
        btPlay.setBounds(740, 25, 100, 40);
        jf.add(btPlay);

        JButton btStop = new JButton("STOP");
        btStop.setFont(new Font(Font.DIALOG_INPUT, Font.BOLD, 25));
        btStop.setBounds(850, 25, 100, 40);
        jf.add(btStop);

        jf.setVisible(true);

//        btPlay.addActionListener(new ActionListener() {//?按?添加事件接收器
//             @Override
//             public void actionPerformed(ActionEvent e) {//接受到事件后,?行下面的?理
//              //System.out.println("Hello World");// 控制台打印?出
//              //JOptionPane.showMessageDialog(null, "Hello World");// ?出??框,?示Hello World
//             }
//            });
        jf.add(jp1);
        jp1.display1();
    }
}
java swing jframe jpanel
1个回答
0
投票

我忘记了jPanel的setBounds,因此jPanel的范围覆盖了其他组件。现在我将jp.setBounds(0,80,2200,1050)放入jPanel,它现在可以正常工作。更正后的代码如下所示:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;

import java.io.*;
import sun.audio.*;
import java.io.IOException; 

class Panel1 extends JPanel{    
    public int x[] = new int[59]; 
    public int y[] = new int[59]; 
    public int width[] = new int[59];
    public int height = 20;
    public Color color[] = new Color[59];//the color of each note
    public String  str = "紫 竹調";

    String[] lyric = {" 一", " 根", "紫~", "竹", "直~", "苗~", "苗,",
                      "送", "給", "寶", "寶", "做", "管", " 簫,",
                      "簫", "兒", "對", "準", "口,", "口", "兒", "對", "準", "簫,", 
                      "簫~", "中", "吹~", "出", "新~", "時~ ", "調,",
                      "小", "寶~", "寶,", "小", "寶~", "寶,", 
                      "咿", "底", "咿", "底", " 學 ", "會", "了,", "啊 ~     ~    ~"};//共45個

    int[] numNotes = {1, 1, 2, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 
                      1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
                      2, 1, 2, 1, 2, 2, 1,
                      1, 2, 1, 1, 2, 1, 
                      1, 1, 1, 1, 1, 1, 1, 6};//共45個

    int[][] notes = {{5,2},{8,2},{6,1},{5,1},{3,2},{5,1},{2,1},{3,1},{2,1},{1,4},{6,1},{8,1},
                     {3,1},{5,1},{6,2},{3,2},{5,8},{8,1},{6,1},{3,1},{6,1},{5,4},{6,1},{5,1},
                     {3,1},{6,1},{5,4},{5,1},{6,1},{8,2},{6,1},{5,1},{3,2},{5,1},{2,1},{3,1},
                     {2,1},{1,4},{1,2},{1,1},{3,1},{2,4},{1,2},{1,1},{3,1},{2,4},{6,1},{8,1},
                     {6,1},{8,1},{9,2},{6,2},{5,3},{6,1},{2,1},{3,1},{5,1},{6,1},{5,8}};//共59個

    String[] simplifiedNote = {"  5", "  1", " 6", "5", "3", "  5", " 2", " 3", "2", "1  - ",
                               "  6", " 1"," 3", " 5", " 6", " 3", "  5  -  -  -", 
                               " 1", " 6", " 3", " 6", " 5  - ", " 6", " 5", " 3", " 6", " 5  -",
                               " 5", " 6", " 1", " 6", "5", " 3", " 5", "2", " 3"," 2", "1   -", 
                               " 1", " 1", "3", "2   -", " 1", " 1", "3", "2  -",
                               " 6", "1","6", "1", " 2", "6", " 5 .", "6", 
                               " 2", "3", " 5", "6", " 5  -  -  - "};//共59個

    Color color0 = new Color(255,255,255); //白色 
    Color color1 = new Color(255,0,0); //紅色
    Color color2 = new Color(255,165,0); //橙色
    Color color3 = new Color(255,255,0); //黃色
    Color color4 = new Color(0,128,0); //綠色
    Color color5 = new Color(0,0,255); //藍色
    Color color6 = new Color(75,0,130); //靛色
    Color color7 = new Color(100,0,153); //紫色
    Color color8 = new Color(153,0,0); //暗紅
    Color color9 = new Color(0,0,0); //黑色

    //Constructor for initializing the color, y position, width, length of each note
    Panel1(){
        for (int i = 0;i < notes.length; i++) {
            //System.out.println("notes[" + i + "][0] = " + notes[i][0]);
            switch (notes[i][0]) {
                case 1:
                     y[i] = 400;
                     color[i] = color1;
                     break;
                case 2:
                     y[i] = 400 - 20;
                     color[i] = color2;
                     break;
                case 3:
                     y[i] = 400 - 20*2;
                     color[i] = color3;
                     break;
                case 4:
                     y[i] = 400 - 20*3;
                     color[i] = color4;
                     break;
                case 5:
                     y[i] = 400 - 20*4;
                     color[i] = color5;
                     break;
                case 6:
                     y[i] = 400 - 20*5;
                     color[i] = color6;
                     break;
                case 7:
                     y[i] = 400 - 20*6;
                     color[i] = color7;
                     break;
                case 8:
                     y[i] = 400 - 20*7;
                     color[i] = color1;
                     break;
                case 9:
                     y[i] = 400 - 20*8;
                     color[i] = color2;
            }

            switch (notes[i][1]) {
                case 1: width[i] = 20;     
                        break;
                case 2: width[i] = 20 * 2; 
                        break;
                case 3: width[i] = 20 * 3; 
                        break;
                case 4: width[i] = 20 * 4; 
                        break;
                case 5: width[i] = 20 * 5; 
                        break;
                case 6: width[i] = 20 * 6; 
                        break;
                case 7: width[i] = 20 * 7; 
                        break;
                case 8: width[i] = 20 * 8;
            }
        }

        x[0] = 100;
        for (int i = 1; i < notes.length; i++){
             x[i] = x[i-1] + width[i-1];
        }
    }

    public void display1(){
        //*
        int timeLast = 0;
        //timeLast = total executing time
        while(timeLast < 1000){ 
            for (int i = 0; i < notes.length; i ++){
                x[i]--;
            }
            this.repaint(); 
            try {Thread.sleep(30);}
            catch (InterruptedException e){
                e.printStackTrace();
            }
            timeLast = timeLast + 1; 
        }
    }

    public void paintComponent(Graphics g){
        super.paintComponent(g);    
        Graphics2D g2d = (Graphics2D)g;

        g2d.setFont(new Font("新細明體", Font.BOLD, 20));

        int y0 = 70; //歌名 之Y坐標
        int y1 = 130; //C調 4/4 Y坐標
        int y2 = 180; //簡譜行Y坐標
        int y3 = 210; //歌詞行Y坐標
        int y4 = 163; //加高音點
        int y5 = 180; //加八分音符底線
        int y6 = 470; //色彩音符說明

        int chrPosition = 0;

        g2d.setColor(color9);
        g2d.setFont(new Font("新細明體", Font.BOLD, 30));
        g2d.drawString(str, 550, y0);//繪出歌名

        g2d.setColor(color8); 
        g2d.drawLine(548,y0+8,660,y0+8);  //在歌名底下繪直橫線1
        g2d.drawLine(548,y0+10,660,y0+10);//在歌名底下繪直橫線2

        g2d.setColor(color9);
        g2d.setFont(new Font("新細明體", Font.BOLD, 20));
        g2d.drawString("C調  4/4", 16, y1); //繪出調號節拍

        //繪出最底下的色彩音符說明
        g2d.drawString("色彩音符說明:", 16, y6);

        g2d.setColor(color1);
        g2d.fillRoundRect(176, y6-16, 20,20, 3,3);
        g2d.setColor(color9);
        g2d.drawString(": Do", 200, y6);

        g2d.setColor(color2);
        g2d.fillRoundRect(256, y6-16, 20,20, 3,3);//220 + 56
        g2d.setColor(color9);
        g2d.drawString(": Re", 280, y6);

        g2d.setColor(color3);
        g2d.fillRoundRect(336, y6-16, 20,20, 3,3);//230 + 56
        g2d.setColor(color9);
        g2d.drawString(": Mi", 360, y6);

        g2d.setColor(color4);
        g2d.fillRoundRect(416, y6-16, 20,20, 3,3);//322 + 56
        g2d.setColor(color9);
        g2d.drawString(": Fa", 440, y6);//366 + 24

        g2d.setColor(color5);
        g2d.fillRoundRect(496, y6-16, 20,20, 3,3);//390 + 56
        g2d.setColor(color9);
        g2d.drawString(": So", 520, y6);//446 + 24

        g2d.setColor(color6);
        g2d.fillRoundRect(576, y6-16, 20,20, 3,3);//470 + 56
        g2d.setColor(color9);
        g2d.drawString(": La", 600, y6);

        //在簡譜下方寫出歌詞
        g2d.setColor(color9);
        for (int i = 0;  i < lyric.length; i++){
            if (i != 0 && numNotes[i-1] == 2) {
                chrPosition = chrPosition + 1;
                g2d.drawString(lyric[i], x[chrPosition], y3);
            }
            else {
                g2d.drawString(lyric[i], x[chrPosition], y3);
            }
            chrPosition = chrPosition + 1;
        }

        //在簡譜上方加高音點
        g2d.setColor(color8);
        g2d.drawString(".", x[1]+14, y4);
        g2d.drawString(".", x[11]+8, y4);
        g2d.drawString(".", x[17]+7, y4);
        g2d.drawString(".", x[29]+8, y4);
        g2d.drawString(".", x[47]+2, y4);
        g2d.drawString(".", x[49]+2, y4);
        g2d.drawString(".", x[50]+8, y4);
        //*
        //在簡譜下方加八分音符底線
        g2d.setColor(color8);
        g2d.drawLine(x[2]+5,y5+5,x[4]-10,y5+5);
        g2d.drawLine(x[5]+10,y5+5,x[7]-5,y5+5);
        g2d.drawLine(x[7]+3,y5+5,x[9]-8,y5+5);
        g2d.drawLine(x[10]+10,y5+5,x[11],y5+5);
        g2d.drawLine(x[11]+5,y5+5,x[12]-5,y5+5);
        g2d.drawLine(x[12]+5,y5+5,x[13]-5,y5+5);
        g2d.drawLine(x[13]+5,y5+5,x[14]-5,y5+5);
        g2d.drawLine(x[17]+5,y5+4,x[18]-5,y5+4);
        g2d.drawLine(x[18]+5,y5+4,x[19]-5,y5+4);
        g2d.drawLine(x[19]+5,y5+4,x[20]-5,y5+4);
        g2d.drawLine(x[20]+5,y5+4,x[21]-5,y5+4);
        g2d.drawLine(x[22]+5,y5+5,x[23]-2,y5+5);
        g2d.drawLine(x[23]+5,y5+5,x[24]-5,y5+5);
        g2d.drawLine(x[24]+5,y5+5,x[25]-5,y5+5);
        g2d.drawLine(x[25]+5,y5+5,x[26]-5,y5+5);

        g2d.drawLine(x[27]+5,y5+5,x[29]-3,y5+5);
        g2d.drawLine(x[30]+1,y5+5,x[32]-5,y5+5);
        g2d.drawLine(x[33]+5,y5+4,x[35]-5,y5+4);
        g2d.drawLine(x[35]+5,y5+4,x[37]-5,y5+4);
        g2d.drawLine(x[39]+5,y5+4,x[41]-8,y5+4);
        g2d.drawLine(x[43]+5,y5+5,x[45]-8,y5+5);
        g2d.drawLine(x[46]+5,y5+5,x[47]-5,y5+5);
        g2d.drawLine(x[47],y5+5,x[48]-8,y5+5);
        g2d.drawLine(x[48],y5+5,x[49]-10,y5+5);
        g2d.drawLine(x[49],y5+5,x[50]-8,y5+5);
        g2d.drawLine(x[53]-2,y5+4,x[58]-5,y5+4);

        //在歌詞下方繪出彩色譜        
        for (int i = 0;i < notes.length; i++){

            //畫簡譜小節線
            g2d.setColor(color9);
            if (i==0||i==5||i==10||i==16||i==17||i==22||i==27||i==33||i==38||
                i==42||i==46||i == 52||i == 58) {
                g2d.drawString("|", x[i], y2);
                }

            //畫出簡譜
            g2d.setColor(color8);
            g2d.drawString(simplifiedNote[i], x[i], y2);

            g2d.setColor(color[i]);
            g2d.fillRoundRect(x[i], y[i], width[i], height, 3,3); //畫圓角方塊

            g2d.setColor(color8);
            g2d.drawLine(x[i],230, x[i]+width[i], 230);//畫水平上線

            g2d.setColor(color8);
            g2d.drawLine(x[i],231, x[i], 429);//畫直紅線

            g2d.setColor(color8);
            g2d.drawLine(x[i],430, x[i]+width[i], 430);//畫水平下線
        }
        g2d.setColor(color9);
        g2d.drawString("|",x[notes.length-1]+ width[notes.length - 1]-5 , y2);
        g2d.drawString("|",x[notes.length-1]+ width[notes.length - 1]-10 , y2);
        g2d.setColor(color8);
        g2d.drawLine(x[notes.length-1]+ width[notes.length - 1],231, x[notes.length - 1] + width[notes.length - 1],429);//畫邊界直紅線
    }
}

public class Move1 {
    public static void main(String[] args)  throws IOException
    {
        JFrame  jf = new JFrame("康樂彩歌(v0)");
        jf.setBounds(0, 0, 1368, 730);      
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setLayout(null);

        Panel1 jp = new Panel1();
        jp.setBounds(0,80,2200,1050); // ***This line setBounds for jPanel

        JComboBox cmbox = new JComboBox();
        cmbox.setBounds(10, 40, 250, 40);
        cmbox.setLocation(370,25);
        cmbox.setFont(new Font("新細明體", Font.PLAIN, 30));
        cmbox.addItem("紫竹調");
        cmbox.addItem("郊遊");
        cmbox.addItem("我家門前有小河");
        jf.add(cmbox);

        JRadioButton rb = new JRadioButton("加人聲", false);
        rb.setFont(new Font("新細明體", Font.PLAIN, 20));
        rb.setBounds(635, 28, 90, 30);
        jf.add(rb);

        JButton btPlay = new JButton("PLAY");
        btPlay.setFont(new Font(Font.DIALOG_INPUT, Font.BOLD, 25));
        btPlay.setBounds(740, 25, 100, 40);
        jf.add(btPlay);

        JButton btStop = new JButton("STOP");
        btStop.setFont(new Font(Font.DIALOG_INPUT, Font.BOLD, 25));
        btStop.setBounds(850, 25, 100, 40);
        jf.add(btStop);

        jf.setVisible(true);

        jf.add(jp);
        jp.display1();
     }
}
© www.soinside.com 2019 - 2024. All rights reserved.