Я хочу обратить определенную область на JPanel, как это (черная область, где я хочу JPanel быть перекрашен):ява перекрашивать множественной площадь
Ниже код, как я реализовал это. Он следует за курсором мыши и рисует круг в точке курсора мыши. Размер рамки и панели 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);
}
Результатом этого кода, как это:
Он перерисовывает вне зоны перерисовать. Можете ли вы объяснить мне, почему это произошло и как это решить?
PS. Код полностью работает хорошо, когда в mouseMoved вызывается только однократное переименование (100,100,100,100).
Спасибо
Посмотрите, может ли эта тема вам помочь: http://stackoverflow.com/questions/32815493/custom-painting-of-a-swing-component-with-multiple-calls-to-repaint – Berger
рисовать круг только если мышь находится внутри необходимых квадратов. –
@Berger Спасибо за ссылку. Я понимаю, что множественный метод repaint() будет «каким-то образом обработан» и будет перерисовываться только один раз, но он не объясняет, почему он перерисовывает нежелательную область, если только «процесс» не включит эту область. – minolee