Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.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 我能';t使用鼠标侦听器(如按下和释放)在JLabel中绘制多行_Java_Swing_Jlabel_Graphics2d_Paintcomponent - Fatal编程技术网

Java 我能';t使用鼠标侦听器(如按下和释放)在JLabel中绘制多行

Java 我能';t使用鼠标侦听器(如按下和释放)在JLabel中绘制多行,java,swing,jlabel,graphics2d,paintcomponent,Java,Swing,Jlabel,Graphics2d,Paintcomponent,我不能在有地图图片的JLabel上画多条线。我想做的是在JLabel中绘制多条线,但似乎每当我单击/绘制新线时,我绘制的旧线都会被删除。换句话说,我想永久保留我画的每一条线。我感谢你的帮助。这是我的工作代码(分开的主类和gui类) 主类 用户界面类 包MP2; 导入javax.swing.*; 导入java.util.*; 导入java.awt.*; 导入java.awt.event.*; 公共类Gui扩展了JPanel{ 私人JLabel鼠标垫; 专用JLabel状态栏; int x; int

我不能在有地图图片的JLabel上画多条线。我想做的是在JLabel中绘制多条线,但似乎每当我单击/绘制新线时,我绘制的旧线都会被删除。换句话说,我想永久保留我画的每一条线。我感谢你的帮助。这是我的工作代码(分开的主类和gui类)

主类 用户界面类
包MP2;
导入javax.swing.*;
导入java.util.*;
导入java.awt.*;
导入java.awt.event.*;
公共类Gui扩展了JPanel{
私人JLabel鼠标垫;
专用JLabel状态栏;
int x;
int-y;
int xx;
int-yy;
;
ArrayList形状=新的ArrayList();
公共图形用户界面(){
setLayout(空);
鼠标垫=新的JLabel();
立根鼠标垫(20,20500450);
setIcon(新的图像图标(“C:\\Users\\Dm\\Desktop\\Programs\\Dim\\src\\MP2\\mpmap.png”);
添加(鼠标垫);
状态栏=新的JLabel();
状态栏.立根(20550300,20);
添加(状态栏);
Handlerclass Handlerclass=新的Handlerclass();
mousepanel.addMouseListener(handlerclass);
addMouseMotionListener(handlerclass);
}
私有类Handlerclass实现MouseListener、MouseMotionListener{
公共无效mouseClicked(MouseEvent e){
statusbar.setText(“单击“+e.getX()+”+e.getY());
}
公共无效鼠标按下(MouseEvent e){
statusbar.setText(“您在“+e.getX()+”和“+e.getY()”处按下它);
x=e.getX();
y=e.getY();
}
公共无效MouseEvent(MouseEvent e){
statusbar.setText(“您在“+e.getX()+”和“+e.getY()”处释放了鼠标);
xx=e.getX();
yy=e.getY();
验证();
重新油漆();
}
公共无效鼠标事件(鼠标事件e){
statusbar.setText(“您位于“+e.getX()+”和“+e.getY()”);
鼠标垫。背景(颜色。红色);
}
公共无效mouseExited(MouseEvent e){
statusbar.setText(“..”);
鼠标垫。背景(颜色。蓝色);
}
公共无效鼠标标记(鼠标事件e){
statusbar.setText(“在“+e.getX()+”和“+e.getY()处拖动”);
}
public void mouseMoved(MouseEvent e){
statusbar.setText(“移动“+”X=“+e.getX()+”Y=“+e.getY());
}
}
公共空间涂料(图g){
超级油漆(g);
Graphics2D g2d=(Graphics2D)g;
g2d.setColor(Color.品红色);
setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_IN,1f));
g2d.椭圆形(x+15,y+14,10,10);
g2d.椭圆形(xx+15,yy+15,10,10);
g、 抽绳(x+20、y+20、xx+20、yy+20);
}
}

您需要跟踪所有要绘制的线条。在绘制图形之前,绘制(您可能实际上需要绘制组件)会清除图形

可能的解决办法:

  • 跟踪所有要绘制的线,并在paintComponent中绘制它们

  • 为绘图创建缓冲区,在该缓冲区上绘制线条,当组件要求重新绘制时,在paintComponent中的图形上绘制缓冲区


  • 你需要记录所有你想画的线。在绘制图形之前,绘制(您可能实际上需要绘制组件)会清除图形

    可能的解决办法:

  • 跟踪所有要绘制的线,并在paintComponent中绘制它们

  • 为绘图创建缓冲区,在该缓冲区上绘制线条,当组件要求重新绘制时,在paintComponent中的图形上绘制缓冲区


  • 为了更快地获得更好的帮助,请在Swing组件(如
    JPanel
    )中发布一个.code>public void paint(Graphics g){,覆盖
    paintComponent(Graphics g)
    。不要使用空布局。了解如何使用布局管理器。无需在mouserereleased()上使用validate()事件。该方法在布局更改时使用。为了更快地获得更好的帮助,请在Swing组件(如
    JPanel
    )中发布一个.code>public void paint(Graphics g){,覆盖
    paintComponent(Graphics g)
    。不要使用空布局。了解如何使用布局管理器。无需在mouserereleased()上使用validate()事件。该方法在布局更改时使用。+1,请参阅了解每种方法的工作示例。+1,请参阅了解每种方法的工作示例。
    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);
    
    }
    }
    
    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);
    
    }
    }