mousePressed方法没有回复

时间:2015-07-14 15:10:28

标签: java mouselistener

我尝试做一些非常基本的事情:编写程序,在两点之间的框架上画一条线:按下鼠标的点和释放鼠标的点。

我有这些课程:

import java.awt.Graphics;

public class Line implements Drawable{
    private int x1,x2,y1,y2;
    public Line( int x1,int x2,int y1,int y2){
        this.x1=x1;
        this.x2=x2;
        this.y1=y1;
        this.y2=y2;
    }
    public void draw(Graphics g){
        g.drawLine(x1, y1, x2, y2);
    }
}
import java.awt.Graphics;

public interface Drawable {
    public void draw(Graphics g);
}
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;

import javax.swing.JPanel;

@SuppressWarnings("serial")
public class LinePanel extends JPanel {
    ArrayList<Line> lines = new ArrayList<Line>();

    public LinePanel() {
        addMouseListener(new MouseAdapter() {
            Point p1, p2;

            @Override
            public void mousePressed(MouseEvent e) {
                p1 = e.getPoint();
                System.out.println("pressed");
            }

            @Override
            public void mouseClicked(MouseEvent e) {
                // TODO Auto-generated method stub
                System.out.println("clicked");

            }
            @Override
            public void mouseReleased(MouseEvent e) {
                p2 = e.getPoint();
                lines.add(new Line(p1.x, p1.y, p2.x, p2.y));
            }

        });
        System.out.println("after add mouselistener");
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        for (Line l : lines) {
            l.draw(g);
        }
    }
}
import javax.swing.JFrame;

public class LaunchLinesGui {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        JFrame frame=new JFrame();
        frame.setSize(500, 500);
        frame.setVisible(true);

        LinePanel panel=new LinePanel();
        frame.add(panel);
    }

}

问题在于,当我在框架上的任何位置按下它时,我得不到任何响应,甚至System.out.println的{​​{1}}方法也没有打印在控制台上。 我做错了什么?

2 个答案:

答案 0 :(得分:0)

问题在于我没有设置面板的大小,并且面板内的点击没有被捕获到面板中。

修复方法是在webView.allowsInlineMediaPlayback = true webView.mediaPlaybackRequiresUserAction = false let embededHTML = "<html><body style='margin:0px;padding:0px;'><script type='text/javascript' src='http://www.youtube.com/iframe_api'></script><script type='text/javascript'>function onYouTubeIframeAPIReady(){ytplayer=new YT.Player('playerId',{events:{onReady:onPlayerReady}})}function onPlayerReady(a){a.target.playVideo();}</script><iframe id='playerId' type='text/html' width='0' height='0' src='http://www.youtube.com/embed/\(videoID)?enablejsapi=1&rel=0&playsinline=1&autoplay=1' frameborder='0'></body></html>" webView.loadHTMLString(embededHTML, baseURL: NSBundle.mainBundle().resourceURL) 构造函数中添加setSize(500, 500);

答案 1 :(得分:0)

布局管理器的工作是确定添加到框架的组件的大小/位置。

面板大小为(0,0)的原因是因为在框架可见之后将面板添加到框架中,因此永远不会调用布局管理器。

此外,您不应该通过调用框架上的pack()方法来设置应让布局管理器完成其工作的框架大小。

您的代码的正确顺序应为:

    LinePanel panel=new LinePanel();

    JFrame frame=new JFrame();
    frame.add(panel);
    //frame.setSize(500, 500);
    frame.pack();
    frame.setVisible(true);

此外,当您进行自定义绘制时,面板负责确定自己的大小,因此您还需要覆盖面板的getPreferredSize()方法:

@Override
public Dimension getPreferredSize()
{
    return new Dimension(500, 500);
}

现在,布局管理器可以正常工作。