无法画线(方法:paintComponent)- Java

Can't draw line(method: paintComponent) - Java

我正在尝试在 JFrame 中画一条线,但未画出线。

我尝试将方法 setOpaque(true) 用于 contentPanelblNewLabell,但没有任何改变。我也尝试在 class 之外调用 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. 您正在扩展 JFrame 但您没有改变它的行为,那么您为什么要这样做? JFrame 是一个刚性组件,因此从它扩展永远不是一个好主意,而是基于 JPanel 构建你的 GUI。参见:Extends JFrame vs. creating it inside the program

  2. 不要显式设置 JFrame 的大小,在其上调用 pack() 而是覆盖 JPanel 中的 getPreferredSize,请参阅: Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?

  3. 在这种情况下您不需要调用 setOpaque(...)

  4. 不要使用 null-layout,它可能会导致 strange errors, because null Layout is Evil and frowned upon

  5. 我们无权访问您的图片,因此我们无法测试 ImageIcon,它也与您的问题无关。但是你应该 load your images as resources

  6. 不要显式设置每个元素的边界,这与点(4)有关,你应该使用Layout Manager或它们的组合以获得您想要的 GUI.

  7. 不要那样调用repaint(),它没有任何作用,它应该在你的UI发生变化时重新绘制它。但是,程序开始时没有任何变化。

  8. 您没有在 paintComponent(...) 方法中调用 super.paintComponent(...),从而破坏了 paint-chain。检查 Tutorial on Custom Painting in 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);
        }
    }
}

产生以下输出: