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

Posted

技术标签:

【中文标题】在java中单击菜单项时如何更改形状【英文标题】:how to change shapes when clicking menu items in java 【发布时间】:2016-01-24 15:33:22 【问题描述】:

当用户使用 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);
    




非常感谢任何帮助。

【问题讨论】:

问题标签已更改:您的问题实际上与 NetBeans(IDE)无关,而与 Swing(图形库)有关。 【参考方案1】:

建议:

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

即,

@Override
public void paintComponent(Graphics g) 
    super.paintComponent(g);
    if (drawRectangle) 
        rectangle(g);
     else 
        circle(g);
    

【讨论】:

感谢您的回复。是的,我在考虑布尔值,但遗憾的是我有 4 种形状。你能举个枚举的例子吗? @JayGorio:先自己尝试一下,然后向我们展示您的尝试。你不会后悔尝试这个,我相信你能做到。 谢谢,但我在使用 ;super.paintComponent(); 时遇到了这个错误 嗯,好的,非常感谢您的想法。我没有使用 switch,而是使用 if 条件并调用paintComponent 中的方法。再次感谢您。 @JayGorio:但重要的是还要调用super的方法,否则之前的图纸不会被删除。

以上是关于在java中单击菜单项时如何更改形状的主要内容,如果未能解决你的问题,请参考以下文章

右键单击任何菜单项时如何获取 MenuItem 名称?

在 UWP 中单击汉堡菜单项时如何提高应用程序性能?

我们如何在单击菜单条项时突出显示活动菜单项?

单击侧菜单项时如何避免刷新页面

如何在WPF中单击菜单项时在父窗口下打开子窗口?

如何在单击上下文菜单的某个项时判断上下文菜单上的窗体控件