2016-05-31 12 views
1

Я хочу обратить определенную область на JPanel, как это (черная область, где я хочу JPanel быть перекрашен):ява перекрашивать множественной площадь

enter image description here

Ниже код, как я реализовал это. Он следует за курсором мыши и рисует круг в точке курсора мыши. Размер рамки и панели 300 * 300.

public class MiniGraphicTest extends JPanel{ 

private static final long serialVersionUID = 1L; 

public int x,y; 
public MiniGraphicTest() { 
    super(); 
    x = -1; 
    y = -1; 
    addMouseMotionListener(new MouseMotionAdapter(){ 
     @Override 
     public void mouseMoved(MouseEvent m){ 
      x = m.getX()-25; 
      y = m.getY()-25; 
      repaint(100,100,100,100); 
      repaint(200,200,100,100); 
     } 
    }); 
} 
protected void paintComponent(Graphics g){ 
    super.paintComponent(g); 
    ////////////////////// 
    //DO NOT MODIFY HERE// 
    ////////////////////// 
    //Draw gridline 
    int width = this.getWidth(); 
    int height = this.getHeight(); 
    g.setColor(Color.BLACK); 
    for(int i=100;i<width;i+=100){ 
     g.drawLine(i, 0, i, height); 
    } 
    for(int i=100;i<height;i+=100){ 
     g.drawLine(0, i, width, i); 
    } 
    ////////////////////// 
    //put test code here// 
    ////////////////////// 
    if(x == -1&&y==-1) return;//initially draw nothing 
    g.fillOval(x, y, 50, 50); 
} 
}//main function is just showing the panel. nothing special 
public static void main(String[] args) { 
    JFrame jf = new JFrame("Test"); 
    MiniGraphicTest test = new MiniGraphicTest(); 
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    test.setPreferredSize(new Dimension(300, 300)); 
    jf.setResizable(false); 
    jf.add(test); 
    jf.pack(); 
    jf.setVisible(true); 
} 

Результатом этого кода, как это:

enter image description here

Он перерисовывает вне зоны перерисовать. Можете ли вы объяснить мне, почему это произошло и как это решить?

PS. Код полностью работает хорошо, когда в mouseMoved вызывается только однократное переименование (100,100,100,100).

Спасибо

+1

Посмотрите, может ли эта тема вам помочь: http://stackoverflow.com/questions/32815493/custom-painting-of-a-swing-component-with-multiple-calls-to-repaint – Berger

+1

рисовать круг только если мышь находится внутри необходимых квадратов. –

+0

@Berger Спасибо за ссылку. Я понимаю, что множественный метод repaint() будет «каким-то образом обработан» и будет перерисовываться только один раз, но он не объясняет, почему он перерисовывает нежелательную область, если только «процесс» не включит эту область. – minolee

ответ

1

Я думаю, Решение Fast Snail - это правильный ответ в целом. Если у вас динамическая ситуация с динамическим размером доски или около того, вы можете рассмотреть круг рисования , только если мышь находится внутри необходимых квадратов в соответствии с рекомендациями.

Несколько звонков repaint делает только большую площадь repaint, чтобы включить в себя все области, которые вы указали при многочисленных вызовах repaint.

Но если у вас есть этот маленький совет с 9 клетками, я думаю, что это быстрое решение для вашей ситуации, чтобы не сделать последующие вызовы для repaint:

public class MiniGraphicTest extends JPanel { 

    private static final long serialVersionUID = 1L; 

    public int x, y; 
    boolean flag; 

    public MiniGraphicTest() { 
     super(); 
     x = -1; 
     y = -1; 
     addMouseMotionListener(new MouseMotionAdapter() { 
      @Override 
      public void mouseMoved(MouseEvent m) { 
       x = m.getX() - 25; 
       y = m.getY() - 25; 
       if(flag) { 
        repaint(100, 100, 100, 100); 
       } else { 
        repaint(200, 200, 100, 100); 
       } 
       flag = !flag; 
      } 
     }); 
    } 
    // Other codes of yours 
} 

Good Luck.

0

repaint() только помечает компонент будет перекрасили в EDT. Последующие вызовы ничего не меняют.

Вызов repaint с координатами (прямоугольник) отметьте компонент, который должен быть перекрашен только внутри прямоугольника. Последующие вызовы могут только изменять (расширять) этот прямоугольник.

Если вы хотите сделать clip чертежом в какой-либо области, вам необходимо указать, что в вашем методе paintComponent.

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