編集: 根本的な問題を解決しました。私
SwingUtilities.invokeLater()
は問題を解決するために使用されます。私の他の質問は、興味のある人のためのより多くの情報を提供します。
JPanel
で画像paintComponent()
を表示する GUI がありますg.drawImage()
。オーバーライドして、画像が描画される場所の境界を設定するなど、他のいくつかのことを行うために、JPanel
呼び出されたのサブクラスを作成しました。問題は、JPanel の幅と高さを取得する必要があることです。JPanelを拡張するクラスで呼び出すと、両方とも が返されます。CanvasPanelView
paintComponent()
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
ですか?