JFrame
không có một phương pháp paintComponent(Graphics g)
. Thêm @Override
annotation và bạn sẽ gặp lỗi thời gian biên dịch.
1) Sử dụng JPanel
và ghi đè paintComponent
(bạn sẽ hơn thêm JPanel
đến JFrame
viad JFrame#add(..)
)
2) Override getPreferredSize()
trở về đúng Dimension
s mà phù hợp với bản vẽ của bạn trên đối tượng Graphics hoặc nếu không họ sẽ không được coi là JPanel
kích thước mà không cần các thành phần là 0,0
3) không gọi setSize
trên JFrame
... thay vì sử dụng một đúng LayoutManager
và/hoặc ghi đè getPrefferedSize()
và gọi pack()
trên JFrame
sau khi thêm tất cả các thành phần nhưng trước khi đặt nó có thể nhìn thấy
4) Có một chi trên Concurrency in Swing cụ thể về Event Dispatch Thread
5) xem sơ đồ đặt tên lớp nên bắt đầu với một chữ cái viết hoa và mỗi chữ cái đầu tiên của một từ mới sau đó nên được viết hoa
6) Bạn cũng extend JFrame
và có biến số JFrame
? Lấy đi extend JFrame
và giữ biến JFrame
như chúng tôi không muốn 2 JFrame
s và thực hành không tốt của mình để mở rộng JFrame
trừ việc thêm chức năng
Đây là mã của bạn với các bản sửa lỗi trên (chất lượng hình ảnh cớ nhưng đã phải thay đổi kích thước hoặc nó đang diễn ra đến 800x600):

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Polygon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class JRisk {
private JFrame mainMap;
private Polygon poly;
public JRisk() {
initComponents();
}
private void initComponents() {
mainMap = new JFrame();
mainMap.setResizable(false);
mainMap.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
int xPoly[] = {150, 250, 325, 375, 450, 275, 100};
int yPoly[] = {150, 100, 125, 225, 250, 375, 300};
poly = new Polygon(xPoly, yPoly, xPoly.length);
JPanel p = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.BLUE);
g.drawPolygon(poly);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(800, 600);
}
};
mainMap.add(p);
mainMap.pack();
mainMap.setVisible(true);
}
/**
* @param args
*/
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new JRisk();
}
});
}
}
Theo nhận xét của bạn:
Tôi đang chuẩn bị một bản đồ bao gồm rất nhiều đa giác và ngày hôm qua i đã sử dụng JPanel trên JFrame và tôi đã cố gắng kiểm tra xem con chuột có nằm trong số của đa giác với MouseListener không.sau đó tôi thấy rằng mouseListener đã cho ra các câu trả lời sai (như chuột không nằm trong đa giác nhưng nó hoạt động giống như nó nằm trong đa giác). vì vậy tôi đã xóa JPanel và sau đó nó làm việc
đây được cập nhật mã với MouseAdapter
và ghi đè mouseClicked
để kiểm tra xem nhấp chuột là trong đa giác.
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Polygon;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class JRisk {
private JFrame mainMap;
private Polygon poly;
public JRisk() {
initComponents();
}
private void initComponents() {
mainMap = new JFrame();
mainMap.setResizable(false);
mainMap.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
int xPoly[] = {150, 250, 325, 375, 450, 275, 100};
int yPoly[] = {150, 100, 125, 225, 250, 375, 300};
poly = new Polygon(xPoly, yPoly, xPoly.length);
JPanel p = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.BLUE);
g.drawPolygon(poly);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(800, 600);
}
};
MouseAdapter ma = new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent me) {
super.mouseClicked(me);
if (poly.contains(me.getPoint())) {
System.out.println("Clicked polygon");
}
}
};
p.addMouseListener(ma);//add listener to panel
mainMap.add(p);
mainMap.pack();
mainMap.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new JRisk();
}
});
}
}
thực sự tôi đang chuẩn bị một bản đồ bao gồm rất nhiều đa giác và ngày hôm qua tôi đã sử dụng JPanel trên JFrame và tôi đã thử kiểm tra xem con chuột có nằm trong đa giác với MouseListener hay không. sau đó tôi thấy rằng mouseListener đã trả lời sai (như chuột không phải là bên trong đa giác nhưng nó hoạt động giống như nó nằm trong đa giác). vì vậy tôi đã xóa JPanel và sau đó nó hoạt động. – quartaela
@quartaela Vấn đề không phải là JPanel IMO nó là nơi khác, nơi –
ok sau đó tôi sẽ cố gắng theo cách này. hy vọng nó sẽ làm việc – quartaela