【问题标题】:paint method is not being called没有调用paint方法
【发布时间】:2012-08-25 04:19:23
【问题描述】:

我不知道为什么,但我无法从代码中调用方法paint(Graphics g)。我有MouseListeners:

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

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

MouseMotionListeners:

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

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

        repaint();


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

还有我的paint 方法:

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

在初始化方法中:

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

所有在课堂上,这是我的工作框架,它扩展了JFrame

问题是,该程序没有call 绘制方法。我在调试器中检查了它。 我尝试通过 paintComponent 做到这一点,没有 super.paint(g)。 最好的是,我从另一个项目中复制的代码可以正常工作。

更新: 这是我想在面板上画线的代码(无论 - 面板/图表面板/等)。而且它不会画画。我尝试通过 paint(Graphics g){super.paint(g) ..... } 来做到这一点,但它也没有。点击“线条”按钮后应该可以绘画了。

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

        }
    }
}

【问题讨论】:

  • 您确定正在调用mouseDragged() 吗?
  • 如需尽快获得更好的帮助,请发帖SSCCE
  • 我检查过 - mouseDragged() 被调用,同样的 repaint() 也被调用,但我注意到在 repaint() 之后在调试器中调用 paint(...)。
  • 我刚刚更新了我的问题。如果可以的话,请帮忙。
  • 我也试过“super.paintComponent(g)”。

标签: java swing paint


【解决方案1】:

调用repaint() 将触发你的paint(Graphics g) 方法被调用。因此,您不必显式调用paint()

【讨论】:

    【解决方案2】:

    ChartPanel 上下文中,考虑org.jfree.chart.annotations 之一,例如XYLineAnnotation,图示herehere

    【讨论】:

    • 顺便说一句,“Swing 程序应该覆盖paintComponent() 而不是覆盖paint()。”—Painting in AWT and Swing: The Paint Methods
    • 好的,这真的很有帮助,但我需要知道为什么,我的代码不起作用。我很感兴趣,为什么我不能调用 'paintComponent(Graphics g)'
    【解决方案3】:

    您正在创建两个单独的 JFrame 实例并且只显示一个。
    创建一个实例是因为Window 类扩展了JFrame,第二个是在initialize 方法中创建的。

    要在不更改大量代码的情况下解决此问题,请执行以下操作:

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

    顺便说一句。将paintComponent(Graphic g) 更改为paint(Graphic g),因为JFrame 不是JComponent

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多