package topic1;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;import javax.swing.JFrame;
import javax.swing.JOptionPane;
 public class Test extends javax.swing.JFrame{
   private  Graphics2D pt = null;
   public Test() {
   Init(); 
   pt = (Graphics2D)this.getGraphics();
   pt.setColor(Color.BLUE);
   }
   public void Init(){
 this.setSize(2000,2000);
 this.setVisible(true);
 this.setTitle("演示:");
 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 this.addMouseListener(new MyMouseAdapter(this)); 
   }
   public static void main(String[] args){
   Test mb = new Test();
   }
   public void MyMousePressed(MouseEvent e) {
 String distance = "0";
 int d = 0;
 System.out.println("out");
 if(e.isMetaDown()){
   distance = JOptionPane.showInputDialog(null,"请输入:","输入值:",JOptionPane.QUESTION_MESSAGE);
   try{d =  Integer.parseInt(distance);}
   catch (NumberFormatException e1){ d=0;}
   pt.drawLine(300+d,300+2*d,500+d,500+2*d);
     }else{
  pt.drawLine(900,400,400,500);
     }
   }
 }
   class MyMouseAdapter extends MouseAdapter {
    private Test adaptee;
    MyMouseAdapter(Test adaptee) {
        this.adaptee = adaptee;
    }     public void mousePressed(MouseEvent e) {
        adaptee.MyMousePressed(e);
    }
 }问题是:
当点击JOptionPane.showInputDialog的确定的按钮的时候,会把原来的一条线的部分给覆盖掉,而且即使对话框不出现在线的上面,若吧对话框移动到他的上面,也会覆盖掉,移走对话框不会恢复???请教各位大侠如何解决???

解决方案 »

  1.   

    你的做法是有问题的。而且正常来说,一般也不会这样做。如果要在一个视图上画图,通常会定制一个自己的对象。
    而你这样,试图本身根本不知道画上去的那个对象,也就没有保留。
    而且视图经常会调用刷新方法,当然不是全部刷新,而是局部。也正是因为是局部刷,所以你所挡住的那部分不可见。否则,整个视图上面将空空的什么都没有。不信你可以强制调用一下getContentPane().repaint();什么都没有,视图既然不保留这些,所以重新绘制的时候自然也不知道去画你要的东西。给你提供一种做法,这是常规做法。package frame.test;import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;import javax.swing.JFrame;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;public class Test extends javax.swing.JFrame {
    // private Graphics2D pt = null;
    MyPanel panel = new MyPanel(); public Test() {
    Init();
    // pt = (Graphics2D) getContentPane().getGraphics();
    // pt.setColor(Color.BLUE);
    } public void Init() {
    setContentPane(panel);
    this.setSize(2000, 2000);
    this.setVisible(true);
    this.setTitle("演示:");
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.addMouseListener(new MyMouseAdapter(this));
    } public static void main(String[] args) {
    Test mb = new Test();
    } public void MyMousePressed(MouseEvent e) {
    String distance = "0";
    int d = 0;
    System.out.println("out");
    if (e.isMetaDown()) {
    distance = JOptionPane.showInputDialog(null, "请输入:", "输入值:",
    JOptionPane.QUESTION_MESSAGE);
    try {
    d = Integer.parseInt(distance);
    } catch (NumberFormatException e1) {
    d = 0;
    } // pt.drawLine(300 + d, 300 + 2 * d, 500 + d, 500 + 2 * d);
    panel.setD(d);
    } else {
    panel.setD(-1);
    }
    panel.repaint();
    }
    }class MyMouseAdapter extends MouseAdapter {
    private Test adaptee; MyMouseAdapter(Test adaptee) {
    this.adaptee = adaptee;
    } public void mousePressed(MouseEvent e) {
    adaptee.MyMousePressed(e);
    }
    }class MyPanel extends JPanel {
    int d = -1; public void setD(int d) {
    this.d = d;
    } @Override
    public void paint(Graphics g) {
    // TODO Auto-generated method stub
    super.paint(g);
    if (d >= 0) {
    g.drawLine(300 + d, 300 + 2 * d, 500 + d, 500 + 2 * d); } else {
    g.drawLine(900, 400, 400, 500);
    }
    }
    }