2016-04-05 42 views
0

另一個Java swing問題。我真的搜索了很多小時,但我無法讓我的代碼工作..所以我希望你們能幫助我。我認爲我有一些基本的理解問題。我不得不擴展現有的代碼。 我的第一個任務是從鼠標點擊到釋放,我成功實現了這一點。Java中的抽象形狀

現在我應該在RandomDrawer類中實現缺少的代碼來通過單擊JMenuItem來繪製圓。他們應該是隨機的,所有的,但現在並不重要,我可以做到這一點,當我實際上繪製或查看我的形狀: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