2016-04-05 36 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