0

MAP の画像がある JLabel に複数の線を描画できません。私がやりたいのは、その JLabel 内に複数の線を描画することですが、新しい線をクリック/描画すると、描画した古い線が削除されるようです。言い換えれば、描いたすべての線を永続的に維持したいのです。私はあなたの助けに感謝します。これが私の作業コードです(メインクラスとGUIクラスが分離されています)。

メインクラス

package MP2;

import java.awt.Color;

import javax.swing.JFrame;

public class Driver {

public static void main(String[]args){

JFrame g = new JFrame();
Gui gui = new Gui();


g.setSize(900,650);

g.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
g.add(gui);

g.setVisible(true);

}
}

GUI クラス

package MP2;

import javax.swing.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;


public class Gui extends JPanel {

private JLabel mousepanel;
private JLabel statusbar;


int x;
int y;
int xx;
int yy;
;
ArrayList<Shape> shapes = new ArrayList<Shape>();

public Gui(){

    setLayout(null);


    mousepanel = new JLabel();
    mousepanel.setBounds(20,20,500,450);
    mousepanel.setIcon(new ImageIcon("C:\\Users\\Dm\\Desktop\\Programs\\Dim\\src\\MP2\\mpmap.png"));

    add(mousepanel);

    statusbar = new JLabel();
    statusbar.setBounds(20, 550, 300, 20);
    add(statusbar);


    Handlerclass handlerclass = new Handlerclass();
    mousepanel.addMouseListener(handlerclass);
    mousepanel.addMouseMotionListener(handlerclass);

    }

private class Handlerclass implements MouseListener, MouseMotionListener {


    public void mouseClicked(MouseEvent e){
        statusbar.setText("clicked at "+ e.getX() +" "+ e.getY());
                    
    
    }

    public void mousePressed(MouseEvent e){
        statusbar.setText("you pressed it at" + e.getX() +" and " + e.getY());
            x = e.getX();
            y = e.getY();
          
           
        
    }
    public void mouseReleased(MouseEvent e){
        statusbar.setText("you released the mouse at" + e.getX()+ " and "+ e.getY());
        xx= e.getX();
        yy= e.getY();
    validate();
    repaint();
    
    }
    public void mouseEntered(MouseEvent e){
        statusbar.setText("you're at "+e.getX()+" and " +e.getY());
        mousepanel.setBackground(Color.red);
    }
    public void mouseExited(MouseEvent e){
        statusbar.setText("....");
        mousepanel.setBackground(Color.blue);
        
        
    }
    public void mouseDragged(MouseEvent e){
        statusbar.setText("Dragging at" + e.getX() + " and "+ e.getY());
        
    }
    public void mouseMoved(MouseEvent e){
        statusbar.setText("moving " + "X = "+e.getX() +" Y = "+e.getY());
    }
    

    
}


public void paint(Graphics g){

 super.paint(g);
 Graphics2D g2d = (Graphics2D) g;
 g2d.setColor(Color.MAGENTA );
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_IN,1f));


g2d.fillOval(x+15, y+14, 10, 10);
g2d.fillOval(xx+15, yy+15, 10, 10);

g.drawLine(x+20,y+20,xx+20,yy+20);

}
}
4

1 に答える 1

4

描きたいすべての線を追跡する必要があります。ペイント (おそらく実際には paintComponent が必要です) は、描画する前にグラフィックをクリアします。

可能な解決策:

  1. すべての線を追跡し、ペイントコンポーネントでそれらを描画および描画します。

  2. 描画用のバッファを作成し、これに線を描画し、コンポーネントが再描画を要求されたら、paintComponent のグラフィックスにバッファを描画します。

于 2011-12-03T14:08:57.283 に答える