2013-05-11 80 views
0

编辑:我已经解决了底层问题。我用SwingUtilities.invokeLater()来解决这个问题。我的other question为有兴趣的人提供了更多信息。为什么getWidth()和getHeight()在调用paintComponent()之前返回0?

我有一个显示在paintComponent()g.drawImage()上的JPanel的图像的GUI。我写了一个叫做CanvasPanelViewJPanel的子类来覆盖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; 
} 

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

一切似乎被实例化并使用或添加到JTabbedPane,所以我不知道为什么this.getWidth()this.getHeight()返回0。在setBounds()paintComponent()之间可能会出现某种情况。

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

+0

'getWith()'返回0,因为当时的组件*是*零大小,但为什么,我不知道。我不认为你已经提出了一个可回答的问题,因为你可能遗漏了太多,这对于了解你为什么会看到你的错误以及留下很多与问题无关的代码是必要的。如果您很快就没有很好的答案,请考虑创建并发布[sscce](http://sscce.org)。 – 2013-05-11 14:24:40

+1

相关的事情提,并与您SSCCE显示包括保持图像显示组件,以及如何将组件添加到容器中的容器的布局。 – 2013-05-11 14:31:03

+0

同意,正确的,那么答案可能很简单 – mKorbel 2013-05-11 15:00:46

回答

0

你写了一个类,CanvasPanelView。本课程延伸至JPanel。它的出现,在你执行你setBounds没有提到的JPanel成员,getHeight()getWidth()参考。因此,底层对象的高度为0,宽度为0。

如果您想使用JPanel值的高度和宽度,然后你只需要确保你给他们分配值。

1

而不是做一个'setBounds',为什么不把你的documentView一个Panel(BorderLayout),在一个位置,如BorderLayout.CENTER?

或者,您可以根据图像尺寸设置文档视图的最小尺寸和首选尺寸。

相关问题