Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jpanel使用鼠标移动事件重新绘制_Java_Swing_Events_Jpanel_Repaint - Fatal编程技术网

Java Jpanel使用鼠标移动事件重新绘制

Java Jpanel使用鼠标移动事件重新绘制,java,swing,events,jpanel,repaint,Java,Swing,Events,Jpanel,Repaint,好的,这是我正在做的函数图示器,我想当你把鼠标移到一条线上时,它会显示坐标。所以我只在面板上设置了一个基本的拉丝来显示鼠标坐标,但我无法正常地重新绘制。这似乎是绘画只是罚款,但它不是在绘画前清除的内容这里是代码,我到目前为止 public class Grapher extends JPanel implements MouseMotionListener{ private final int BORDER_GAP = 15; private final int MAX_SCORE = 20;

好的,这是我正在做的函数图示器,我想当你把鼠标移到一条线上时,它会显示坐标。所以我只在面板上设置了一个基本的拉丝来显示鼠标坐标,但我无法正常地重新绘制。这似乎是绘画只是罚款,但它不是在绘画前清除的内容这里是代码,我到目前为止

public class Grapher extends JPanel implements MouseMotionListener{
private final int BORDER_GAP = 15;
private final int MAX_SCORE = 20;
private final int PREF_WIDTH = 800;
private final int PREF_HEIGHT = 650;
private final int GRAPH_POINT_WIDTH = 12;
private static final int GRAPH_INTERVAL = 15;

private static Point mse;

private List<Point> values;

public Grapher(List<Point> values) {
    setMse(new Point(0,0));
    this.values = values;
    addMouseMotionListener(this);
}

public void paintComponent(Graphics g){
    super.paintComponents(g);

    Graphics2D g2d = (Graphics2D) g;
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

    float xScale = ((float) getWidth() - 2 * BORDER_GAP) / (values.size()-1);
    float yScale = ((float) getHeight() - 2 * BORDER_GAP) / (MAX_SCORE-1);

    g2d.drawString(xScale+"", 50, 50);
    g2d.drawString(yScale+"", 50, 70);
    g2d.drawString(getWidth()/2+"", 50, 90);
    g2d.drawString(mse.x +"  " + mse.y, 50, 30);

    //create axis
    g2d.setColor(new Color(0x7e7e7e));
    //x line
    g2d.drawLine(BORDER_GAP, (getHeight() - BORDER_GAP)/2, getWidth() - BORDER_GAP, (getHeight() - BORDER_GAP)/2);
    //y line
    g2d.drawLine(getWidth()/2, getHeight() - BORDER_GAP, getWidth()/2, BORDER_GAP);

}

public Dimension getPreferredSize(){
    return new Dimension(PREF_WIDTH, PREF_HEIGHT);
}

private static void createAndShowGui(){
    List<Point> values = new ArrayList<Point>();
    int maxDataPoints = 20;

    for (int i = -GRAPH_INTERVAL; i <= GRAPH_INTERVAL; i++) {
        String val = "";
        try {
            val = EquationSolver.solveEquation(variableReplace('x', i));
        } catch (Exception e) {
            val ="0";
            e.printStackTrace();
        }
        System.out.println(i + "= " + val);
        values.add(new Point(i, Integer.parseInt(val)));
    }

    Grapher panel = new Grapher(values);

    JFrame frame = new JFrame("Grapher");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(panel);
    frame.pack();
    //frame.setLocationByPlatform(true);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);

}


public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable(){
        public void run(){
            createAndShowGui();
        }
    });
}

@Override
public void mouseMoved(MouseEvent e) {
    setMse(new Point(e.getX(), e.getY()));
    removeAll();
    repaint();      
}

@Override
public void mouseDragged(MouseEvent e) {
    setMse(new Point(e.getX(), e.getY()));
    //repaint();        
}
公共类图示器扩展JPanel实现MouseMotionListener{
私人最终国际边界_差距=15;
私人最终int MAX_分数=20;
专用最终整型优先宽度=800;
私人最终整流罩高度=650;
私有最终整数图\点\宽度=12;
私有静态最终整数图_区间=15;
私有静态点mse;
私有列表值;
公共图示器(列表值){
setMse(新点(0,0));
这个值=值;
addMouseMotionListener(此);
}
公共组件(图形g){
超级组件(g);
Graphics2D g2d=(Graphics2D)g;
g2d.setRenderingHint(renderingHits.KEY\u抗锯齿,renderingHits.VALUE\u抗锯齿\u开启);
float xScale=((float)getWidth()-2*边框间距)/(values.size()-1);
float yScale=((float)getHeight()-2*边界差距)/(最大分数-1);
g2d.拉丝(xScale+“”,50,50);
g2d.拉丝(yScale+“”,50,70);
g2d.拉丝(getWidth()/2+“”,50,90);
g2d.抽绳(mse.x+“”+mse.y,50,30);
//创建轴
g2d.setColor(新颜色(0x7e7e7e));
//x线
g2d.绘制线(边框间距,(getHeight()-边框间距)/2,getWidth()-边框间距,(getHeight()-边框间距)/2);
//y线
g2d.绘图线(getWidth()/2,getHeight()-BORDER\u GAP,getWidth()/2,BORDER\u GAP);
}
公共维度getPreferredSize(){
返回新尺寸(预宽、预高);
}
私有静态void createAndShowGui(){
列表值=新的ArrayList();
int maxDataPoints=20;

对于(int i=-GRAPH\u INTERVAL;i我建议您遇到的主要问题与
g.dispose()有关

图形上下文是共享的,这意味着如果您处置了图形上下文,其他任何内容都无法对其进行绘制。除非您创建了该上下文,否则不应处置它


您的另一个问题是,您实际上没有调用负责为绘制准备图形上下文的
super.paintComponent
,而是调用
super.paintComponents(g)
…不是结尾处的s

我建议您遇到的主要问题与
g.dispose()有关。

图形上下文是共享的,这意味着如果您处置了图形上下文,其他任何内容都无法对其进行绘制。除非您创建了该上下文,否则不应处置它


您的另一个问题是,您实际上没有调用负责为绘制准备图形上下文的
super.paintComponent
,而是调用
super.paintComponents(g)
…不是结尾的s

由于某种原因,当我直接在面板上绘制时,它会产生叠加效果,但如果我添加一个白色矩形作为背景,则解决了问题

...  
float xScale = ((float) getWidth() - 2 * BORDER_GAP) / (values.size()-1);
float yScale = ((float) getHeight() - 2 * BORDER_GAP) / (MAX_SCORE-1);

g2d.setColor(Color.white);
g2d.fillRect(0, 0, getWidth(), getHeight());
g2d.setColor(new Color(0x7e7e7e));

g2d.drawString(xScale+"", 50, 50);
g2d.drawString(yScale+"", 50, 70);
g2d.drawString(getWidth()/2+"", 50, 90);
g2d.drawString(mse.x +"  " + mse.y, 50, 30);
... 

这似乎是问题的解决办法。如果有人能解释为什么直接画到面板上会重叠或有更好的解决方案,请回答。

出于某种原因,当我直接画到面板上时,它会产生重叠效果,但如果我添加一个白色矩形作为背景来解决问题

...  
float xScale = ((float) getWidth() - 2 * BORDER_GAP) / (values.size()-1);
float yScale = ((float) getHeight() - 2 * BORDER_GAP) / (MAX_SCORE-1);

g2d.setColor(Color.white);
g2d.fillRect(0, 0, getWidth(), getHeight());
g2d.setColor(new Color(0x7e7e7e));

g2d.drawString(xScale+"", 50, 50);
g2d.drawString(yScale+"", 50, 70);
g2d.drawString(getWidth()/2+"", 50, 90);
g2d.drawString(mse.x +"  " + mse.y, 50, 30);
... 

这似乎是问题的解决办法。如果有人能解释为什么直接绘制到面板覆盖层或有更好的解决方案,请回答。

@andrethompson键盘故障…严重,我的键盘已停止工作…必须切换;)尝试移除g。dispose()我仍然遇到同样的问题。第二部分?调用
super.paintComponents
而不是
super.paintComponent
?@andrethompson键盘故障…严重,我的键盘停止工作…不得不切换;)尝试移除g.dispose()我仍然遇到同样的问题。第二部分呢?调用
super.paintComponents
而不是
super.paintComponent
?不,不是。你调用
super.paintComponents
而不是我在回答中强调的
super.paintComponent
,这是一种欺骗。不是确认您正在调用的是
super.paintComponents
,而不是我在回答中强调的
super.paintComponent