#java #swing
#java #качать
Вопрос:
Итак, я пытался разобраться в этом, и я не уверен, как это сделать… Я работал над этим фрагментом кода здесь:
public class Main extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponent(g);
drawGrass(g);
drawFlowers(g);
}
private void drawGrass(Graphics g) {
super.paintComponent(g);
Color brightGreen= new Color(60,176,31);
g.setColor(brightGreen);
g.setColor(brightGreen);
g.fillRect(0,300,500,500);
}
private void drawFlowers(Graphics g) {
super.paintComponent(g);
Color pinkFlower = new Color(225,153,153);
g.setColor(pinkFlower);
g.fillRect(25,320,8,8);
g.fillRect(320,380,8,8);
g.fillRect(110,355,8,8);
}
Я понял, что он будет рисовать только цветы, потому что он переопределяет drawGrass. Как мне сделать так, чтобы он не переопределял мой другой код?
Комментарии:
1. Не вызывайте
super.paintComponent()
свойdrawGrass
drawFlowers
метод or. Достаточно одного раза в вашемpaintComponent
.2. Вы смешиваете здесь много концепций, я действительно рекомендую пройти надлежащий учебник по Swing.
private
иvoid
не влияют на то, как выполняется метод, они только указывают, что он возвращает и откуда вы можете его вызвать. Вы также вызываетеsuper.paintComponent(g)
3 раза, и каждый раз он очищает вашу графику. Похоже, вы плохо разбираетесь в потоке управления, поэтому я рекомендую вам попробовать нарисовать блок-схему, показывающую, где находится поток на каждом шаге и что он делает.
Ответ №1:
Начните с простого. Если вы используете только один метод, он должен работать нормально.
public class Main extends JPanel {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
// draw grass
Color brightGreen= new Color(60,176,31);
...
// draw flower
Color pinkFlower = new Color(225,153,153);
...
}
}
Итак, если вы хотите извлечь два цвета и рисунки в методы, вам нужно только скопировать эти точные строки между комментариями (вы даже можете использовать свои функции IDE для «Извлечения метода»), а не добавлять еще super.paintComponent(g)
один (который очищает панель)
Что касается названия вопроса, private void
на самом деле это не проблема или не связано с решением.
Комментарии:
1. проблема в том, что требуется использовать несколько методов, поэтому я не уверен, как это сделать…
2. Я объясняю концепцию. Также упоминается решение.
Ответ №2:
Проблема в вашем super.paintComponent(g) в первой строке метода drawFlowers (и дублируется в методе drawGrass). Вы не можете этого сделать. Удалите его, попробуйте еще раз, и он будет работать. Помните, что когда вы вызываете один метод внутри другого метода, весь ваш код выглядит как «внутри первого метода»… Итак, ваш код теперь выглядит так
public void paintComponent(Graphics g) {
super.paintComponent(g);//fist call.
super.paintComponent(g);//duplicated, delete it on drawGrass method.
Color brightGreen= new Color(60,176,31);
g.setColor(brightGreen);
g.setColor(brightGreen);
g.fillRect(0,300,500,500);
super.paintComponent(g);//this is biggest problem, this overrides all work, remove it.
Color pinkFlower = new Color(225,153,153);
g.setColor(pinkFlower);
g.fillRect(25,320,8,8);
g.fillRect(320,380,8,8);
g.fillRect(110,355,8,8);
}