添加到面板时 paintComponent() 不起作用

paintComponent() is not working when add to panel

我正在开发一个可以绘制数学函数图形的 swing 应用程序。我正在使用 getGraghics 函数,但我不知道如何删除和重新绘制它们,所以我决定覆盖 paintComponent() 方法来实现我正在寻找的东西

我想做的是在用户单击按钮后在面板中绘制函数图。但似乎 paintCompnent() 不起作用。我完全按照任何现有的教程和堆栈上的类似问题 overflow.but none 为我工作:( 只是没有意义:(

请帮助我解决这个问题一整夜:(

以下是绘制函数图的代码,但由于它不起作用,所以我只留下了绘制坐标系的部分进行测试,之后是我如何创建实例并尝试将其添加到我的面板的代码主要 class

class drawfunction extends JPanel{


 @Override
 protected void paintComponent(Graphics g){
     super.paintComponent(g);


     g.setColor(Color.red);
     g.drawLine(0, 200, 400, 200);
     g.drawLine(200,0 , 200, 400);


 }

}

然后是main中的代码class

        JPanel panel = new JPanel();



    panel.setBounds(14, 104, 400, 400);
    contentPane.add(panel);

    panel.setBackground(Color.white);

    JButton btnNewButton = new JButton("View the graph");
    btnNewButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {


           //a= Integer.parseInt(cofficient_a.getText());
           //b= Integer.parseInt(cofficient_b.getText());
           //c= Integer.parseInt(cofficient_c.getText());
           //d= Integer.parseInt(cofficient_d.getText());
           //e= Integer.parseInt(cofficient_e.getText());


        drawfunction a=new drawfunction();
        panel.add(a);



    });

任何人都可以告诉我应该如何解决这个问题。谢谢!!!!

两个基本的东西...

  1. 组件的默认首选大小为 0x0,因此在将其添加到任何布局管理器控制下的容器时,它的大小都会达到 0x0(或非常接近)
  2. Swing 通常是惰性的,它不会在您添加或删除组件时更新 UI,这可能会影响性能,因为 UI 不知道更新 UI 根据你在做什么,相反,你需要调用 revalidate 和(大部分时间)repaint 来更新 UI

例如...

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private JPanel center;

        public TestPane() {
            setLayout(new BorderLayout());
            JButton btnNewButton = new JButton("View the graph");
            center = new JPanel();
            center.setPreferredSize(new Dimension(400, 400));
            add(center);
            btnNewButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent arg0) {

                    remove(center);

                    //a= Integer.parseInt(cofficient_a.getText());
                    //b= Integer.parseInt(cofficient_b.getText());
                    //c= Integer.parseInt(cofficient_c.getText());
                    //d= Integer.parseInt(cofficient_d.getText());
                    //e= Integer.parseInt(cofficient_e.getText());
                    center = new Drawfunction();
                    add(center);
                    revalidate();
                    repaint();

                }

            });
            add(btnNewButton, BorderLayout.NORTH);
        }

        public class Drawfunction extends JPanel {

            public Drawfunction() {
            }

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(400, 400);
            }

            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                Graphics2D g2d = (Graphics2D) g.create();
                g2d.setColor(Color.red);
                g2d.drawLine(0, 200, 400, 200);
                g2d.drawLine(200, 0, 200, 400);
                g2d.dispose();
            }

        }

    }
}