о рисовании многоугольника в java
Привет, я пытаюсь улучшить себя о java2D и, прежде всего, я имею дело с рисованием полигонов. Однако я не вижу многоугольник на кадре. Я читал некоторые учебники и примеры, но как я сказал, я сталкиваюсь с проблемами. вот пример кода рисования многоугольника;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Polygon;
import javax.swing.JFrame;
public class jRisk extends JFrame {
private JFrame mainMap;
private Polygon poly;
public jRisk(){
initComponents();
}
private void initComponents(){
mainMap = new JFrame();
mainMap.setSize(800, 600);
mainMap.setResizable(false);
mainMap.setVisible(true);
mainMap.setDefaultCloseOperation(JFrame.EXIT_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);
}
protected void paintComponent(Graphics g){
super.paintComponents(g);
g.setColor(Color.BLUE);
g.drawPolygon(poly);
}
/**
* @param args
*/
public static void main(String[] args) {
new jRisk();
}
}
3 ответов
JFrame
нет paintComponent(Graphics g)
метод. Добавьте @Override
аннотации и вы получите ошибку времени компиляции.
1) Использовать JPanel
и заменить paintComponent
(ты бы не добавить JPanel
до JFrame
виад JFrame#add(..)
)
2) переопределить getPreferredSize()
чтобы вернуть правильный Dimension
s, которые соответствуют вашему рисунку на графическом объекте, иначе они не будут рассматриваться как JPanel
размер без компонентов 0,0
3) не называют setSize
on JFrame
... скорее используйте правильный LayoutManager
и/или переопределить getPrefferedSize()
и звонок pack()
on JFrame
после добавления всех компонентов, но перед установкой его видно
4) прочтите на параллелизм в Swing конкретно про Поток Отправки Событий
5) схема именования классов watch должна начинаться с заглавной буквы, и каждая первая буква нового слова после этого должна быть заглавной
6) Также вы extend JFrame
и переменная JFrame
? Уберите extend JFrame
и сохранить JFrame
переменная, поскольку мы не хотим 2 JFrame
s и его не хорошая практика для расширения JFrame
если не добавлять функциональность
вот ваш код с вышеуказанными исправлениями (извините качество изображения, но пришлось изменить размер или он собирался 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();
}
});
}
}
согласно вашему комментарию:
я готовлю карту, которая включает в себя много полигонов и вчера я используется для jpanel над JFrame, и я попытался проверить, была ли мышь внутри многоугольника с MouseListener. позже я увидел, что mouseListener дал false отвечает (например, мышь не находится внутри полигона, но она действует как будто это было внутри многоугольника). поэтому я удалил JPanel, а затем он работал
вот обновленный код с MouseAdapter
и переопределить mouseClicked
чтобы проверить, был ли клик внутри полигона.
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();
}
});
}
}
JFrame
не распространяется JComponent
поэтому не переопределяет paintComponent
. Вы можете проверить это, добавив @Override
Примечание.
чтобы получить эту функцию извлечения paintComponent
к новому классу, который расширяет JComponent
. Не забудьте позвонить super.paintComponent(g)
, а не super.paintComponents(g)
.
заменить
protected void paintComponent(Graphics g){
super.paintComponents(g);
g.setColor(Color.BLUE);
g.drawPolygon(poly);
}
С
protected void paint(Graphics g){
super.paint(g);
g.setColor(Color.BLUE);
g.drawPolygon(poly);
}