我已经创建了这个代码,当我在JForm上选择一个单选按钮时应该绘制某些东西,我已经使用NetBeans来创建GUI。当我选择单选按钮时没有任何反应。我一直试图弄清楚什么是错的,但我仍然无法找到解决方案,这就是我来到这里的原因。如果有人能发现错误,我会感激不尽。
public class DrawShapesGUI extends javax.swing.JFrame {
private int figureID;
public DrawShapesGUI() {
initComponents();
repaint();
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code"></editor-fold>
private void lineButtonActionPerformed(java.awt.event.ActionEvent evt) {
int figureID = 1;
repaint();
}
private void rectButtonActionPerformed(java.awt.event.ActionEvent evt) {
int figureID = 2;
repaint();
}
private void ovalButtonActionPerformed(java.awt.event.ActionEvent evt) {
int figureID = 3;
repaint();
}
private void arcButtonActionPerformed(java.awt.event.ActionEvent evt) {
int figureID = 4;
repaint();
}
private void polygonButtonActionPerformed(java.awt.event.ActionEvent evt) {
int figureID = 5;
repaint();
}
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(DrawShapesGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(DrawShapesGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(DrawShapesGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(DrawShapesGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new DrawShapesGUI().setVisible(true);
}
});
}
@Override
public void paint(Graphics g) {
super.paint(g);
g.setColor(Color.red);
if (figureID == 1) {
g.drawLine(50, 50, 100, 100);
} else if (figureID == 2) {
g.fillRect(50, 50, 100, 100);
} else if (figureID == 3) {
g.fillOval(100, 100, 100, 60);
} else if (figureID == 4) {
g.drawArc(50, 50, 200, 200, 90, 30);
} else if (figureID == 5) {
Polygon poly = new Polygon();
poly.addPoint(100, 50);
poly.addPoint(150, 50);
poly.addPoint(200, 100);
poly.addPoint(150, 150);
poly.addPoint(100, 150);
poly.addPoint(50, 100);
g.fillPolygon(poly);
}
}
答案 0 :(得分:3)
我在你的代码中看到了一些问题:
您正在延长JFrame
,您不应该这样做,因为这可以像DrawShapesGUI
是 JFrame
一样阅读, JFrame
是一个严格的容器,而是基于JPanel
创建GUI。有关详细信息,请参阅Java Swing using extends vs calling it inside of class。
您有一个名为figureID
的成员,但您永远不会使用它,因为每次在每个“figureID
”方法中创建一个新的局部变量ActionPerformed
时:
int figureID = 5;
从这些句子中移除int
,这可能就是为什么没有发生任何事情的问题。
您正在覆盖paint()
方法,而您应该覆盖paintComponent()
。但是,我必须祝贺你至少打电话给super.paint(g)
。
根本不是问题,但改进之处在于使用Shapes API绘制形状而不是调用g.drawLine()
以及所有这些调用。
您正在使用java.awt.EventQueue.invokeLater()
,因为Java版本1.3应更改为SwingUtilities.invokeLater()
(再次只是改进)
只需一种方法和条件,您就可以更好地改进ActionListener
。
考虑到以上几点,我制作了这个产生这个输出的新程序:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Polygon;
import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Arc2D;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import java.awt.geom.Rectangle2D;
import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.SwingUtilities;
@SuppressWarnings("serial")
public class DrawShapesGUI {
private JFrame frame;
private JRadioButton lineButton;
private JRadioButton rectButton;
private JRadioButton ovalButton;
private JRadioButton arcButton;
private JRadioButton polygonButton;
private ButtonGroup group;
private JPanel pane;
private CustomShape renderShape;
private Shape shape;
private ActionListener listener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource().equals(lineButton)) {
shape = new Line2D.Double(50, 50, 100, 100);
renderShape.setShape(shape);
} else if (e.getSource().equals(rectButton)) {
shape = new Rectangle2D.Double(50, 50, 100, 100);
renderShape.setShape(shape);
} else if (e.getSource().equals(ovalButton)) {
shape = new Ellipse2D.Double(100, 100, 100, 60);
renderShape.setShape(shape);
} else if (e.getSource().equals(arcButton)) {
shape = new Arc2D.Double(50, 50, 200, 200, 90, 30, Arc2D.OPEN);
renderShape.setShape(shape);
} else if (e.getSource().equals(polygonButton)) {
Polygon poly = new Polygon();
poly.addPoint(100, 50);
poly.addPoint(150, 50);
poly.addPoint(200, 100);
poly.addPoint(150, 150);
poly.addPoint(100, 150);
poly.addPoint(50, 100);
shape = poly;
renderShape.setShape(shape);
}
}
};
public static void main(String args[]) {
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(DrawShapesGUI.class.getName()).log(java.util.logging.Level.SEVERE, null,
ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(DrawShapesGUI.class.getName()).log(java.util.logging.Level.SEVERE, null,
ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(DrawShapesGUI.class.getName()).log(java.util.logging.Level.SEVERE, null,
ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(DrawShapesGUI.class.getName()).log(java.util.logging.Level.SEVERE, null,
ex);
}
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new DrawShapesGUI().createAndShowGUI();
}
});
}
class CustomShape extends JPanel {
private Shape shape;
public Shape getShape() {
return shape;
}
public void setShape(Shape shape) {
this.shape = shape;
revalidate();
repaint();
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
if (shape != null) {
g2d.setColor(Color.RED);
if (shape instanceof Line2D || shape instanceof Arc2D) {
g2d.draw(shape);
} else {
g2d.fill(shape);
}
}
}
@Override
public Dimension getPreferredSize() {
return new Dimension(150, 200);
}
}
public void createAndShowGUI() {
frame = new JFrame(getClass().getSimpleName());
lineButton = new JRadioButton("Line");
rectButton = new JRadioButton("Rectangle");
ovalButton = new JRadioButton("Oval");
arcButton = new JRadioButton("Arc");
polygonButton = new JRadioButton("Polygon");
lineButton.addActionListener(listener);
rectButton.addActionListener(listener);
ovalButton.addActionListener(listener);
arcButton.addActionListener(listener);
polygonButton.addActionListener(listener);
group = new ButtonGroup();
group.add(lineButton);
group.add(rectButton);
group.add(ovalButton);
group.add(arcButton);
group.add(polygonButton);
pane = new JPanel();
pane.add(lineButton);
pane.add(rectButton);
pane.add(ovalButton);
pane.add(arcButton);
pane.add(polygonButton);
renderShape = new CustomShape();
frame.add(pane, BorderLayout.PAGE_START);
frame.add(renderShape, BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}