gpt4 book ai didi

java - 不能画线(方法: paintComponent) - Java

转载 作者:行者123 更新时间:2023-11-30 10:04:12 25 4
gpt4 key购买 nike

我试图在 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. 您正在扩展 JFrame 但您没有改变它的行为,那么您为什么要这样做呢? JFrame 是一个严格的组件,因此从它扩展,而不是基于 JPanel 构建您的 GUI 绝不是一个好主意。请参阅:Extends JFrame vs. creating it inside the program

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

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

  4. 不要使用null-layout,它可能会导致strange errors ,因为 null Layout is Evilfrowned upon

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

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

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

  8. 您没有在 paintComponent(...) 方法中调用 super.paintComponent(...) 会破坏绘画链。检查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);
}
}
}

产生以下输出:

enter image description here

关于java - 不能画线(方法: paintComponent) - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56007313/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com