Не удалось вызвать вызов метода paintcomponent :( - PullRequest
0 голосов
/ 20 октября 2018

Я пытаюсь добиться того, чтобы программа рисовала линию в середине кадра, как только пользователь нажал на кнопку рисования.Но, к сожалению, ничего не происходит, кроме как "кадр 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();



        }

А вот метод рисования компонентов:

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 голосов
/ 20 октября 2018

Вот модифицированный код:

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

надеюсь, что решить вашу проблему.

0 голосов
/ 20 октября 2018

Я предполагаю, что вы используете windowj в качестве JFrame, и что произойдет, когда вы нажмете кнопку рисования, ваше использование windowj.setVisible(false), и это заставит ваше окно исчезнуть, поэтому удалите его, 2-ая вещь, вам нужно поместить свой компонентв windowj как windowj.add(c); в вашем DrawL ActionListener в actionPerformed до c.revalidate(); и вот небольшой код, который я написал, чтобы понять, что я имею в виду:

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