2016-04-05 9 views
0

別のJavaのスイングの質問。私は本当に本当にたくさんの時間を探しましたが、私のコードは動作しません。だから皆さんが私を助けてくれることを願っています。私は基本的な理解の問題があると思う。Javaで形を描く字形

既存のコードを展開する必要があります。 私の最初の仕事は、マウスクリックから線を引いてリリースすることでした。私はそれをうまく実装しました。

ここで、JMenuItemをクリックして円を描画するために、RandomDrawerクラスに不足しているコードを実装する必要があります。彼らは無作為でなければなりませんが、それは今は重要ではありません。実際に私の形を見ると、私はこれを行うことができます:D。

私の問題は、何かを描くことができないということです。 私は彼にキャンバスにペイントするように教えてもらえますか? Painterクラスでは、RandomDrawerクラスと同じ方法で実装していますが、それはできません。 誰かが私を助けることができますか?ここで

は、これまでの私のコードです:

package plotterpackage; 

    import java.awt.BorderLayout; 
    import java.awt.Color; 
    import java.awt.Dimension; 
    import java.awt.FlowLayout; 
    import java.awt.Graphics; 
    import java.awt.Graphics2D; 
    import java.awt.Point; 
    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.JComponent; 
    import javax.swing.JFrame; 
    import javax.swing.JLabel; 
    import javax.swing.JMenu; 
    import javax.swing.JMenuBar; 
    import javax.swing.JMenuItem; 
    import javax.swing.JPanel; 
    import javax.swing.JTextField; 
    import javax.swing.WindowConstants; 
    import javax.swing.border.BevelBorder; 

    /

public class Main { 
    private JFrame frame; 
    private JPanel canvas; 
    private JPanel statusBar; 
    private JTextField status; 

    public Main() { 
     initialize(); 
    } 

    public static void main(String[] args) { 
     Main app = new Main(); 
     app.start(); 
    } 

    protected void initialize() { 
     frame = new JFrame("Main"); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     frame.setBounds(50,50, 50+640, 50+480); 
     frame.setBackground(Color.GREEN); 
     frame.setJMenuBar(createMenuBar()); 

     frame.getContentPane().add(createContent(), BorderLayout.CENTER); 
     frame.getContentPane().add(createStatusBar(),BorderLayout.SOUTH); 
    } 

    public void start() { 
     // show the GUI 
     frame.setVisible(true); 
     status.setText("Application started"); 
    } 

    protected JComponent createContent() { 
     canvas = new JPanel(); 
     canvas.addMouseListener(new Painter()); 
     canvas.setBackground(new Color(128,218,255)); 
     canvas.setForeground(Color.RED); 
     canvas.setBorder(new BevelBorder(BevelBorder.LOWERED)); 
     return canvas; 
    } 

    protected JComponent createStatusBar() { 
     FlowLayout layout = new FlowLayout(FlowLayout.LEFT); 
     layout.setHgap(5); 

     statusBar = new JPanel(layout); 
     statusBar.add(new JLabel("Status: ")); 

     status = new JTextField(); 
     status.setPreferredSize(new Dimension(400,25)); 
     status.setEditable(false); 
     status.setBorder(new BevelBorder(BevelBorder.RAISED,Color.MAGENTA,Color.LIGHT_GRAY)); 
     status.getInsets().set(2, 10, 2, 10); 
     statusBar.add(status); 

     return statusBar; 
    } 

    protected JMenuBar createMenuBar() { 
     JMenuBar mb = new JMenuBar(); 
     JMenuItem item; 
     JMenu menu; 
     // Action menu 
     menu = new JMenu("Actions"); 
     mb.add(menu); 
     item = new JMenuItem("Draw RandomCircle"); 
     item.addActionListener(new RandomDrawer()); 
     menu.add(item); 

     item = new JMenuItem("Draw RandomTriangle"); 
     item.addActionListener(new RandomDrawer()); 
     menu.add(item); 

     menu.addSeparator(); 
     item = new JMenuItem("Exit"); 
     item.addActionListener(new AppCloser()); 
     menu.add(item); 

     // Color menu not used so far 
     menu = new JMenu("Colors");   
     mb.add(menu); 
     // Help menu not used so far 
     menu = new JMenu("Help");   
     mb.add(menu); 

     return mb; 
    } 

    class AppCloser implements ActionListener { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      System.out.printf("application finished, bye-bye... \n"); 
      frame.setVisible(false); 
      frame.dispose(); 
      System.exit(0); 
     }   
    } 

    class RandomDrawer extends JPanel implements ActionListener { 

     @Override 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.drawOval(50, 50, 50, 50); 
      //repaint(); 
     } 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      double x = Math.random(); 
      double y = Math.random(); 
      status.setText(String.format("rnd draw x:%.3f y:%.3f",x,y)); 
      //Graphics2D gg = (Graphics2D) canvas.getGraphics(); 
      //paintComponent(gg); 
      //gg.draw(new Line2D.Double(0, 0, x, y)); 
      //gg.drawLine(5, 5, 20, 20); 
      //gg.paintComponent(); 
     } 


    } 


    class Painter extends MouseAdapter { 
     Point start, end; 
     int startX, startY; 

     @Override 
     public void mousePressed(MouseEvent e) { 
      start = e.getPoint(); 
      startX = e.getX(); 
      startY = e.getY(); 
      status.setText(String.format("Mouse start: " + start)); 

     } 


     @Override 
     public void mouseReleased(MouseEvent e) { 
      end = e.getPoint(); 
      status.setText(String.format("Mouse end: " + end)); 
      Graphics2D gc = (Graphics2D) canvas.getGraphics(); 
      //gc.drawLine(0, 0, 80, 80); 
      gc.drawLine(startX, startY, e.getX(), e.getY()); 
      //gc.drawOval(startX, startY, e.getX(), e.getY()); 
      //gc.fillOval(startX, startY, e.getX(), e.getY()); 
     }   
    } 
} 

どうもありがとうございました。

+0

私にとって大きな助けとなるのは、各メソッド(およびそれらのメソッドの中に*たくさんのプリントを*追加することによってコードが何をしているのかを追跡することです。各アトミックコールの前または後)。その後、コードの実行を追跡し、何が間違っているのかを見つけることができます。 – klaar

答えて

0

キャンバスにMouseMotionListenerも含める必要があります。 これであなたの画家クラスを交換し、アプリケーションを実行し、あなたはペイントアプリケーションごとに四角形を描画することができます

Painter painter = new Painter(); 
canvas.addMouseListener(painter); 
canvas.addMouseMotionListener(painter); 

はまた、あなたの矩形に描画効果を追加するには、次のようにあなたの画家クラスを変更する必要があります。

class Painter extends MouseAdapter implements MouseMotionListener 
    { 
    Point start, end; 

    Point oldStart, oldEnd; 

    int startX, startY, oldX, oldY, oldWidth, oldHeight; 

    public void mousePressed(MouseEvent e) 
    { 
     start = e.getPoint(); 
     oldX = startX; 
     oldY = startY; 
     startX = e.getX(); 
     startY = e.getY(); 
     status.setText(String.format("Mouse start: " + start)); 

    } 

    public void mouseDragged(MouseEvent e) 
    { 
     Graphics2D gc = (Graphics2D)canvas.getGraphics(); 
     end = e.getPoint(); 
     gc.setColor(new Color(128, 218, 255)); 
     gc.drawOval(oldX, oldY, oldWidth, oldHeight); 
     oldX = startX; 
     oldY = startY; 
     oldWidth = e.getX(); 
     oldHeight = e.getY(); 
     gc.setColor(Color.BLACK); 
     gc.drawOval(startX, startY, e.getX(), e.getY()); 
    } 

    public void mouseReleased(MouseEvent e) 
    { 
     end = e.getPoint(); 
     status.setText(String.format("Mouse end: " + end)); 
     Graphics2D gc = (Graphics2D)canvas.getGraphics(); 
     oldX = 0; 
     oldY = 0; 
     oldWidth = 0; 
     oldHeight = 0; 

    } 
    } 
+0

Sandeep.Kのおかげで、あなたのコードが何を理解しているのか理解してくれました。 – Kaw

+0

問題を解決するのに役立ちましたら[回答を受け入れてください](http://meta.stackexchange.com/a/5235/155831)してください。 –

+0

私は、申し訳ありません..新しい:) – Kaw