java如何在JPanel中只显示可见区域
java How to display only visible area in JPanel
所以我在 JScrollPane 中安装了 JPanel。有没有办法在 JPanel 上只显示可见区域?现在我的代码看起来像这样:
public void paintComponent(Graphics g)
{
super.paintComponent(g);
for(int i = 0; i < m_xTiles; i++)
{
for(int j = 0; j < m_yTiles; j++)
{
m_mapTiles.get(i).get(j).DrawImage(g);
}
}
}
这不是我想要的东西,因为它显示了所有内容,而且当我想制作一张非常大的地图时,移动速度非常慢。我想在屏幕上获得可见矩形 - 四个像素的位置,然后我将计算自己的 x 和 y :)
通常情况下,图形系统会关心可见边界之外的裁剪操作,因此这些操作变为空操作并且并不昂贵。所以在大多数情况下你不需要处理这些信息,因为图形操作是绘画时最昂贵的部分。
但是,有时您可能会遇到这样的情况,即您在 在 调用 Graphics
对象之前执行的操作变得昂贵,即如果您有一个非常大但只有部分可见的组件(如您所述)。在这种情况下,访问裁剪信息以执行手动跳过可能很有用,尤其是在平铺区域时,因此计算要处理的项目相当容易:
public void paintComponent(Graphics g) {
super.paintComponent(g);
// I assert equal tiling of the actual size here, otherwise you may define
// the tile sizes as constants and calculate preferredSize as tileWidth*m_xTiles
// and tileHeight*m_yTiles, respectively
final int tileWidth=getWidth()/m_xTiles;
final int tileHeight=getHeight()/m_yTiles;
Rectangle clip = g.getClipBounds();
int firstX, lastX, firstY, lastY;
if(clip == null) {
firstX=0; lastX=m_xTiles-1;
firstY=0; lastY=m_yTiles-1;
}
else {
firstX=clip.x/tileWidth; lastX=(clip.x+clip.width)/tileWidth;
firstY=clip.y/tileHeight; lastY=(clip.y+clip.height)/tileHeight;
}
// note that the loop condition is <= now to handle partially visible tiles
for(int i = firstX; i <= lastX; i++)
{
for(int j = firstY; j <= lastY; j++)
{
m_mapTiles.get(i).get(j).DrawImage(g);
}
}
}
所以我在 JScrollPane 中安装了 JPanel。有没有办法在 JPanel 上只显示可见区域?现在我的代码看起来像这样:
public void paintComponent(Graphics g)
{
super.paintComponent(g);
for(int i = 0; i < m_xTiles; i++)
{
for(int j = 0; j < m_yTiles; j++)
{
m_mapTiles.get(i).get(j).DrawImage(g);
}
}
}
这不是我想要的东西,因为它显示了所有内容,而且当我想制作一张非常大的地图时,移动速度非常慢。我想在屏幕上获得可见矩形 - 四个像素的位置,然后我将计算自己的 x 和 y :)
通常情况下,图形系统会关心可见边界之外的裁剪操作,因此这些操作变为空操作并且并不昂贵。所以在大多数情况下你不需要处理这些信息,因为图形操作是绘画时最昂贵的部分。
但是,有时您可能会遇到这样的情况,即您在 在 调用 Graphics
对象之前执行的操作变得昂贵,即如果您有一个非常大但只有部分可见的组件(如您所述)。在这种情况下,访问裁剪信息以执行手动跳过可能很有用,尤其是在平铺区域时,因此计算要处理的项目相当容易:
public void paintComponent(Graphics g) {
super.paintComponent(g);
// I assert equal tiling of the actual size here, otherwise you may define
// the tile sizes as constants and calculate preferredSize as tileWidth*m_xTiles
// and tileHeight*m_yTiles, respectively
final int tileWidth=getWidth()/m_xTiles;
final int tileHeight=getHeight()/m_yTiles;
Rectangle clip = g.getClipBounds();
int firstX, lastX, firstY, lastY;
if(clip == null) {
firstX=0; lastX=m_xTiles-1;
firstY=0; lastY=m_yTiles-1;
}
else {
firstX=clip.x/tileWidth; lastX=(clip.x+clip.width)/tileWidth;
firstY=clip.y/tileHeight; lastY=(clip.y+clip.height)/tileHeight;
}
// note that the loop condition is <= now to handle partially visible tiles
for(int i = firstX; i <= lastX; i++)
{
for(int j = firstY; j <= lastY; j++)
{
m_mapTiles.get(i).get(j).DrawImage(g);
}
}
}