单击java中的菜单项时如何更改形状

时间:2016-01-24 15:33:22

标签: java swing shape paintcomponent menubar

当用户使用JFrame单击java中的菜单项时,我在更改显示的形状时遇到问题。任何人都可以建议我如何解决这个问题?以下是我的代码:

public class PlayingWithShapes implements ActionListener
{
    protected JMenuItem circle = new JMenuItem("Circle");
    protected String identifier = "circle";
    public PlayingWithShapes()
    {
    JMenuBar menuBar = new JMenuBar();
    JMenu shapes = new JMenu("Shapes");
    JMenu colors = new JMenu("Colors");

    circle.addActionListener(this);
    shapes.add(circle);
    menuBar.add(shapes);
    menuBar.add(colors);
    JFrame frame = new JFrame("Playing With Shapes");
    frame.setSize(600,400);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
    frame.add(new Shapes());
    frame.setJMenuBar(menuBar);
}

public static void main(String args[])
{
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
           new PlayingWithShapes();
        }
    };
    EventQueue.invokeLater(runnable);

}

我想在点击圆圈menuItem

时将形状更改为圆形
@Override
public void actionPerformed(ActionEvent click) {

   if(click.getSource() == circle){
      Shapes shape = new Shapes();

   }
}

public class Shapes extends JPanel
{

如何调用矩形?

    @Override
    public void paintComponent(Graphics shapes)
    {
        circle(shapes);
    }

    public void circle(Graphics shapes)
    {
        shapes.setColor(Color.yellow);
        shapes.fillOval(200,100, 100, 100);
    }
    public void rectangle(Graphics shapes)
    {
        shapes.setColor(Color.MAGENTA);
        shapes.fillRect(200,100,100,100);
    }

}

}

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

建议:

  • 不要在actionPerformed中创建新的Shapes JPanel,因为这样做什么都没有。
  • 而是在actionPerformed中更改类的字段的状态,并将paintComponent方法中的绘图基于该字段所持有的状态。
  • 例如,如果您只有两种不同类型的形状,则上面的字段可能只是一个布尔值,可能称为drawRectangle,并且在actionPerformed中您将其更改为true或false并调用{{1 }}。然后在paintComponent中使用if块,如果是true则绘制一个Rectangle,否则使用椭圆。
  • 如果您希望能够绘制多个不同的形状,请创建一个枚举,并使上面讨论的字段成为此枚举类型的字段。然后在paintComponent中使用switch语句来决定绘制哪个形状。
  • 如果要同时显示不同的形状,则需要创建一个Shape集合,例如repaint();,并将Shape派生的对象添加到此集合中,然后在其中迭代paintComponent中的for循环使用Graphics2D对象绘制每个Shape。我认为你现在不需要这个。
  • 不要忘记在方法覆盖中调用ArrayList<Shape>

即,

super.paintComponent(g);