Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java绘制不绘制形状的组件_Java - Fatal编程技术网

Java绘制不绘制形状的组件

Java绘制不绘制形状的组件,java,Java,制作一个简单的Swing GUI应用程序,让用户选择一个形状,通过JSlider选择形状一侧的长度,然后应用程序计算面积/周长并在屏幕上绘制形状,但我似乎无法让它绘制形状。我错过了什么或做错了什么 对于糟糕的编码标准感到抱歉,这只是一个草稿,我将计划在工作时重写它,同时忽略自动代码 头等舱,我的框架。这只是一个JFrame,用户可以通过JMenu选择圆、正方形和三角形 import java.awt.BorderLayout; import java.awt.FlowLayout; import

制作一个简单的Swing GUI应用程序,让用户选择一个形状,通过JSlider选择形状一侧的长度,然后应用程序计算面积/周长并在屏幕上绘制形状,但我似乎无法让它绘制形状。我错过了什么或做错了什么

对于糟糕的编码标准感到抱歉,这只是一个草稿,我将计划在工作时重写它,同时忽略自动代码

头等舱,我的框架。这只是一个JFrame,用户可以通过JMenu选择圆、正方形和三角形

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;

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

MyShape circle, square, shape,  triangle;
MyControlPanel panel;

float area, perimeter;

public MyFrame() {
    //initComponents();
    panel = new MyControlPanel();
    panel.setOpaque(true);

    this.setSize(800,800);
    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    this.setLayout(new BorderLayout());        
    JMenuBar menuBar = new JMenuBar();
    JMenu menuShape = new JMenu("Shape");

    panel.getDimension();

    JMenuItem menuItemSquare = new JMenuItem("Square");
    menuItemSquare.addActionListener(this);

    JMenuItem menuItemTriangle = new JMenuItem("Triangle");
    menuItemTriangle.addActionListener(this);

    JMenuItem menuItemCircle = new JMenuItem("Circle");
    menuItemCircle.addActionListener(this);


    menuShape.add(menuItemSquare);
    menuShape.add(menuItemTriangle);
    menuShape.add(menuItemCircle);

    menuBar.add(menuShape);

    this.setJMenuBar(menuBar);



    //this.add(panel, BorderLayout.SOUTH);
    this.add(panel, BorderLayout.CENTER);
}

@Override
public void actionPerformed(ActionEvent e)
{
    String event = e.getActionCommand();

//not too sure if the standard is to use a switch or if statements?    
    switch(event)
    {
        case "Circle":
            circle = new Circle();
            panel.sendShape(circle, event);
            panel.setSlider(50);
            break;

        case "Square":
            square = new Square();
            panel.sendShape(square, event);
            panel.setSlider(50);
            break;

        case "Triangle":
            triangle = new Triangle();
            panel.sendShape(triangle, event);
            panel.setSlider(50);
            break;
    }

}

public float getArea()
{
    return area;
}

public float getPerimeter()
{
    return perimeter;
}

/**
 * This method is called from within the constructor to initialize the form.
 * WARNING: Do NOT modify this code. The content of this method is always
 * regenerated by the Form Editor.
 */
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 400, Short.MAX_VALUE)
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 300, Short.MAX_VALUE)
    );

    pack();
}// </editor-fold>                        

/**
 * @param args the command line arguments
 */
public static void main(String args[]) {
    /* Set the Nimbus look and feel */
    //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
    /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */
    try {
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (ClassNotFoundException ex) {
        java.util.logging.Logger.getLogger(MyFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(MyFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(MyFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(MyFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }
    //</editor-fold>

    /* Create and display the form */

    MyFrame frame = new MyFrame();
    frame.setVisible(true);

    }
}
感谢您的高级支持。

您必须覆盖

JComponent.paintComponent(final Graphics g) 
而不是

Container.paintComponents(final Graphics g)
它们有两个不同的用途。而且不需要调用
repaint()

编辑-让我试着澄清一下:

您的
Canvas
类扩展了
JPanel
它扩展了
JComponent
它扩展了
容器

因此,您的类继承了这些类的所有方法。此外,有可能超越它们来改变它们的行为。你已经使用了这个机制

您的陷阱只是选择了错误的方法(当然是因为它们的名称非常相似)。

您必须重写

JComponent.paintComponent(final Graphics g) 
而不是

Container.paintComponents(final Graphics g)
它们有两个不同的用途。而且不需要调用
repaint()

编辑-让我试着澄清一下:

您的
Canvas
类扩展了
JPanel
它扩展了
JComponent
它扩展了
容器

因此,您的类继承了这些类的所有方法。此外,有可能超越它们来改变它们的行为。你已经使用了这个机制


你的陷阱仅仅是选择了错误的方法(当然是因为他们的名字非常相似)。

TLDR;你需要做更多的工作来隔离这个问题。要么在调试器中运行,要么添加一些打印以确定丢失了哪些代码位……不,还没有。我将详细了解如何在netbeansEDIT中使用调试器:有人能告诉我一个好的调试器教程吗?据我所知,netbeans中的调试器只阻止了程序崩溃,但它没有崩溃,只是没有绘制。Junit也非常无用,因为它会引发空指针异常,但在运行整个程序时不会抛出这些错误。修复了,我在paintComponent.TLDR的末尾错误地添加了一个“s”;你需要做更多的工作来隔离这个问题。要么在调试器中运行,要么添加一些打印以确定丢失了哪些代码位……不,还没有。我将详细了解如何在netbeansEDIT中使用调试器:有人能告诉我一个好的调试器教程吗?据我所知,netbeans中的调试器只阻止了程序崩溃,但它没有崩溃,只是没有绘制。Junit也很没用,因为它会引发空指针异常,但在运行整个程序时不会抛出这些。修复了,我在paintComponent的末尾错误地添加了一个“s”。我的java书告诉我使用JPanel,我的朋友的示例使用JPanel,它可以工作。但是感谢您的输入,如果我根本无法解决这个问题,那么我将使用JComponent我尝试过扩展JComponent,但仍然没有骰子,除非这不是您的意思?只需删除行
public void paintComponents(Graphics g)
中的第一个
s
,我的java书籍告诉我使用JPanel,我的朋友们的例子使用了JPanel,它很有效。但是,感谢您的输入,如果我根本无法解决问题,那么我将使用JComponent我尝试过使用JComponent,但仍然没有骰子,除非这不是您的意思?只需删除行
public void paintComponents(Graphics g)