Как работать с частной пустотой при использовании графики?

#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);    
}