0

いくつかのファイルを選択して、いくつかのロジックを実行できるシンプルなアプリを作ろうとしています。IntelliJ IDEA に組み込まれている JFrame Palette ビルダーを介してインターフェイスを作成しました。

public class App extends JFrame implements ActionListener {
JPanel panelComponent;
private JButton buttonFolder;
private JTextPane textPane;
private JPanel myPanel;
private JButton buttonCreatePackage;
private JTextField textFieldFolder;
private JLabel nameFolderUnderContentLabel;
private JButton buttonAdd;
private JPanel panelList;
private JScrollPane scrollPane;
private JPanel consolePanel;
private JScrollPane tableScrollPane;
private JTable table1; 

}

これが私の App クラスの外観であり、アプリケーションの要点です。 「新しい」初期化子で定義されているフィールドはありません。これは、[コンポーネントの使用状況を見る] をクリックすると IntelliJ が自動的にこれを行うためです (次のスクリーンショットを参照)。 IDE によって初期化およびバインドされる JFrame を拡張し、次のように開始します。

  public static void main(String[] args) {
    SwingUtilities.invokeLater(() -> {
            myApp = new App();
            myApp.setVisible(true);
            control = true;
            myApp.initViews();
            myApp.document = (StyledDocument) myApp.textPane.getDocument();
            myApp.buttonCreatePackage.setEnabled(false);
            myApp.documentWriter = new DocumentWriter(myApp.document);
            myApp.setContentPane(myApp.myPanel);
        worker.execute();
    });
}

initViews メソッド内でリスナーを設定していますが、NullPointerException がスローされます。メソッド内では、次のようになります。

 buttonFolder.addActionListener(e -> {
        //code

}

例外:

スレッド「AWT-EventQueue-0」での例外 java.lang.NullPointerException

エラーをクリックすると、buttonFolder で actionListener を設定した行が表示されます。

私の理論では、アプリの初期スレッド、GUI を実行/編集する必要がある EDT スレッド、およびそれらの間のコンポーネントの作成の間に何らかの衝突があるというものです。

EDT スレッドで initViews が呼び出されているかどうかを確認しましたが、答えは「はい」です。EDT スレッドで明示的に強制するために、Swing ワーカーでビューを初期化しようとしましたが、うまくいきませんでした。また、リスナーなどの追加を 200 ~ 400 ミリ秒延期して、GUI を初期化しようとしましたが、成功しませんでした。

ご意見をお待ちしております。ありがとうございます。

4

1 に答える 1

0

あなたはIntelliJ IDEAがあなたのnew()ためにやってくれると言いますが...私はあなたのコードにそれを見ません。

// Still null
private JButton buttonFolder;

この現在の状態でbuttonFolderは、null です。次の 2 つのオプションがあります。

// Change your class level button declaration to this:
private JButton buttonFolder = new JButton();

または、そのままにして、メイン内から:

// You probably want to go with this method - since you want to identify the button
buttonFolder = new JButton("This is button Folder");

すべてのJComponentに対してこれを行う必要があります。最後に、JFrame を拡張しないことをお勧めします。代わりに、インスタンスを作成してください。

于 2020-01-15T11:59:24.400 に答える