2014-02-06 4 views
0

Недавно я начал создавать Редактор карт для своей игры, и я столкнулся с несколькими проблемами, которые я как бы исправил. Моя текущая проблема прямо сейчас заключается в том, что у меня есть JFrame (основной интерфейс). Внутри этого JFrame у меня есть JScrollPane, в котором хранится мой клиент (JPanel). Так как я не могу опубликовать изображение, я отправлю ссылку на изображение. Изображение GUI: http://i.imgur.com/yPNAlYS.pngJScrollPane, несущий JPanel, является ошибкой

Здесь я добавляю своего клиента (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); 
} 

ломает краску цепи. Контекст Graphics - это общий ресурс, а это означает, что все окрашивание в заданном цикле краски имеет то же самое содержание Graphics.

Живопись также представляет собой сложную цепочку методов, которая, как вы обнаружили, действительно легко сломать.

Вместо этого, вы должны переопределить paintComponent и выполнить пользовательскую картину там, убедившись, что вы звоните super.paintComponent первый

Взгляните на Performing Custom Painting и Painting in AWT and Swing для более подробной информации

+0

Спасибо за ваш ответ! Понимаете, я этого не знал. Я всегда думал, что могу просто использовать paint() где угодно. Я не знал, что JPanel упакован с paintComponent. Вот как выглядит моя боль сейчас. Так вы хотели, чтобы я изменил его? public void paintComponent (Графика 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

Смежные вопросы