无法调用调用paintcomponent方法:(

时间:2018-10-20 10:08:39

标签: java actionlistener paintcomponent

我要实现的目的是,一旦用户单击绘制,该程序将在框架的中间绘制一条线。但是可悲的是,除了“第3帧”消失之外,什么都没有发生。关于如何解决该问题的任何想法?

这是方法:

Windowj是我的框架。 Frame3是上一帧,请不要担心。

public static void graf() {
    frame3.setVisible(false);
    windowj.setSize(400, 500);
    windowj.setLocationRelativeTo(null);
    windowj.setResizable(false);
    windowj.setLayout(null);
    windowj.setVisible(true);
    windowj.setTitle("Graphs");
    windowj.setDefaultCloseOperation(EXIT_ON_CLOSE);

    xinwindow.setBounds(30,40, 90, 40);
    yinwindow.setBounds(100,100,90,40);
    thefunction.setBounds(200,300,90,40);
    draw.setBounds(300,200,90,40 );

    windowj.add(xinwindow);
    windowj.add(yinwindow);
    windowj.add(thefunction);
    windowj.add(draw);
    c.setPreferredSize(new Dimension(300,200));

    draw.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {

            windowj.add(c);
            c.revalidate();
            c.repaint();



        }

这是paintcomponent方法:

private static Component c = new JComponent() {
     protected void paintComponent(Graphics g) {
        super.paintComponent(g);


        g.setColor(Color.black);
        g.drawLine(50, 0, 70 , 100);


    }
};

任何帮助将不胜感激,请尝试保持简单,我是初学者。 :)

2 个答案:

答案 0 :(得分:0)

我假设您将windowj用作JFrame,并且当您单击绘制按钮并使用windowj.setVisible(false)时会发生什么,这将使窗口消失 所以删除它 第二件事是您需要将您的组件以windowj.add(c);的形式放置在windowj中,位于c.revalidate();之前的actionPerformed位置。 这是我写的一些代码,用来理解我的意思:

public class DrawLine {

    private JFrame windowj = new JFrame();
    private JButton draw = new JButton();

    private static int width = 640, height = 480;

    private static JComponent c    = new JComponent() {
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.black);
            g.drawLine((width/2) - 1, 0, (width/2) +1 , height);
        }
    };

    public DrawLine() {

        windowj.setDefaultCloseOperation(windowj.EXIT_ON_CLOSE);
        windowj.setSize(width, height);
        windowj.setLayout(new FlowLayout());
        windowj.setResizable(false);
        windowj.setLocationRelativeTo(null);
        windowj.setVisible(true);

        draw = new JButton("Draw");
        draw.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //i don't know why you set windowj(windowj) false but that will close your window
                //windowj.setVisible(false);
                //add component to windowj(windowj)
                windowj.add(c);
                c.revalidate();
                c.repaint();
            }
        });

        c.setPreferredSize(new Dimension(width, height-100));
        windowj.add(draw);
    }

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

答案 1 :(得分:-1)

这是修改后的代码:

private JFrame frame3, windowj;
private JPanel xinwindow, yinwindow,thefunction; 
private JButton draw;

private static Component c = new JComponent() {
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.black);
        g.drawLine(50, 0, 70 , 100);
    }
};

public DrawLine() {
    xinwindow = new JPanel();
    yinwindow = new JPanel();
    thefunction = new JPanel();
    draw = new JButton("Draw");
    //i ignored frame3 as you said so just ignore my implementation here
    frame3 = new JFrame();
    frame3.setVisible(false);

    windowj = new JFrame();
    windowj.setSize(400, 500);
    windowj.setLocationRelativeTo(null);
    windowj.setResizable(false);
    windowj.setLayout(null);
    windowj.setVisible(true);
    windowj.setTitle("Graphs");
    windowj.setDefaultCloseOperation(EXIT_ON_CLOSE);
    /*i used setBackground(Color.anycolor); to make it easier for me to know where
    your window is in your frame*/
    xinwindow.setBackground(Color.RED);
    xinwindow.setBounds(30,40, 90, 40);
    yinwindow.setBackground(Color.yellow);
    yinwindow.setBounds(100,100,90,40);
    thefunction.setBounds(200,300,90,40);
    thefunction.setBackground(Color.green);
    draw.setBounds(300,200,90,40 );

    windowj.add(xinwindow);
    windowj.add(yinwindow);
    windowj.add(thefunction);
    windowj.add(draw);
    //here use setBonds instead of setPreferredSize
    c.setBounds(100, 200, 200, 200);

    draw.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            windowj.add(c);
            c.revalidate();
            c.repaint();
        }
    });
}

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

希望能解决您的问题。