Не могу нарисовать линию (метод: paintComponent) - Java - PullRequest
2 голосов
/ 06 мая 2019

Я пытаюсь нарисовать линию в JFrame, но линия не рисуется.

Я пытался использовать метод setOpaque(true) для contentPane, lblNewLabel и l, но ничего не изменилось. Я также пытался позвонить repaint(); вне этого класса, но ситуация все та же. Вот код:

public class DrawingClass extends JFrame
{
    private JPanel contentPane;
    public DrawingClass(int n, int s, int p) {
        Line l= new Line();
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        setBounds(700, 300, 480, 640);
        contentPane = new JPanel();
        contentPane.setOpaque(true);
        setResizable(false);
        setContentPane(contentPane);
        contentPane.setLayout(null);
        JLabel lblNewLabel = new JLabel("");
        lblNewLabel.setIcon(new ImageIcon("image.png"));
        lblNewLabel.setBounds(0, 0, 480, 640);
        contentPane.add(lblNewLabel);
        l.setBounds(0,0,480,640);
        contentPane.add(l);
        repaint();
    }

    class Line extends JPanel
    {
        public void paintComponent(Graphics g) {
            g.setColor(Color.BLUE);
            g.fillRect(10, 10, 15, 12);
        }
    }
}

Я ожидаю небольшую линию в левом верхнем углу JFrame, над фоновыми обоями, но ничего не происходит. Показывает только обои.

1 Ответ

1 голос
/ 06 мая 2019

В вашем коде есть несколько ошибок:

  1. Вы расширяете JFrame, но не изменяете его поведение, так почему вы это делаете?JFrame - это жесткий компонент, поэтому никогда не стоит его расширять, вместо этого создавайте свой графический интерфейс на основе JPanel s.См .: Расширяет JFrame против создания его внутри программы

  2. Не устанавливайте явно размер JFrame, вызовите pack() для него и вместо этогопереопределить getPreferredSize из JPanel, см .: Следует ли мне избегать использования методов set (Preferred | Maximum | Minimum) Size в Java Swing?

  3. Вам не нужно звонить setOpaque(...) в этом случае.

  4. Не используйте null-layout, это может привести к странным ошибкам , потому что null Layout is Evil и нахмурились

  5. У нас нет доступа к вашему изображению, поэтому мы не можем проверить ImageIcon, и это такжене имеет отношения к вашему вопросу.Однако вы должны загружать ваши изображения как ресурсы

  6. Не устанавливайте явно границы каждого элемента, это связано с точкой (4) и вы должны использовать Layout Manager или их комбинации, чтобы получить желаемый GUI.

  7. Не звоните repaint() таким образом, это не имеет никакого эффекта, он должен перекрасить ваш пользовательский интерфейс, когда в нем есть изменения.Однако в начале вашей программы изменений нет.

  8. Вы разрываете цепочку рисования, не вызывая super.paintComponent(...) внутри вашего paintComponent(...) метода.Посмотрите Учебник по пользовательской живописи в Swing , чтобы вы научились делать это правильно

  9. И будьте осторожны, как paintComponents(...) (С трейлингом s) отличается от paintComponent(...) (посмотрите на заголовок)

Итак, выполнив все вышеперечисленные изменения, мы перейдем к этой простой программе:

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class DrawingClass {
    private JPanel contentPane;
    private JFrame frame;
    public static void main(String args[]) {
        SwingUtilities.invokeLater(() -> new DrawingClass().createAndShowGUI());
    }

    public void createAndShowGUI() {
        frame = new JFrame(getClass().getSimpleName());
        Line line = new Line();
        frame.add(line);

        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

    class Line extends JPanel {
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.BLUE);
            g.fillRect(10, 10, 15, 12);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(480, 640);
        }
    }
}

Который производит следующий вывод:

enter image description here

...