为什么getWidth()和getHeight()在调用paintComponent()之前返回0?

时间:2013-05-11 14:21:55

标签: java swing jpanel paintcomponent

  

编辑: 我已解决了潜在问题。我使用SwingUtilities.invokeLater()来解决问题。我的other question为感兴趣的人提供了更多信息。

我有一个GUI,在JPanel paintComponent() g.drawImage() JPanel上显示图像。我编写了一个名为CanvasPanelView的{​​{1}}子类来覆盖paintComponent()并执行其他一些操作,例如设置绘制图像的范围。问题是我需要获得JPanel的宽度和高度,当我在扩展JPanel的类中调用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;
}

DocumentViewCanvasPanel的一个包装类以及其他一些东西 - 它只是将每个打开文档的内容组合在一起。

似乎所有内容都已实例化并使用或添加到JTabbedPane,因此我不知道为什么this.getWidth()this.getHeight()会返回0。也许在setBounds()paintComponent()之间发生了一些事情。

为什么this.getWidth()this.getHeight()会返回0

2 个答案:

答案 0 :(得分:1)

为什么不将 documentView 放在Panel(BorderLayout)中,而不是做'setBounds',如BorderLayout.CENTER?

或者,您可以根据图片尺寸设置 documentview 的最小尺寸和首选尺寸。

答案 1 :(得分:0)

你写了一个班级CanvasPanelView。此类扩展JPanel。看来,在您setBounds的实施中,您没有提及JPanelgetHeight()所指的getWidth()成员。因此,底层对象的高度为0,宽度为0。

如果您希望将JPanel值用于高度和宽度,则只需确保为其分配值。