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