图形在Java中不起作用

图形在Java中不起作用,java,swing,jframe,paintcomponent,repaint,Java,Swing,Jframe,Paintcomponent,Repaint,我试图在java中搞乱一些图形,但是我无法让它工作。JFrame带有我创建的按钮,但是JFrame只是灰色的,没有我想要它画的红线 import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; public class Shapes extends JFrame implements ActionListener{ JButt

我试图在java中搞乱一些图形,但是我无法让它工作。JFrame带有我创建的按钮,但是JFrame只是灰色的,没有我想要它画的红线

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


public class Shapes extends JFrame implements ActionListener{

JButton button = new JButton("click");
public Shapes() {
    setVisible(true);
    setSize(500, 500);
    button.addActionListener(this);
    button.setSize(20, 20);
    setLayout(new FlowLayout());
    add(button);
    repaint();
}
public static void main(String[] args){
    Shapes s = new Shapes();   
}


public void paintComponent(Graphics g) {
    Graphics2D g2 = (Graphics2D) g;
    g2.setColor(Color.red);
    g2.drawLine(5, 10, 10, 20);
}

@Override
public void actionPerformed(ActionEvent e) {
    if (e.getSource() == button){
        repaint();
    }
 }
}
两件事:

1) 。您并不想在顶级容器(如
JFrame
)上进行自定义绘制。相反,您希望使用
JPanel

class Panel extends JPanel
{
    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setColor(Color.red);
        g2.drawLine(5, 10, 10, 20);
    }
}
并将其添加到您的
JFrame
add(newpanel())(如果需要,也可以创建一个对象)

2) <代码>设置可见(真)应该是您在设置窗口时所做的最后一件事。因此,请更改您的构造函数:

public Shapes() {
setSize(500, 500);
button.addActionListener(this);
button.setSize(20, 20);
setLayout(new FlowLayout());
add(button);
add(new Panel()) // added from part 1
repaint();
setVisible(true);
}

有关详细信息,请浏览

不要直接在
JFrame
上绘制,请使用
JPanel
来代替。如果我将其更改为JPanel,当我启动程序时,程序仅在1-2秒后自动结束,而不显示JPanel。此外,我不能对JPanel使用repaint()。你能详细解释一下吗?我发布了一个更详细的答案1)正如@BitNinja所说的,你在你的JPanel中画画,然后把你的JPanel添加到一个JFrame中,然后显示出来。2) 在尝试重写的方法之前,应始终使用
@Override
注释。如果你这样做了,你会发现JFrame没有
paintComponent(…)
方法。谢谢你的帮助:)我开始得到它了。1+,但别忘了建议调用
super.paintComponent(g)如果你的答案已经解决了你的问题,请点击点击复选标记来考虑。这向更广泛的社区表明,你已经找到了一个解决方案,并给回答者和你自己带来了一些声誉。没有义务这样做。