java - DrawLine JAVA 不会停留在 MAC OS X 上

标签 java macos swing graphics

首先这个问题仅在os x 上有效我不知道为什么,如果有人可以告诉我......(他在linux和windows上工作正常)

当我点击绘图时,旧点消失而不是停留。 如果删除 super.paintComponent 上的注释,结果在 osx 上是相同的,但在 window 和 linux 上是不同的。

点击即可绘制。

import java.awt.Color;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Stack extends JPanel {
    JFrame jf;
    Panneau jp;
    Point p;

    public Stack() {
        p = new Point();
        jf = new JFrame("Window");
        jp = new Panneau();
        jp.setBackground(Color.white);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setSize(800,600);
        jf.setLayout(new GridLayout());
        jf.add(jp);
        jf.setVisible(true);

        jp.addMouseListener(new MouseAdapter(){
            public void mouseClicked(MouseEvent e){
               setPoint(p);
               jp.repaint();
            }
        });
    }

    public void setPoint(Point p) {
        this.p.x += 10;
        this.p.y += 10;
    }

    public class Panneau extends JPanel {
        public void paintComponent(Graphics g) {
            // super.paintComponent(g);
            g.drawLine(p.x, p.y, p.x+5, p.y+5);
        }
    }

    public static void main (String []args) {
        Stack s = new Stack();
    }
}

最佳答案

发生这种情况是因为您没有重新绘制先前点所在的区域,显然在 mac 上,它会出于某种原因重新绘制该区域?

但重点是,您不应该通过不在先前的区域上绘制来依赖于绘制更多的点,并且您应该始终调用 super.paintComponent(g)。我建议您创建一个点列表,然后在重新绘制时绘制所有这些点。

我自己创建了这段代码,我希望你明白我在这里做什么:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Stack extends JPanel {
    JFrame jf;
    Panneau jp;
    //List of points instead of one point
    List<Point> points;

    public Stack() {
        //Instantiating the list
        points = new ArrayList<Point>();
        jf = new JFrame("Window");
        jp = new Panneau();
        jp.setBackground(Color.white);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setSize(800,600);
        jf.setLayout(new GridLayout());
        jf.add(jp);
        jf.setVisible(true);

        jp.addMouseListener(new MouseAdapter(){
            public void mouseClicked(MouseEvent e){
                //Adding a new point to the list
                addPoint();
                jp.repaint();
            }
        });
    }

    public void addPoint() {
        if(points.isEmpty()){
            //If this is the first point to be added, set it to 0,0
            points.add(new Point(0, 0));
        }else{
            //Get the last point currently in the list
            Point lastPoint = points.get(points.size()-1);
            //Create the newpoint, 10px right and 10px down from the current point
            Point newPoint = new Point(lastPoint.x + 10, lastPoint.y + 10);
            //Add the new point to the list
            points.add(newPoint);
        }
    }

    public class Panneau extends JPanel {
        public void paintComponent(Graphics g) {
            //Make sure the background is drawn! Should always be called
            super.paintComponent(g);
            //Iterate over all the points and draw them all
            for(Point p : points){
                g.drawLine(p.x, p.y, p.x + 5, p.y + 5);
            }
        }
    }

    public static void main (String []args) {
        Stack s = new Stack();
    }
}

关于java - DrawLine JAVA 不会停留在 MAC OS X 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29672787/

相关文章:

java - 如何在Java中对Spark DataFrame应用字符串操作

java - 使用回调函数在线程中注册事件

java - soap 对象应该使用构造函数还是 setter 来创建?

c - 为什么参数三等于 "TERM_PROGRAM=Apple_Terminal"?

java - 删除 Jtable 上的列并插入新列

java - 获取 ArrayList 中的最新形状以在其他形状之上绘制 - Java

java - JSONArray 异常 : Index 50 out of range [0. .50)。 JsonArray 有没有限制

macos - 基于 View 的 Tableview 中 NSTableview 行的重新排序

xcode - 使用 Swift 扩展 UIView 类

java - 如何在 java 中使一整列不可选择?