こんにちは。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();
}
}
JFrame
には paintComponent(Graphics g)
メソッドがありません。 _@Override
_注釈 を追加すると、コンパイル時エラーが発生します。
1)JPanel
を使用してpaintComponent
をオーバーライドします(JPanel
viad JFrame#add(..)
にJFrame
を追加します)
2)getPreferredSize()
をオーバーライドして、グラフィックスオブジェクトの描画に適合する正しいDimension
sを返すか、コンポーネントなしでJPanel
サイズとして表示されません0,0
3)setSize
でJFrame
を呼び出さないでください...正しいLayoutManager
を使用するか、getPrefferedSize()
をオーバーライドしてpack()
を呼び出しますすべてのコンポーネントを追加した後、可視に設定する前のJFrame
4) Swingの同時実行性 について、特に Event Dispatch Thread について読んでください。
5)時計クラスの命名スキームは大文字で始め、新しい単語の最初の文字はすべて大文字にする必要があります
6)また、あなたは_extend JFrame
_であり、変数JFrame
を持っていますか? _extend JFrame
_を取り除き、JFrame
変数を保持します。2JFrame
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();
}
});
}
}
_
あなたのコメントに従って:
たくさんのポリゴンを含むマップを準備しています。昨日はJFrameでJPanelを使用し、マウスがポリゴン内にあるかどうかをMouseListenerで確認しようとしました。後で、mouseListenerが誤った応答を返したことを確認しました(マウスがポリゴンの内側にないようですが、ポリゴンの内側のように動作します)。 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);
}