小编典典
我在您的代码中看到了一些问题:
您正在扩展JFrame,您不应该这样做,因为可以将其读DrawShapesGUI 为a JFrame,JFrame是一个刚性容器,而是基于JPanels创建您的GUI 。有关更多信息,请参见使用Exting vs在类内部调用Java Swing。
您有一个称为的成员,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仅使用其中的一种方法和条件,就可以以更好的方式改进s。
考虑到以上几点,我制作了一个新程序,该程序产生以下输出:
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);
}
}
2020-11-01