//cd c:\HPBasic\Toppage-sample3\MySwing\Slideshow100 //set CLASSPATH=. //javac Slideshow.java //appletviewer Slideshow.html //appletviewer Slideshow.java import java.applet.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.net.*; /* */ public class Slideshow extends JApplet implements ActionListener, Runnable { Container contentPane; SlidePanel slidepanel; JButton startButton; JButton stopButton; AudioClip onceClip; ImageIcon[] images; Thread t; int i = 0; int height; int n = 7; //NUM_IMAGES String[] str={"コスモス(昭和記念公園 2003)","コスモス1","コスモス2", "コスモス3","コスモス4","コスモス5","コスモス6"}; String slideName = "kosmos"; String midiFile= "coroptica.mid"; public void init(){ contentPane = getContentPane(); Dimension d = getSize(); height = d.height; JPanel minipanel= new JPanel(); startButton = new JButton("Start"); stopButton = new JButton("Stop"); startButton.addActionListener(this); stopButton.addActionListener(this); images = new ImageIcon[n]; for (int j = 0; j < n; j++) { String imageName = slideName + j + ".jpg"; try{images[j]=new ImageIcon(new URL(getCodeBase(),imageName)); } catch (Exception e) {} } contentPane.add(minipanel,BorderLayout.NORTH); minipanel.add(startButton); minipanel.add(stopButton); minipanel.setBackground(Color.green); // slidepanel=new SlidePanel(); slidepanel=new SlidePanel(i,images[0],str[0],height); contentPane.add(slidepanel,BorderLayout.CENTER); slidepanel.setBackground(Color.yellow); } public void actionPerformed(ActionEvent event) { Object source = event.getSource(); if (source == startButton) { onceClip = getAudioClip(getCodeBase(),midiFile); onceClip.play(); //AudioPlay // スレッドを起動する t = new Thread(this); t.start(); } if (source == stopButton) { onceClip.stop(); //AudioStop stop(); } } public void run() { try { Thread mythread = Thread.currentThread(); while(t == mythread) { start(); Thread.sleep(3000); i++; if (i == n) i=0; } } catch (Exception e) { } } public void start() { slidepanel=new SlidePanel(i,images[i],str[i],height); System.out.println("start i = " + i + " str[i] = " + str[i]); // slidepanel.init(); // slidepanel.update(); // repaint(); slidepanel.start(); } public void stop() { t=null; } } class SlidePanel extends JPanel { private ImageIcon img; private String string; private int i; private int height; SlidePanel(){ System.out.println("SlidePanel 引数なし"); } SlidePanel(int i,ImageIcon img,String string,int height){ this.i= i; this.img = img; this.string= string; this.height= height; System.out.println("SlidePanel i = " + i + " string = " + string + " height = " + height); } public void start() { System.out.println("SlidePanel start i = " + i + " string = " + string + " height = " + height); repaint(); } /* public void update() { System.out.println("SlidePanel update i = " + i + " string = " + string + " height = " + height); repaint(); }*/ /* public void init() { System.out.println("SlidePanel init i = " + i + " string = " + string + " height = " + height); repaint(); }*/ public void paintComponent(Graphics g) { super.paintComponent(g); System.out.println("paintComponent i = " + i + " string = " + string+ " height = " + height); g.setFont(new Font("Serif", Font.BOLD, 30)); g.setColor(Color.blue); g.drawString(string,220,height-50); img.paintIcon(this,g,50,30); } } /* 1 contentPane.add(slidepanel,BorderLayout.CENTER); などを入れるため、 SlidePanel slidepanel=new SlidePanel();と引数なしのコンストラクタを作って 呼ぶ。 SlidePanel init まではいいが、paintComponentに、stringもimgiconもnullと なってだめ。 paintComponentに、stringなどの値が渡らないのはなぜ? C:\HPBasic\Toppage-sample3\MySwing\Slideshow100>appletviewer Slideshow.html SlidePanel 引数なし SlidePanel i = 0 string = コスモス(昭和記念公園 2003) height = 600 start i = 0 str[i] = コスモス(昭和記念公園 2003) SlidePanel init i = 0 string = コスモス(昭和記念公園 2003) height = 600 paintComponent i = 0 string = null height = 0 java.lang.NullPointerException: string is null 2 引数なしのコンストラクタをやめて、 contentPane.add(slidepanel,BorderLayout.CENTER);などもその後に 移す。 これで、stringやimgiconのnullはなくなり、最初の写真と説明は出る。サウンドも鳴る。 2 引数なしのコンストラクタを使うのはやめて SlidePanel slidepanel=new SlidePanel(i,images[0],str[0],height);とする。 contentPane.add(slidepanel,BorderLayout.CENTER);などもその後に移す。 これで最初の写真が出る。 SlidePanel のinitまではいっても、paintComponentに行くのは、一度だけというのが不可解。(initをupdateとしても同じ、また、その呼び出し位置をコンストラクタの中においても同じ。) C:\HPBasic\Toppage-sample3\MySwing\Slideshow100>appletviewer Slideshow.java SlidePanel i = 0 string = コスモス(昭和記念公園 2003) height = 600 SlidePanel i = 0 string = コスモス(昭和記念公園 2003) height = 600 start i = 0 str[i] = コスモス(昭和記念公園 2003) SlidePanel init i = 0 string = コスモス(昭和記念公園 2003) height = 600 paintComponent i = 0 string = コスモス(昭和記念公園 2003) height = 600 SlidePanel i = 0 string = コスモス(昭和記念公園 2003) height = 600 start i = 0 str[i] = コスモス(昭和記念公園 2003) SlidePanel init i = 0 string = コスモス(昭和記念公園 2003) height = 600 SlidePanel i = 1 string = コスモス1 height = 600 start i = 1 str[i] = コスモス1 SlidePanel init i = 1 string = コスモス1 height = 600 SlidePanel i = 2 string = コスモス2 height = 600 start i = 2 str[i] = コスモス2 SlidePanel init i = 2 string = コスモス2 height = 600 3 SlidePanelのinitないしupdateをやめ、repaint()を直接、Slideshowのstartに書く。それで、paintComponentに入るようになったが、string=0のままで変わらない。 C:\HPBasic\Toppage-sample3\MySwing\Slideshow100>appletviewer Slidesh SlidePanel i = 0 string = コスモス(昭和記念公園 2003) height = 600 SlidePanel i = 0 string = コスモス(昭和記念公園 2003) height = 600 start i = 0 str2 = コスモス(昭和記念公園 2003) paintComponent i = 0 string = コスモス(昭和記念公園 2003) SlidePanel i = 0 string = コスモス(昭和記念公園 2003) height = 600 start i = 0 str2 = コスモス(昭和記念公園 2003) paintComponent i = 0 string = コスモス(昭和記念公園 2003) SlidePanel i = 1 string = コスモス1 height = 600 start i = 1 str2 = コスモス1 paintComponent i = 0 string = コスモス(昭和記念公園 2003) SlidePanel i = 2 string = コスモス2 height = 600 start i = 2 str2 = コスモス2 paintComponent i = 0 string = コスモス(昭和記念公園 2003) SlidePanel i = 3 string = コスモス3 height = 600 start i = 3 str2 = コスモス3 paintComponent i = 0 string = コスモス(昭和記念公園 2003) */