我有一个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);
}
}