2013-08-07 12 views
2

我一直在使用Midi音序器進行練習,並使用ControlEventListener根據音樂的節奏進行重繪,在隨機顏色,形狀和位置的面板上重新繪製正方形。當我在筆記本上這樣做時,一切正常。但是,當我在PC上執行此操作時,出現此錯誤:使用Midi音序器時返回錯誤代碼

Aug 07, 2013 1:10:11 PM java.util.prefs.WindowsPreferences <init> 
WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5. 
BUILD SUCCESSFUL (total time: 27 seconds) 

該程序工作得很好。編譯並完成它應該做的事情,正如我前面所說的,我的筆記本電腦上的這個確切代碼沒有問題。
此外,這些代碼中的大部分都是從一本關於Java的書中提取出來的,我只是對面板進行了一些更改,以調整代碼以稍微不同地做同樣的事情。 有人知道這段代碼的含義嗎? 我用它搜索了一下,什麼也沒找到。這本書沒有提到這種代碼。

任何幫助將不勝感激。提前感謝您花時間閱讀本文,並隨時爲您解答此問題。

This is the code in its entirity: 

import javax.swing.*; 
import java.awt.*; 
import javax.sound.midi.*; 

public class Check implements ControllerEventListener{ 
    JFrame frame; 
    DrawPanel dp; 
    public void controlChange(ShortMessage a) { 
     frame.repaint(); 
    } 
    public static void main(String[] args) { 
     new Check().buildGui(); 
    } 
    private void buildGui() { 
     frame = new JFrame("Woot"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     dp = new DrawPanel(); 

     frame.getContentPane().add(dp); 

     frame.setVisible(true); 
     frame.setSize(500, 500); 
     frame.setResizable(false); 
     frame.setLocation(375, 50); 
     playMusic(); 
    } 
    private void playMusic() { 
     try { 
     Sequencer sequencer = MidiSystem.getSequencer(); 
     sequencer.open(); 
     int[] trackedInt = {127}; 
     sequencer.addControllerEventListener(this, trackedInt); 

     Sequence seq = new Sequence(Sequence.PPQ,4); 
     Track track = seq.createTrack(); 

     for(int i = 0; i < 50; i++) { 
      int rI = (int)(Math.random()*50)+30; 
      track.add(makeEvent(144,9,rI,100,i*10)); 
      track.add(makeEvent(176,1,127,0,i*10)); 
      track.add(makeEvent(128,9,rI,0,i*2+2)); 
     } 

     sequencer.setSequence(seq); 
     sequencer.setTempoInBPM(160); 
     sequencer.start(); 
     } catch(Exception exc){} 
    } 
    private MidiEvent makeEvent(int comd, int chan, int one, int two, int tick) { 
     MidiEvent event = null; 
     try { 
      ShortMessage a = new ShortMessage(); 
      a.setMessage(comd, chan, one, two); 
      event = new MidiEvent(a, tick); 
     } catch (Exception exc){} 
     return event; 
    } 
} 
class DrawPanel extends JPanel { 
    public void paintComponent(Graphics g) { 
     int r = (int)(Math.random()*256); 
     int gr = (int)(Math.random()*256); 
     int b = (int)(Math.random()*256); 
     g.setColor(new Color(r,gr,b)); 
     int x = (int)(Math.random()*200)+20; 
     int y = (int)(Math.random()*200)+20; 
     int h = (int)(Math.random()*500)+20; 
     int w = (int)(Math.random()*500)+20; 
     g.fillRect(x, y, w, h); 
    } 
} 
+0

可能重複的:http://stackoverflow.com/questions/16428098/groovy-shell-warning-could-not-open-create -prefs-root-node –

+0

您可以提供您目前使用的代碼嗎? –

+0

現在已添加完整的代碼。 –

回答

-2

就讓警告日誌閉嘴:

PlatformLogger.getLogger("java.util.prefs") 
     .setLevel(PlatformLogger.Level.SEVERE); 
+0

我明白這樣做是可能的,但這只是防止日誌顯示錯誤。它沒有任何改正它。評論中提供的鏈接實際上是修復了這一點。 –

+0

感謝您的評論,我瀏覽了給定問題的Java源代碼,它看起來像導致此錯誤的實例對於您的midi播放而言是不需要的,並且可能是Java平臺中的糟糕代碼設計的遺留問題。由於它沒有壞處,我建議壓制警告。如果它本來是你的代碼,我會給你一些其他的建議。您的當前「修復」必須由您的應用程序的每個用戶應用,並且只能在其計算機上使用管理員權限。 –