paint () в java-апплете вызывается дважды без причины

#java #applet #paint #paintcomponent

#java #апплет #Краски #paintcomponent

Вопрос:

Есть ли распространенная причина, по которой метод paint () может вызываться дважды без намерения. У меня есть следующий код:

 public void paint(Graphics g)
{
     //Graphics2D gg;
     //gg=(Graphics2D) g;

     drawMatrix(g);

}

        private void drawMatrix(Graphics g) {

       int side = 40;
       hex hexagon=new hex();
       for(int i = 0; i<9; i  ) 
          for(int k = 0; k<9; k  ){ 

            g.setColor(Color.lightGray);
            g.fill3DRect(i*side,k*side, side, side, true);
            if (matrix[i][k]!=null){System.out.println("i is " i " k is " k);
                g.setColor(Color.black);hexagon.DrawHexfromMatrix(g, i, k, Color.black);}
    }   
    }
  

hex — это класс, который расширяет polygon (для моделирования фигуры в виде шестиугольника), а DrawHexfromMatrix — это функция, которая рисует шестиугольник из индекса рисуемой матрицы (помещает шестиугольник в слот матрицы). Я могу предоставить весь код, если вы думаете, что это поможет, но пока я не понимаю, почему system.out.println выполняется дважды.(например, если [1] [2] и [2][3] не равны null, он выведет:

     i is 1 k is 2 
    i is 2 k is 3 
    i is 1 k is 2
    i is 2 k is 3  
  

Я думаю, это также влияет на мой рисунок, потому что иногда, хотя элемент существует в [i] [k], он не рисуется. (matrix — это шестнадцатеричная матрица).

Последующее редактирование: возможно ли каким-то образом, чтобы g.fill3DRect(i * side, k *side, side, side, side, true); перекрасить шестиугольники, которые я пытаюсь нарисовать с помощью hexagon.DrawHexfromMatrix(g, i, k, Color.black);???

Ответ №1:

Прежде всего, вы не должны рисовать непосредственно в JApplet .

Вы должны определить, JPanel который добавляется к JApplet . Вы рисуете в JPanel .

Во-вторых, вы должны использовать paintComponent() метод и вызвать поведение суперкласса, вот так.

 protected void paintComponent(Graphics g) {
    // Paint the default look.
    super.paintComponent(g);

    // Your custom painting here.
    g.drawImage(foregroundImage, x, y, this);
}
  

В-третьих, у вас нет контроля над тем, когда Swing запускает paintComponent() метод. Вы должны выполнить вычисления каким-либо другим методом и ограничить код в paintComponent() реальными методами рисования.