有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java鼠标单击时未画线

我有以下java程序:

  import java.awt.*;
  import java.awt.Graphics;
  import javax.swing.*;
  import java.awt.event.*;
  import java.io.*; 
  import javax.swing.*;

  public class Lapex extends JPanel implements MouseListener{
JPanel p = new JPanel();

Lapex(){
    JFrame f = new JFrame();
    p.addMouseListener(this);
    p.setPreferredSize(new Dimension(600, 600));
    f.add(p);
    f.pack();
    f.show(true);
}


public void paint(Graphics g){
     paintComponents(g);
     g.setColor(Color.RED);
     g.drawLine(10, 10, 100, 100);
}

public void mouseClicked(MouseEvent me){
     System.out.println("AAAA");
     repaint();
}


}

public static void main(String[] args){
    new Lapex();

}
}

点击鼠标,控制台上显示“AAAAA”,但不画线。(我删除了另一个鼠标事件) 如何修改


共 (3) 个答案

  1. # 1 楼答案

    您必须调用super方法并使用paintComponent

    public void paintComponent(Graphics g){
         super.paintComponent(g);
         g.setColor(Color.RED);
         g.drawLine(10, 10, 100, 100);
    }
    
  2. # 2 楼答案

    不!,不要覆盖paint()让它自行摇摆。你所要做的就是重写paintComponent()

  3. # 3 楼答案

    需要注意的几件事:

    您的类扩展了JPanel,但随后在实际添加到框架的类内创建了另一个JPanel。改为添加类的实例

    替代绘制组件而不是绘制

    使用调用invokeLater在EDT上启动程序。有关更多信息,请参见Event Dispatch Thread

    重写getPreferredSize,而不是调用setPreferredSize

    下面是一个完整的示例,在单击鼠标按钮时切换线路的开/关:

    import java.awt.*;
    import java.awt.Graphics;
    import javax.swing.*;
    import java.awt.event.*;
    
    public class Lapex extends JPanel {
    
      boolean drawLine = false;
    
      Lapex(){
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    
        this.addMouseListener(new MouseAdapter() {
          public void mouseClicked(MouseEvent me){
            drawLine = !drawLine;
            repaint();
          }
        });
    
        f.add(this);
        f.pack();
        f.setVisible(true);
      }
    
      @Override
      protected void paintComponent(Graphics g){
        super.paintComponent(g);
        if(drawLine) {
          g.setColor(Color.RED);
          g.drawLine(10, 10, 100, 100);
        }
      }
    
      @Override
      public Dimension getPreferredSize() {
        return new Dimension(600, 600);
      }
    
      public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
          @Override
          public void run()
          {
            new Lapex();
          }});
      }
    }