#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()
реальными методами рисования.