Bernard Burn
Bernard Burn

Reputation: 661

paint method is not being called

I don't know why, but I can't call the method paint(Graphics g) from code. I have MouseListeners:

    @Override
    public void mouseReleased(MouseEvent e) {       
        pointstart = null;
    }

    @Override
    public void mousePressed(MouseEvent e) {
        pointstart = e.getPoint();
    }

and MouseMotionListeners:

    @Override
    public void mouseMoved(MouseEvent e) {
        pointend = e.getPoint();
    }

    @Override
    public void mouseDragged(MouseEvent arg0) {
        pointend = arg0.getPoint();
        // ==========================================================================
        //          call repaint:

        repaint();


        // ==========================================================================
    }

and my paint method:

public void paint(Graphics g){
    super.paint(g); //here I have my breakpoint in debugger
    g.translate(currentx, currenty);
    if(pointstart!=null){
        g.setClip(chartPanel.getBounds());
        g.setColor(Color.BLACK);
        g.drawLine(pointstart.x, pointstart.y, pointend.x, pointend.y);
    }
}

in the initialize method:

currentx = chartPanel.getLocationOnScreen().x;
currenty = Math.abs(chartPanel.getLocationOnScreen().y - frame.getLocationOnScreen().y);

All in class, which is my work frame, it extends JFrame.

Problem is, that program doesn't call paint method. I checked that in debugger. I tried do this by paintComponent , without super.paint(g). And the best is that, that code I copied from my other project, where it works fine.

UPDATE: This is code which I want to draw line on panel (no matter - panel/chartpanel/etc). And it doesn't paint. I tried do this by paint(Graphics g){super.paint(g) ..... } and it doesn't too. Painting should be aneble after clicking button "line".

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Point;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JToolBar;
import javax.swing.SwingConstants;
import javax.swing.JScrollPane;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

public class Window extends JFrame {
private JFrame frame;
public JPanel panelbuttons;
public JPanel panelscrollpane;
public JButton btnLine;
public JToolBar toolBar;
public JScrollPane scrollPane;
public JPanel panel;

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Window window = new Window();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

public Window() {
    initialize();
}

private void initialize() {
    frame = new JFrame();
    frame.setBounds(100, 100, 644, 430);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    panel = new JPanel();

    panelbuttons = new JPanel();
    frame.getContentPane().add(panelbuttons, BorderLayout.WEST);
    panelbuttons.setLayout(new BorderLayout(0, 0));

    toolBar = new JToolBar();
    toolBar.setOrientation(SwingConstants.VERTICAL);
    panelbuttons.add(toolBar, BorderLayout.WEST);

    btnLine = new JButton("line");
    btnLine.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            panel.addMouseListener(mouselistenerLine);
            panel.addMouseMotionListener(mousemotionlistenerLine);
        }
    });
    toolBar.add(btnLine);

    panelscrollpane = new JPanel();
    frame.getContentPane().add(panelscrollpane, BorderLayout.CENTER);
    panelscrollpane.setLayout(new BorderLayout(0, 0));



    scrollPane = new JScrollPane(panel);
    panel.setLayout(new BorderLayout(0, 0));
    scrollPane.setViewportBorder(null);
    panelscrollpane.add(scrollPane);
    panelscrollpane.revalidate();
}

    Point pointstart = null;
    Point pointend = null;

private MouseListener mouselistenerLine = new MouseListener() {


        @Override
        public void mouseReleased(MouseEvent e) {
            System.out.println("I'm in first listener. - mouse Released");
            pointstart = null;
        }

        @Override
        public void mousePressed(MouseEvent e) {
            System.out.println("I'm in first listener. - mousePressed");
            pointstart = e.getPoint();
        }

        @Override
        public void mouseExited(MouseEvent e) {
        }

        @Override
        public void mouseEntered(MouseEvent e) {
        }

        @Override
        public void mouseClicked(MouseEvent e) {
        }

    };

    private MouseMotionListener mousemotionlistenerLine = new MouseMotionListener() {

            @Override
            public void mouseMoved(MouseEvent e) {
                System.out.println("I'm in second listener. - mouseMoved");
                pointend = e.getPoint();
            }

            @Override
            public void mouseDragged(MouseEvent arg0) {
                System.out.println("I'm in second listener. - mouseDragged");
                pointend = arg0.getPoint();
                repaint();
            }

    };

    public void paintComponent(Graphics g){

        System.out.println("I'm in paintComponent method.");

        if(pointstart!=null){
            System.out.println("I'm drawing.");
            g.setClip(scrollPane.getBounds());
            g.setColor(Color.BLACK);
            g.drawLine(pointstart.x, pointstart.y, pointend.x, pointend.y);

        }
    }
}

Upvotes: 3

Views: 2338

Answers (3)

Zenon
Zenon

Reputation: 56

You are creating two separate instances of JFrame and showing only one.
One instance is created because Window class extends JFrame, and the second is created inside initialize method.

To fix this without a lot of changes in code do this:

private void initialize() {
    frame = this;
    frame.setBounds(100, 100, 644, 430);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

BTW. change paintComponent(Graphic g) to paint(Graphic g) because JFrame is not a JComponent.

Upvotes: 4

trashgod
trashgod

Reputation: 205875

In a ChartPanel context, consider one of the org.jfree.chart.annotations such as XYLineAnnotation, illustrated here and here.

Upvotes: 2

Dan D.
Dan D.

Reputation: 32391

Calling repaint() will trigger your paint(Graphics g) method to be called. So, you don't have to explicitly call paint().

Upvotes: 1

Related Questions