2013-02-21 49 views
0

我需要创建一个绘制形状的程序(用户使用单选按钮选择)以及是否填充了形状(用户使用复选框选择)。这是我到目前为止的代码:用户选择的绘制形状

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class SelectShape extends JFrame implements ItemListener{ 
    private JRadioButton line = new JRadioButton("Line"); 
    private JRadioButton rect = new JRadioButton("Rectangle"); 
    private JRadioButton oval = new JRadioButton("Oval"); 
    private JCheckBox fill = new JCheckBox("Filled"); 
    private FigurePanel fp; 


public static void main(String[] args) { 
    SelectShape frame = new SelectShape(); 
    frame.setTitle("Select Shape"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setLocationRelativeTo(null); 
    frame.setSize(400,400); 
    frame.setVisible(true); 
} 

public SelectShape() { 
    JPanel p1 = new JPanel(); 
    p1.add(fp); 
    fp.setBackground(Color.WHITE); 
    p1.setSize(200,400); 

    JPanel p2 = new JPanel(); 
    p2.setLayout(new FlowLayout()); 
    p2.add(line); 
    p2.add(rect); 
    p2.add(oval); 
    p2.add(fill); 
    add(p2, "South"); 

    line.addItemListener(this); 
    rect.addItemListener(this); 
    oval.addItemListener(this); 
    fill.addItemListener(this); 

} 

public void ItemStateChanged(ItemEvent e) { 
    if(rect.isSelected()) { 
     FigurePanel.dRect(); 
     repaint(); 
    } 
    else if(oval.isSelected()) { 
     FigurePanel.dOval(); 
     repaint(); 
    } 
    else if(line.isSelected()) { 
     FigurePanel.dLine(); 
     repaint(); 
    } 
    if(fill.isSelected()) { 
     FigurePanel.fill(); 
     repaint(); 
    } 
    else { 
     FigurePanel.erase(); 
     repaint(); 
    } 
}  
} 

class FigurePanel extends JPanel { 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    public void dLine(Graphics g) { 
     g.drawLine(10,10,160,10); 
    } 
    public void dRect(Graphics g) { 
     g.drawRect(10,10,150,50); 
    } 
    public void dOval(Graphics g) { 
     g.drawOval(10,10,150,50); 
    } 

    public void fill(Graphics g) { 
     g.setColor(Color.GREEN); 
     if(rect.isSelected()) { 
      g.fillRect(10,10,150,50); 
     } 
     else if(oval.isSelected()) { 
      g.fillOval(10,10,150,50); 
     } 
    } 
    public void erase(Graphics g) { 
     g.setColor(Color.WHITE); 
     if(rect.isSelected()) { 
      g.fillRect(10,10,150,50); 
     } 
     else if(oval.isSelected()) { 
      g.fillOval(10,10,150,50); 
     } 
    } 
} 
} 

我收到的错误是表达式和​​标识符预期的非法开始。如果我应该以另一种方式处理,请告诉。

回答

3

我想你需要回到基础...

这样可不行......

fp.setBackground("white"); 

Component#setBackground不采取String作为一个参数,它需要一个Color

你所有的addItemListener通话arn't去工作,因为你没有实现ItemListener

我不知道你希望这样做是什么...

@Override 
fp.dRect(); 

但它不会工作。 @Override用于指示方法被祖先覆盖,您只需调用方法FigurePanel

Java与C和C++类似,区分大小写;

有没有这样的类itemEvent ......这是ItemEvent

public void ItemStateChanged(itemEvent e) { 

有没有这样的类graphics,这是Graphics

public void paintComponent(graphics g) { 

而且我也不打算尝试和猜测什么它是你希望实现以下...

public void paintComponent(graphics g) { 
    super.paintComponent(g); 
    dLine() { 
     g.drawLine(10, 10, 160, 10); 
    } 
    dRect() { 
     g.drawRect(10, 10, 150, 50); 
    } 
    dOval() { 
     g.drawOval(10, 10, 150, 50); 
    } 
    fill() { 
     g.setColor(Color.GREEN); 
      if (rect.isSelected()) { 
       g.fillRect(10, 10, 150, 50); 
      } else if (oval.isSelected()) { 
       g.fillOval(10, 10, 150, 50); 
      } 
     } 
    erase() { 
     g.setColor(Color.WHITE); 
     if (rect.isSelected()) { 
      g.fillRect(10, 10, 150, 50); 
     } else if (oval.isSelected()) { 
      g.fillOval(10, 10, 150, 50); 
     } 
    } 
} 

Java不支持“内联方法”(或者你想要调用它们的内容)和否,使他们的方法也不会实现你正在尝试做的事情......

事实上,你做得很好的一件事是重写paintComponent并致电super.paintComponent ......做得很好:D!

更新

我会鼓励你有一个看一遍......

更新,其中可能的运行例子

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Shape; 
import java.awt.event.ActionEvent; 
import java.awt.geom.Ellipse2D; 
import java.awt.geom.Line2D; 
import java.awt.geom.Rectangle2D; 
import javax.swing.AbstractAction; 
import javax.swing.ButtonGroup; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JRadioButton; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class DrawShapes { 

    public static void main(String[] args) { 
     new DrawShapes(); 
    } 

    public DrawShapes() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new DrawPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class DrawPane extends JPanel { 

     public DrawPane() { 

      setLayout(new BorderLayout()); 

      RenderPane rp = new RenderPane(); 
      add(new ControlsPane(rp), BorderLayout.NORTH); 
      add(rp); 

     } 

    } 

    public class ControlsPane extends JPanel { 

     public ControlsPane(RenderPane rp) { 

      JRadioButton[] btns = new JRadioButton[4]; 
      btns[0] = new JRadioButton(new LineAction(rp)); 
      btns[1] = new JRadioButton(new RectangleAction(rp)); 
      btns[2] = new JRadioButton(new OvalAction(rp)); 
      btns[3] = new JRadioButton(new ClearAction(rp)); 

      ButtonGroup bg = new ButtonGroup(); 
      for (JRadioButton btn : btns) { 
       bg.add(btn); 
       add(btn); 
      } 

     } 

    } 

    public class RenderPane extends JPanel { 

     private Shape shape; 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(400, 400); 
     } 

     public void setShape(Shape shape) { 
      this.shape = shape; 
      repaint(); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      if (shape != null) { 
       g2d.setColor(Color.RED); 
       g2d.draw(shape); 
      } 
      g2d.dispose(); 
     } 

    } 

    public class LineAction extends AbstractRenderAction { 

     public LineAction(RenderPane renderPane) { 
      super(renderPane); 
      putValue(NAME, "Line"); 
     } 

     @Override 
     public Shape getShape() { 
      return new Line2D.Float(0f, 0f, getRenderPane().getWidth(), getRenderPane().getHeight()); 
     } 

    } 

    public class RectangleAction extends AbstractRenderAction { 

     public RectangleAction(RenderPane renderPane) { 
      super(renderPane); 
      putValue(NAME, "Rectangle"); 
     } 

     @Override 
     public Shape getShape() { 
      return new Rectangle2D.Float(10, 10, getRenderPane().getWidth() - 20, getRenderPane().getHeight() - 20); 
     } 

    } 

    public class OvalAction extends AbstractRenderAction { 

     public OvalAction(RenderPane renderPane) { 
      super(renderPane); 
      putValue(NAME, "Oval"); 
     } 

     @Override 
     public Shape getShape() { 
      float radius = Math.min(getRenderPane().getWidth() - 20, getRenderPane().getHeight() - 20); 
      return new Ellipse2D.Float(10, 10, radius, radius); 
     } 

    } 

    public class ClearAction extends AbstractRenderAction { 

     public ClearAction(RenderPane renderPane) { 
      super(renderPane); 
      putValue(NAME, "Clear"); 
     } 

     @Override 
     public Shape getShape() { 
      return null; 
     } 

    } 

    public abstract class AbstractRenderAction extends AbstractAction { 

     private RenderPane renderPane; 

     public AbstractRenderAction(RenderPane renderPane) { 
      this.renderPane = renderPane; 
     } 

     public RenderPane getRenderPane() { 
      return renderPane; 
     } 

     public abstract Shape getShape(); 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      getRenderPane().setShape(getShape()); 
     } 

    } 

} 
+0

我已经editted代码你写的变化... 你觉得我应该去绘制不同的形状,当用户点击,如果单选按钮使他们的方法将无法正常工作。 – Acitropy 2013-02-21 03:53:13

+0

这将取决于。你想保留他们以前绘制或不绘制? – MadProgrammer 2013-02-21 04:05:51

+0

不,我需要先前的图纸才能删除,然后绘制新的图纸。 – Acitropy 2013-02-21 04:13:49

1

好了,下面肯定是无效的Java代码:

dLine() { 
     g.drawLine(10,10,160,10); 
    } 

这同样适用于以下dRect等

我不知道你想实现与什么该代码。如果是定义一个名为鼎联方法,你会怎么做,而不是执行以下操作:

public void dLine(Graphics g) { 
    g.drawLine(10, 10, 160, 10); 
} 

我也注意到下面的代码,当前未导致您的问题,但它会:

public void ItemStateChanged(itemEvent e) { 

这是不正确的大写,所以它不会编译,你也没有听任何事件,所以它永远不会被调用。

代码中存在各种其他错误,但这应该让您开始。