Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

paint method is not being called

Tags:

java

swing

paint

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

        }
    }
}
like image 827
Bernard Burn Avatar asked Mar 08 '26 03:03

Bernard Burn


2 Answers

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.

like image 193
Zenon Avatar answered Mar 09 '26 17:03

Zenon


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

like image 38
trashgod Avatar answered Mar 09 '26 16:03

trashgod