2014-02-06 88 views
0

最近我開始爲我的遊戲製作地圖編輯器,並且遇到了一些我已經修復的問題。我目前的問題是我有一個JFrame(主界面)。在該JFrame中,我有一個包含我的客戶端(JPanel)的JScrollPane。由於我無法發佈圖片,因此我會發布圖片鏈接。 GUI的圖像:http://i.imgur.com/yPNAlYS.pngJScrollPane持有JPanel是buggy

這是我將我的客戶端(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; 
    } 
} 

回答

3

這有什麼好做滾動窗格,但你怎麼做你的風俗畫...

基本上,這...

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

是打破油漆連鎖要求。 A Graphics上下文是共享資源,這意味着在指定的繪製週期內繪製的所有內容都共享相同的內容。

繪畫也是一個複雜的方法鏈,正如你發現的那樣,它很容易打破。

相反,你應該重寫paintComponent有執行你的風俗畫,確保您撥打super.paintComponent第一

看看Performing Custom PaintingPainting in AWT and Swing更多細節

+0

謝謝您的回答!看,我不知道。我一直認爲我可以在任何地方使用paint()。我不知道JPanel擠滿了paintComponent。 這就是我現在的痛苦。這是你想讓我改變它嗎? public void paintComponent(Graphics g){ \t \t super.paintComponent(g); \t \t Graphics2D gg =(Graphics2D)g; \t map.drawCurrentMap(gg); \t} – Yuriah

+0

是的,但我使'paintComponent'' protected',沒有任何其他人調用您的方法的原因;) – MadProgrammer

+0

Aha XD再次感謝人,解決了我的問題。 – Yuriah