gpt4 book ai didi

java - JScrollPane 持有 JPanel 是有问题的

转载 作者:行者123 更新时间:2023-12-01 23:12:58 26 4
gpt4 key购买 nike

最近,我开始为我的游戏制作 map 编辑器,遇到了一些问题,我已经解决了这些问题。我现在的问题是我有一个 JFrame (主界面)。在该 JFrame 中,我有一个 JScrollPane,其中包含我的客户端(JPanel)。由于无法发布图片,我将发布图片链接。GUI图像:/image/Cd1Pu.png

这是我将客户端(JPanel)添加到 JScrollPane 的位置。

//======== mainScrollPane ========
{
client.setPreferredSize(client.getSize());
mainScrollPane.setPreferredSize(client.getSize());
mainScrollPane.setViewportView(client);
mainScrollPane.add(client);

这是我的 Client.java|MapEditor 类有点大,无法在此处发布,但请随时询问片段或更多信息。

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.JPanel;

public class Client extends JPanel implements Runnable, MouseListener, MouseMotionListener {

private static final long serialVersionUID = 1L;
private Thread animationThread;
protected Map map;
private Tile tile;
public int mX, mY;

public Client() {
init();
setVisible(true);
setFocusable(true);
animationThread = new Thread(this);
animationThread.start();
}

public void init() {
addMouseListener(this);
addMouseMotionListener(this);
ImageHandler.loadImages();
map = new Map();
setSize(1000, 500);
}

public void run() {
while (animationThread != null) {
repaint();
try {
Thread.sleep(4);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

public void paint(Graphics g) {
Graphics2D gg = (Graphics2D) g;
map.drawCurrentMap(gg);

}

@Override
public void mouseClicked(final MouseEvent e) {
//final Point p = e.getPoint();
//final int x = p.x / 25;
//final int y = p.y / 25;
//map.getTileAt(x, y).setGraphicId(MapEditor.id);
//map.getTileAt(x, y).setBlocked(true);
map.getTiles().set(map.getTileIndex(mX, mY), new Tile(mX, mY, true, MapEditor.id));
System.out.println(map.getTiles().get(map.getTileIndex(mX, mY)).toString());

}

@Override
public void mouseEntered(MouseEvent arg0) {
// TODO Auto-generated method stub

}

@Override
public void mouseExited(MouseEvent arg0) {
// TODO Auto-generated method stub

}

@Override
public void mousePressed(MouseEvent e) {;

}

@Override
public void mouseReleased(MouseEvent arg0) {
// TODO Auto-generated method stub

}

@Override
public void mouseDragged(MouseEvent e) {

}

@Override
public void mouseMoved(MouseEvent e) {
mX = e.getX()/25;
mY = e.getY()/25;
}
}

最佳答案

这与滚动 Pane 无关,而是与您完成自定义绘画的方式有关...

基本上,这...

public void paint(Graphics g) {
Graphics2D gg = (Graphics2D) g;
map.drawCurrentMap(gg);
}

打破了油漆链的要求。 Graphics 上下文是共享资源,这意味着给定绘制周期内的所有绘制都共享相同的 Graphics 内容。

绘画也是一个复杂的方法链,正如您所发现的,它非常容易被破坏。

相反,您应该重写 paintComponent 并在那里执行自定义绘画,确保首先调用 super.paintComponent

看看Performing Custom PaintingPainting in AWT and Swing了解更多详情

关于java - JScrollPane 持有 JPanel 是有问题的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21592705/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com