【问题标题】:JScrollPane holding a JPanel is buggy持有 JPanel 的 JScrollPane 有问题
【发布时间】:2014-02-06 02:13:07
【问题描述】:

最近我开始为我的游戏制作地图编辑器,我遇到了一些我已经修复的问题。我现在的问题是我有一个 JFrame(主界面)。在那个 JFrame 中,我有一个 JScrollPane,其中包含我的客户端(一个 JPanel)。由于我不能发布图片,我将发布图片的链接。 图形界面图片:http://i.imgur.com/yPNAlYS.png

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

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

这是我的 Client.java|MapEditor 类有点大,可以在这里发布,但请随时询问 sn-ps 或更多信息。

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;
    }
}

【问题讨论】:

    标签: java swing


    【解决方案1】:

    这与滚动窗格无关,而是与您如何完成自定义绘画...

    基本上,这...

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

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

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

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

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

    【讨论】:

    • 感谢您的回答!看,我不知道。我一直认为我可以在任何地方使用paint()。我不知道 JPanel 包含了paintComponent。这就是我现在痛苦的样子。这就是你想让我改变它的方式吗?公共无效paintComponent(图形g){ super.paintComponent(g); Graphics2D gg = (Graphics2D) g; map.drawCurrentMap(gg); }
    • 是的,但我是 paintComponent protected,其他人没有理由调用你的方法 ;)
    • 如果它有助于解决问题,请accept回答。您可能还想重新访问您的earlier questions 并选择最好的打勾..
    猜你喜欢
    • 2016-05-28
    • 2013-06-22
    • 1970-01-01
    • 2020-06-19
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    相关资源
    最近更新 更多