JFrame
nie posiada metody paintComponent(Graphics g)
. Dodaj @Override
annotation, a otrzymasz błąd czasu kompilacji.
1) Użyj JPanel
i zastąpić paintComponent
(byś niż dodać JPanel
do JFrame
viad JFrame#add(..)
)
2) przesłonić getPreferredSize()
powrotu prawidłowych Dimension
S, które pasują do Twojego rysunku na obiekcie Graphics albo przyzwyczajenie być postrzegane jako JPanel
rozmiar bez składników wynosi 0,0
3) nie wywołać setSize
na JFrame
... raczej używać poprawnej LayoutManager
i/lub zastąpić getPrefferedSize()
i nazywają pack()
na JFrame
po dodaniu wszystkich składników, ale przed ustawieniem to widoczne
4) Czy odczytu na Concurrency in Swing konkretnie o Event Dispatch Thread
5) oglądać schemat nazewnictwa klasa powinna zaczynać się od litery i każdej pierwszej litery nowego słowa potem powinno być skapitalizowane
6) Również ty extend JFrame
i mieć zmienną JFrame
? Zabierz extend JFrame
i zachować zmienną JFrame
jak nie chcemy 2 JFrame
S i jej nie dobrej praktyki przedłużyć JFrame
chyba dodanie funkcjonalności
Oto kod z powyższych poprawek (jakość obrazu wymówka, ale musiał zmienić rozmiar albo szło 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();
}
});
}
}
Jak na swój komentarz:
Przygotowuję mapę zawierającą wiele wielokątów, a wczoraj i użyłem JPanela nad ramką JFrame i próbowałem sprawdzić, czy mysz jest wewnątrz wielokąta z MouseListener.później zobaczyłem, że mouseListener dał fałszywych odpowiedzi (jak mysz nie jest wewnątrz wielokąta, ale działa tak jak wewnątrz wielokąta). tak Usunąłem JPanel i to pracował
Tutaj jest aktualizowana kod z MouseAdapter
i nadpisane mouseClicked
aby sprawdzić, czy kliknięcie było wewnątrz wielokąta.
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();
}
});
}
}
tak naprawdę przygotowuję mapę zawierającą wiele wielokątów, a wczoraj użyłem JPanela nad ramką JFrame i próbowałem sprawdzić, czy mysz znajduje się wewnątrz wielokąta przy pomocy MouseListener. później zobaczyłem, że mouseListener podał fałszywe odpowiedzi (np. mysz nie znajduje się wewnątrz wielokąta, ale działa jak wewnątrz wieloboku). więc usunąłem JPanel, a potem zadziałało. – quartaela
@quartaela Problemem nie było IMO JPanel, to było gdzieś, gdzie –
ok, wtedy spróbuję w ten sposób. mam nadzieję, że zadziała – quartaela