我尝试做一些非常基本的事情:编写程序,在两点之间的框架上画一条线:按下鼠标的点和释放鼠标的点。
我有这些课程:
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}}方法也没有打印在控制台上。
我做错了什么?
答案 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);
}
现在,布局管理器可以正常工作。