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

3

我正在尝试在JFrame中绘制一条线,但是线条没有被绘制出来。

我尝试为contentPanelblNewLabell使用方法setOpaque(true),但什么也没有改变。我还尝试在该类之外调用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

你的代码中有几个错误:

  1. 你正在扩展JFrame,但是你并没有改变它的行为,那你为什么要这样做呢?JFrame是一个不灵活的组件,所以从它继承通常都不是一个好主意。建议你基于JPanel构建用户界面。参见: 继承JFrame与在程序内创建JFrame有何不同

  2. 不要显式地设置JFrame的大小,调用pack()方法,而是重写来自JPanelgetPreferredSize方法,参见: Java Swing中是否应避免使用set(Preferred|Maximum|Minimum)Size方法?

  3. 这种情况下不需要调用setOpaque(...)方法。

  4. 不要使用null-layout,因为可能会导致奇怪的错误,因为null Layout is Evil,而且被反对

  5. 我们无法访问你的图片,因此无法测试ImageIcon,而且它也与你的问题无关。但是你应该将你的图像作为资源加载

  6. 不要显式地设置每个元素的大小和位置,这与第(4)点相关,你应该使用布局管理器或它们的组合来获得所需的用户界面。

  7. 不要以这种方式调用repaint()方法,它没有效果,它是用来在UI中有任何变化时重新绘制UI的。但是在程序启动时没有变化。

  8. 你没有在paintComponent(...)方法内调用super.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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接