单击菜单项时,无法在屏幕上显示图形。

时间:2013-11-21 17:01:07

标签: java swing user-interface jpanel

我在一个框架内有两个面板。顶部控制面板有一个菜单,有三个对象,方形,圆形和三角形。我的框架实现了顶部面板中的代码。当我从菜单中选择形状时,我现在无法在屏幕上输出形状。我已经附加了我的顶级控制面板和我的MyFrame类。感谢您的帮助,非常感谢。谢谢。

这是我的MyFrame类。

public class MyFrame extends javax.swing.JFrame implements ActionListener, ChangeListener {

public static Shapes shape1;
private JMenuItem Square;
private JMenuItem Triangle;
private JMenuItem Circle;
private jPanelTop d1 = new jPanelTop();
public MyFrame() {
    initComponents();

    MyControlPanel controlPanelShapes = new MyControlPanel();
    controlPanelShapes.setSize(1000, 1000);
    controlPanelShapes.setLocation(0, 20);
    add(controlPanelShapes);

    d1.setSize(400, 400);
    d1.setVisible(true);
    this.add(d1);

    JMenuBar jBarShape = new JMenuBar();
    JMenu Shape = new JMenu();
    Shape.setText("Shape");

    Square = new JMenuItem();
    Square.setText("Square");
    Shape.add(Square);
    Square.addActionListener(this);

    Triangle = new JMenuItem();
    Triangle.setText("Triangle");
    Shape.add(Triangle);
    Triangle.addActionListener(this);

    Circle = new JMenuItem();
    Circle.setText("Circle");
    Shape.add(Circle);
    Circle.addActionListener(this);

    jBarShape.add(Shape);
    setJMenuBar(jBarShape);

}

@Override
public void stateChanged(ChangeEvent e) {
    throw new UnsupportedOperationException("Not supported yet.");
}

@Override
public void actionPerformed (ActionEvent e) {
    if (e.getSource() == Circle) {
        shape1 = new Circle();
        d1.setCircle();
    } else if (e.getSource() == Triangle) {
        shape1 = new Triangle();
    } else if (e.getSource() == Square) {
        shape1 = new Square();
        d1.setSquare();
    }
}

}

这是我的jPanel类:

public class jPanelTop extends javax.swing.JPanel {
public jPanelTop() {
    initComponents();
}
private int xPosition = 50;
private int yPosition = 50;
private Graphics g;

public void paintComponent() {
    super.paintComponent(g);
    g.drawRect(xPosition, yPosition, 70, 70);
    g.drawOval(xPosition, yPosition, 70, 70);   
}

public void setSquare()
{
    super.paintComponent(g);
    g.drawRect(xPosition, yPosition, 70, 70);
    repaint();
}
public void setCircle()
{
    super.paintComponent(g);
    g.drawOval(xPosition, yPosition, 70, 70);
    repaint();
}

}

我非常感谢任何帮助! :)谢谢!

1 个答案:

答案 0 :(得分:3)

您的paintComponent完全错误,因为它的签名与超类的签名不匹配。它需要接受Graphics参数。你的JPanel类应该有一个Graphics字段。

要绘制魔术,您的绘图方法必须覆盖JComponents的绘制方法。您可以通过在paintComponent方法之前添加@Override注释来测试您实际上没有这样做。这样做,编译器会抱怨你认为实际上是覆盖的方法不是(这就是为什么经常使用这个注释是一个非常好的想法 - 你希望编译器能够帮助你编写代码可能)。如果你的方法没有覆盖super的方法,那么它永远不会被JVM调用。

此外,您不应该尝试直接在setSquare和setCircle方法中使用Graphics。请再次阅读教程,了解如何正确完成。

您需要阅读有关如何绘制的教程。关键教程链接:


在进一步评估您的代码和问题时,请考虑:

  • 给你的绘图JPanel布尔变量,比如boolean drawCircleboolean drawSquare,并将它们设置为false。
  • 在正确的paintComponent覆盖方法中,如果drawCircle为true,则绘制一个圆,对于square / drawSquare,绘制一个圆。
  • 在你的setCircle方法中,将drawCircle设置为true,将drawSquare设置为false,并调用repaint。
  • 在你的setSquare方法中进行反转。
  • 学习并遵循Java命名约定:所有类名都应以大写字母开头。所有方法和字段/变量名称都应以小写字母开头。