Java JScrollPane中的图像原点位于JScrollPane原点上方

Java JScrollPane中的图像原点位于JScrollPane原点上方,java,swing,jscrollpane,bufferedimage,jviewport,Java,Swing,Jscrollpane,Bufferedimage,Jviewport,我是一个编程新手,所以如果这是一个明显的问题,请原谅我,但我正在开发一个应用程序,其中包括构建甘特图 我的问题是其中一个面板(namesPanel)显示了相关的图像,但顶部缺少大约10个像素。我可以通过在绘图时向y变量的起始点添加10个像素来获得正确的图像,但这感觉不太对劲,如果有bug,我现在就想将其压扁 该图表实际上由三个嵌套在JPanel中的不同JScrollPanes组成,并以GridBagLayout排列: datesPanel = new JScrollPane();

我是一个编程新手,所以如果这是一个明显的问题,请原谅我,但我正在开发一个应用程序,其中包括构建甘特图

我的问题是其中一个面板(namesPanel)显示了相关的图像,但顶部缺少大约10个像素。我可以通过在绘图时向y变量的起始点添加10个像素来获得正确的图像,但这感觉不太对劲,如果有bug,我现在就想将其压扁

该图表实际上由三个嵌套在JPanel中的不同JScrollPanes组成,并以GridBagLayout排列:

    datesPanel = new JScrollPane();
    datesPane = new GanttPanel();
    panelList.put(datesPanel, datesPane);
    c = new GridBagConstraints();
    c.fill = GridBagConstraints.BOTH;
    c.gridx = 1;
    c.gridy = 0;
    c.weightx = 0.1;
    c.weighty = 0.1;
    add(datesPanel, c);

    namesPanel = new JScrollPane();
    namesPane = new GanttPanel();
    panelList.put(namesPanel, namesPane);
    c = new GridBagConstraints();
    c.fill = GridBagConstraints.BOTH;
    c.gridx = 0;
    c.gridy = 1;
    c.weightx = 0.18;
    c.weighty = 1;
    add(namesPanel, c);

    ganttPanel = new JScrollPane();
    ganttPane = new GanttPanel();
    panelList.put(ganttPanel, ganttPane);
    c = new GridBagConstraints();
    c.fill = GridBagConstraints.BOTH;
    c.gridx = 1;
    c.gridy = 1;
    c.weightx = 1;
    c.weighty = 1;
    add(ganttPanel, c);

    for (JScrollPane j : panelList.keySet()) {
        GanttPanel g = panelList.get(j);
        j.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        j.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
        j.addMouseListener(listener);
        LineBorder b = (LineBorder) BorderFactory.createLineBorder(DARK);
        j.setBorder(b);
        j.setViewportView(g);
    }

    namesImage = (BufferedImage) namesPane.createImage(canvasWidth, canvasDepth);
    namesPane.setImage(namesImage);
    namesGraphics = (Graphics2D) namesImage.getGraphics();

    datesImage = (BufferedImage) datesPane.createImage(canvasWidth, canvasDepth);
    datesPane.setImage(datesImage);
    datesGraphics = (Graphics2D) datesImage.getGraphics();        

    ganttImage = (BufferedImage) ganttPane.createImage(canvasWidth, canvasDepth);
    ganttPane.setImage(ganttImage);
    graphics = (Graphics2D) ganttImage.getGraphics();
这样做的原因是允许用户使用鼠标在GantChart上滚动,因此稍后namesPanel和datesPanel的滚动条设置为与GantChart相同的JScrollBar实例

然后,该程序继续调整所有图像的大小,以节省内存-它们最初都设置为相同大小的原因是,需要进行某些图形计算来设置最终图像的边界,这意味着创建一个图像以从中获取图形对象。此外,我不知道如何将图像放大:

 /**
 * Sets the boundaries of all the panels and moves them into position
 */
private void setBounds()
{
    int xStart = canvasWidth - xOffset;
    int yStart = canvasDepth - yOffset;
    Container dad = getParent();
    Rectangle dadRect = dad.getBounds();
    Dimension ganttSize = new Dimension(dadRect.width - xOffset, dadRect.height - yOffset);

    ganttImage = ganttImage.getSubimage(0, 0, xStart, yStart);
    ganttPane.setPreferredSize(new Dimension(xStart, yStart));
    ganttPanel.setPreferredSize(ganttSize);

    datesImage = datesImage.getSubimage(0, 0, xStart, (yOffset + yUnit));
    datesPane.setPreferredSize(new Dimension(xStart, yOffset));
    datesPanel.setPreferredSize(new Dimension(xStart, yOffset));

    namesImage = namesImage.getSubimage(0, 0, xOffset, yOffset);
    namesPane.setPreferredSize(new Dimension(xOffset, yStart));
    namesPanel.setPreferredSize(new Dimension(xOffset, yStart));
    namesPanel.setBackground(DARK);

}
最后,程序实际绘制了图像-我知道该区域需要一些重构到子方法中,但这里是:

    /**
 * Draw the bars of the Gantt Chart
 */
private void drawBars()
{
    Calendar from = model.getFrom();
    int i = 0;
    for (int y = 0; y < canvasDepth && i < elements.size(); y += yUnit) {
        GanttElement ge = elements.get(i);
        //TODO refactor this section into multiple methods
        int startPoint = 0;
        int endPoint = 0;
        try {
            startPoint = (model.calculateRange(from, ge.getFrom()) * xUnit);
            if (startPoint % 10 != 0) {
                startPoint -= startPoint % 10;
            }
            endPoint = (model.calculateRange(from, ge.getTo()) * xUnit);
        }
        catch (IllegalArgumentException | BadDateException e) {
            /*TODO add a badDateResponse method to the GanttElement interface
             *so that the program can handle a bad date request appropriately 
             */
            System.out.println(e + " " + ge.getName());
        }
        for (int x = 0; x <= endPoint; x += xUnit) {
            if (x == 0) {
                namesGraphics.setColor(Color.WHITE);
                namesGraphics.drawString(ge.getName(), (2 * getSeparatorX()), y);
            }
            if (i % 2 == 0) {
                graphics.setColor(lightBlock);
            }
            else {
                graphics.setColor(darkBlock);
            }
            if (x >= startPoint) {
                GanttBlock block = new GanttBlock(x + (separatorX / 2), y, blockWidth, rowHeight, i);
                blocks.add(block);
                graphics.fill(block);
            }
        }
        i++;
    }
}
/**
*绘制甘特图的条形图
*/
专用空心牵引杆()
{
Calendar from=model.getFrom();
int i=0;
对于(int y=0;y
我被难住了——我找不到导致问题的线路,我看不出我处理名称面板的方式和处理其他面板的方式有什么区别。改变影响图像放置和尺寸的字段也没有帮助。操作JViewport也不起作用:-(

再次表示歉意,如果这太长了,但我不知道该关注代码的哪个方面