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