0

編集: 根本的な問題を解決しました。SwingUtilities.invokeLater()は問題を解決するために使用されます。私の他の質問は、興味のある人のためのより多くの情報を提供します。

JPanelで画像paintComponent()を表示する GUI がありますg.drawImage()。オーバーライドして、画像が描画される場所の境界を設定するなど、他のいくつかのことを行うために、JPanel呼び出されたのサブクラスを作成しました。問題は、JPanel の幅と高さを取得する必要があることです。JPanelを拡張するクラスで呼び出すと、両方とも が返されます。CanvasPanelViewpaintComponent()this.getWidth()this.getHeight()0

プロセスは、アクション リスナーの内部クラスで開始されます。

class MenuBarFileOpenListener implements ActionListener {
    public void actionPerformed(ActionEvent event) {
        File fileChooserReturnValue = view.showAndGetValueOfFileChooser();

        if (fileChooserReturnValue != null) {
            try {
                DocumentModel newDocument = new DocumentModel(ImageIO.read(fileChooserReturnValue), fileChooserReturnValue.getAbsolutePath(), fileChooserReturnValue.getName());
                model.addDocument(newDocument);
                view.addDocument(newDocument);
            } catch(IOException ex) {
                ex.printStackTrace();
            }
        }
    }
}

次に、次のaddDocument()ように呼び出されます。

public void addDocument(DocumentModel document) {
    menuBar_file_close.setEnabled(true);

    DocumentView newDocumentView = new DocumentView(document.getTitle(), documentsTabbedPaneCloseButtonListener);

    documentViews.add(newDocumentView); // add newDocumentView to ArrayList<DocumentView>
    newDocumentView.setDocument(document);
    documentsTabbedPane.add(newDocumentView.getCanvasPanelView());

    int newDocumentIndex = documentsTabbedPane.indexOfComponent(newDocumentView.getCanvasPanelView());

    documentsTabbedPane.setTabComponentAt(newDocumentIndex, newDocumentView.getTabPanel());
    documentsTabbedPane.setSelectedIndex(newDocumentIndex);
    newDocumentView.setBounds(document.getImageWidth(), document.getImageHeight());
}

public DocumentView(String title, ActionListener listener) {
    canvas = new CanvasPanelView();
    // more code...
}

setBounds()と呼ばれます:

public void setBounds(int imageWidth, int imageHeight) {
    sourceX1 = 0;
    sourceY1 = 0;
    sourceX2 = imageWidth;
    sourceY2 = imageHeight;

    // some math...

    destinationX1 = 0 + xMargin;
    destinationY1 = 0 + yMargin;
    destinationX2 = drawWidth - xMargin;
    destinationY2 = drawHeight - yMargin;
}

DocumentViewおよびその他のいくつかのラッパークラスですCanvasPanel。開いている各ドキュメントに関連するものをグループ化するだけです。

すべてがインスタンス化され、 に使用または追加されているように見えるJTabbedPaneので、理由がわからず、this.getWidth()this.getHeight()返し0ます。の終わりと の間で何かが起こっている可能性がsetBounds()ありpaintComponent()ます。

なぜそうthis.getWidth()してthis.getHeight()戻るの0ですか?

4

2 に答える 2