2

我试图在 a 中画一条线JFrame,但没有画线。

我尝试使用该方法setOpaque(true)contentPanelblNewLabel没有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 的左上角,背景墙纸上方有一条小线,但什么也没有发生。它只显示壁纸。

4

1 回答 1

1

您的代码中有几个错误:

  1. 你正在扩展,JFrame但你没有改变它的行为,那么你为什么要这样做呢?JFrame是一个刚性组件,因此从它扩展从来都不是一个好主意,JPanel而是基于 s 构建您的 GUI。请参阅:扩展 JFrame 与在程序中创建它

  2. 不要显式设置 的大小JFrame,调用pack()它并getPreferredSize从覆盖JPanel,请参阅:我应该避免在 Java Swing 中使用 set(Preferred|Maximum|Minimum)Size 方法吗?

  3. setOpaque(...)在这种情况下你不需要打电话。

  4. 不要使用 a null-layout,它可能会导致奇怪的错误,因为null 布局是邪恶的并且不赞成

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

  6. 不要明确设置每个元素的边界,这与第(4)点有关,您应该使用布局管理器或它们的组合来获得所需的 GUI。

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

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

产生以下输出:

在此处输入图像描述

于 2019-05-06T16:23:44.927 回答