ユーザーがjScrollPane内に画像を配置できるようにするJavaアプリケーションがあります。アプリケーションは、グリッドにスナップするボックスを表示して、タイルが配置される場所、オプションに関する情報、およびペイン全体の位置を示します。Lion を実行している Mac でプログラムを実行しています。トラックパッドを使用して水平方向にスクロールすると、カーソルの周りに描画された情報が更新され、カーソルとともに移動します。ただし、垂直方向にスクロールしている間、タイルが配置される場所を示す情報とボックスは、カーソルの位置で更新されるのではなくドラッグされ、マウスが移動されるまで更新されずにそのまま残ります。また、矢印キーを使用して垂直方向または水平方向にスクロールしている間、情報とボックスは再描画されません。
問題はペイントメソッドを呼び出していないことだと思いますが、スクロール中にペイントメソッドを呼び出す方法や、トラックパッドで水平方向にのみスクロールしているときにまだ呼び出しているように見える理由がわかりません。以下は、jScrollPane が初期化されるコードとペイント メソッドです。
スクロールペイン:
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);
}
}