在垂直滚动而不是水平滚动时绘制“卡住”

时间:2013-01-09 20:07:36

标签: java swing jscrollpane

我有一个java应用程序,允许用户在jScrollPane中放置图像。应用程序显示一个框,该框可以捕捉到网格以显示图块的放置位置,以及有关选项和整个窗格中位置的一些信息。我正在运行Lion的Mac上运行该程序。使用触控板水平滚动时,光标周围绘制的信息会更新并随光标移动。但是,在垂直滚动指示将放置图块的位置的信息和框时,拖动而不是使用光标的位置进行更新,使其保持在何处并且不会更新,直到鼠标移动为止。使用箭头键垂直或水平滚动时,信息和框也不会重新绘制。

我假设问题在于它没有调用paint方法,但是我不知道如何在滚动时调用paint方法,或者为什么它仍然只在使用触控板水平滚动时调用它。下面是初始化jScrollPane的代码和paint方法。

的ScrollPane:

public class Map extends JFrame
{
    private static final long serialVersionUID = 8527533451039189417L;
    final int AREA_SIZE_X = 100;
    final int AREA_SIZE_Y = 100;
    JFrame sWindow;
    mapPanel mPanel;
    JScrollPane mScrollPane;

    Map() throws IOException
        {
            mPanel = new mapPanel(sWindow);
            this.getContentPane().setLayout(new BorderLayout());
            mScrollPane = new JScrollPane(mPanel);
            this.getContentPane().add(mScrollPane);
            mPanel.requestFocus(); 
            this.setTitle("Map maker");
            this.setLocation(400, 0);
            this.setResizable(false);

            this.pack();
        }
}

绘画方法:

    public void paintComponent(Graphics g)
        {
            super.paintComponent(g);
            g.setColor(Color.white);
            g.fillRect(0, 0, AREA_SIZE_X * 20, AREA_SIZE_Y * 20);
            mouseLocation = this.getMousePosition();

            if (this.hasFocus() && this.contains(mouseLocation))
                {
                    g.drawImage(bFS.get(sWindow.getSelected()), mouseLocation.x - 20, mouseLocation.y - 20, this);
                    g.setColor(Color.red);
                    g.drawRect(((mouseLocation.x - 10) / 20) * 20, ((mouseLocation.y - 10) / 20) * 20, 20, 20);
                    String xDisp = "x: " + ((mouseLocation.x - 10) / 20);
                    String yDisp = "y: " + ((mouseLocation.y - 10) / 20);
                    g.drawString(xDisp, mouseLocation.x - 20, mouseLocation.y + 25);
                    g.drawString(yDisp, mouseLocation.x - 20, mouseLocation.y + 40);
                    String layerDisp = "Layer: " + sWindow.isLayered();
                    g.drawString(layerDisp, mouseLocation.x - 20, mouseLocation.y + 55);
                    int tempCounter = 0;
                    while (tempCounter < 4 && tiles[((mouseLocation.x - 10) / 20)][((mouseLocation.y - 10) / 20)][tempCounter] != -1)
                        {
                            tempCounter++;
                        }
                    String layerLevelDisp = "Num Layers: " + tempCounter;
                    g.drawString(layerLevelDisp, mouseLocation.x - 20, mouseLocation.y + 70);

                }
        }

0 个答案:

没有答案