パネルを Java アプレットにロードしようとしていますが、パネルのコンテンツが表示されません。以下のコードからわかるように、パネル内のコードの実行に失敗している場所を確認するテストをセットアップしました。テストの結果は、getRootPane().add(MyLabel)がトリガーされるコード行であることを示しています。例外。
この問題を再現するために必要なすべてのコードを以下に示します。パネルの内容がアプレットに読み込まれるように、以下のコードを変更する方法を教えてもらえますか?
TestApplet.java のコードは次のとおりです。
import javax.swing.JApplet;
import javax.swing.SwingUtilities;
public class TestApplet extends JApplet {
public void init(){//Called when this applet is loaded into the browser.
//Execute a job on the event-dispatching thread; creating this applet's GUI.
try {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
createGUI();
}
});
} catch (Exception e) {
System.err.println("createGUI didn't complete successfully");
}
}
private void createGUI(){
TestPanel myPanel = new TestPanel();
myPanel.setOpaque(true);
setContentPane(myPanel);
}
}
TestPanel.java のコードは次のとおりです。
import javax.swing.JLabel;
import javax.swing.JPanel;
public class TestPanel extends JPanel{
TestPanel(){
System.out.println("Running in constructor. ");
JLabel myLabel = new JLabel("Hello World");
getRootPane().add(myLabel);
System.out.println("Still running in constructor. ");
}
}
編集:
これまでの提案に基づいて、次のようにコードを編集しました。this.add を使用すると JLabel が読み込まれますが、内部クラスはまだ読み込まれていません。これを以下のコードに追加しました。また、以下の変更されたコードは、例外をトリガーしなくなりました。JLabel をロードするだけで、内部クラスはロードしません。内部クラスをロードする方法に関する提案はありますか?
新しい TestApplet.java は次のとおりです。
import javax.swing.JApplet;
import javax.swing.SwingUtilities;
public class TestApplet extends JApplet {
public void init(){//Called when this applet is loaded into the browser.
//Execute a job on the event-dispatching thread; creating this applet's GUI.
try {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
createGUI();
}
});
} catch (Exception e) {
System.err.println("createGUI didn't complete successfully");
System.err.println(e);
e.printStackTrace();
}
}
private void createGUI(){
TestPanel myPanel = new TestPanel();
myPanel.setOpaque(true);
setContentPane(myPanel);
}
}
そして、これが新しい TestPanel.java です。
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class TestPanel extends JPanel{
DrawingLines myDrawingLines = new DrawingLines();
TestPanel(){
System.out.println("Running in constructor. ");
JLabel myLabel = new JLabel("Hello World");
this.add(myLabel);
this.add(myDrawingLines);
myDrawingLines.repaint();
System.out.println("Still running in constructor. ");
}
//inner class to override paint method
class DrawingLines extends Canvas{
int width, height;
public void paint( Graphics g ) {
width = getSize().width;
height = getSize().height;
g.setColor( Color.green );
for ( int i = 0; i < 10; ++i ) {
g.drawLine( width, height, i * width / 10, 0 );
}
System.out.println("Running in paint method.");
}
}//end of inner class
}