1

ウィンドウ内でマウスを使って線を引こうとしていますが、行こうとJFrameするとうまくいきません。メニューは無視してください、後でそれを使ってやろうとしています!私は何を取りこぼしたか!ヒントをいただければ幸いです。

public class newGUI extends JFrame implements ActionListener, MouseMotionListener, MouseListener {
private static final long serialVersionUID = 1L;
public static final int WIDTH = 300;
public static final int HEIGHT = 200;
Point point1;
Point point2;
Line2D line2d;

public static void main(String[] args){
    newGUI gui = new newGUI();
    gui.setVisible(true);
}

public newGUI()
{
    super("Menu Demonstration");
    setSize(WIDTH, HEIGHT);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JMenu colorMenu = new JMenu("Choose Colors");
    JMenuItem greenChoice = new JMenuItem("GREEN");
    greenChoice.addActionListener(this);
    colorMenu.add(greenChoice);
    JMenuItem redChoice = new JMenuItem("RED");
    colorMenu.add(redChoice);
    JMenuBar bar = new JMenuBar();
    bar.add(colorMenu);
    setJMenuBar(bar);
    addMouseListener(this);
    addMouseMotionListener(this);
}
@Override
public void actionPerformed(ActionEvent arg0) {
    // TODO Auto-generated method stub

}

@Override
public void mouseClicked(MouseEvent arg0) {
    // TODO Auto-generated method stub

}

@Override
public void mouseEntered(MouseEvent arg0) {
    // TODO Auto-generated method stub

}

@Override
public void mouseExited(MouseEvent arg0) {
    // TODO Auto-generated method stub

}

@Override
public void mousePressed(MouseEvent arg0) {
    // TODO Auto-generated method stub
    point1=arg0.getPoint();
}

@Override
public void mouseReleased(MouseEvent arg0) {
    // TODO Auto-generated method stub

}

@Override
public void mouseDragged(MouseEvent arg0) {
    // TODO Auto-generated method stub
    point2=arg0.getPoint();
    line2d=new Line2D.Double(point1, point2);
    repaint();

}

@Override
public void mouseMoved(MouseEvent arg0) {
    // TODO Auto-generated method stub

}
public void paintComponent(Graphics g){
    Graphics2D g2d = (Graphics2D) g;
    if(point1!=null && point2!=null){
        g2d.setPaint(Color.RED);
        g2d.setStroke(new BasicStroke(1.5f));
        g2d.draw(line2d);
        repaint();
    }
}
}
4

1 に答える 1

5
  • クラス名は常に大文字で始めます。NewGui
  • Event Dispatch ThreadUI コンポーネントの作成と変更に使用
  • JFrameむやみに授業を延長しない
  • 呼び出すのsetSize(..)ではなくJFrame#pack()JFrameインスタンスを呼び出す
  • JFramepaintComponent(..)なく、カスタムを追加してそのandJPanelをオーバーライドしますpaintComponent(..)getPreferredSize(..)
  • super.paintComponent(..)カスタムを呼び出すことを忘れないでくださいJPanel
  • repaint()内部から呼び出さないでくださいpaintComponent(..)(これにより、必要以上に再描画する無限ループが発生します)
  • また、可能であれば (他のクラスで使用されていない場合) 匿名MouseListenerの s/MouseMotionListenerを使用MouseAdapterし、代わりにMouseListener/MouseMotionListenerなどを使用します。

これが私が作成した例です(基本的に、言及された修正を含むコード):

ここに画像の説明を入力

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Line2D;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class NewGui implements ActionListener {

    private static final long serialVersionUID = 1L;
    public static final int WIDTH = 300;
    public static final int HEIGHT = 200;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                NewGui gui = new NewGui();
            }
        });
    }

    public NewGui() {
        initComponents();
    }

    @Override
    public void actionPerformed(ActionEvent arg0) {
        // TODO Auto-generated method stub
    }

    private void initComponents() {
        JFrame frame = new JFrame("Menu Demonstration");

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JMenu colorMenu = new JMenu("Choose Colors");
        JMenuItem greenChoice = new JMenuItem("GREEN");
        greenChoice.addActionListener(this);
        colorMenu.add(greenChoice);
        JMenuItem redChoice = new JMenuItem("RED");
        colorMenu.add(redChoice);
        JMenuBar bar = new JMenuBar();
        bar.add(colorMenu);
        frame.setJMenuBar(bar);

        frame.add(new MyPanel());

        frame.pack();
        frame.setVisible(true);
    }
}

class MyPanel extends JPanel {

    Point point1;
    Point point2;
    Line2D line2d;

    public MyPanel() {
        addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent me) {
                super.mousePressed(me);
                point1 = me.getPoint();
            }
        });
        addMouseMotionListener(new MouseAdapter() {
            @Override
            public void mouseDragged(MouseEvent me) {
                super.mouseDragged(me);
                // TODO Auto-generated method stub
                point2 = me.getPoint();
                line2d = new Line2D.Double(point1, point2);
                repaint();
            }
        });
    }

    //so our panel will be visible
    @Override
    public Dimension getPreferredSize() {
        return new Dimension(400, 200);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;

        //Set  anti-alias!
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON); 

        if (point1 != null && point2 != null) {
            g2d.setPaint(Color.RED);
            g2d.setStroke(new BasicStroke(1.5f));
            g2d.draw(line2d);
        }
    }
}
于 2012-11-02T18:33:45.820 に答える