我需要创建一个程序来绘制形状(用户使用单选按钮选择),以及是否填充形状(用户使用复选框选择)。这是我到目前为止的代码:
import javax.swing.*; import java.awt.*; import java.awt.event.*; public class SelectShape extends JFrame implements ItemListener{ private JRadioButton line = new JRadioButton("Line"); private JRadioButton rect = new JRadioButton("Rectangle"); private JRadioButton oval = new JRadioButton("Oval"); private JCheckBox fill = new JCheckBox("Filled"); private FigurePanel fp; public static void main(String[] args) { SelectShape frame = new SelectShape(); frame.setTitle("Select Shape"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLocationRelativeTo(null); frame.setSize(400,400); frame.setVisible(true); } public SelectShape() { JPanel p1 = new JPanel(); p1.add(fp); fp.setBackground(Color.WHITE); p1.setSize(200,400); JPanel p2 = new JPanel(); p2.setLayout(new FlowLayout()); p2.add(line); p2.add(rect); p2.add(oval); p2.add(fill); add(p2, "South"); line.addItemListener(this); rect.addItemListener(this); oval.addItemListener(this); fill.addItemListener(this); } public void ItemStateChanged(ItemEvent e) { if(rect.isSelected()) { FigurePanel.dRect(); repaint(); } else if(oval.isSelected()) { FigurePanel.dOval(); repaint(); } else if(line.isSelected()) { FigurePanel.dLine(); repaint(); } if(fill.isSelected()) { FigurePanel.fill(); repaint(); } else { FigurePanel.erase(); repaint(); } } } class FigurePanel extends JPanel { public void paintComponent(Graphics g) { super.paintComponent(g); public void dLine(Graphics g) { g.drawLine(10,10,160,10); } public void dRect(Graphics g) { g.drawRect(10,10,150,50); } public void dOval(Graphics g) { g.drawOval(10,10,150,50); } public void fill(Graphics g) { g.setColor(Color.GREEN); if(rect.isSelected()) { g.fillRect(10,10,150,50); } else if(oval.isSelected()) { g.fillOval(10,10,150,50); } } public void erase(Graphics g) { g.setColor(Color.WHITE); if(rect.isSelected()) { g.fillRect(10,10,150,50); } else if(oval.isSelected()) { g.fillOval(10,10,150,50); } } } }
我遇到的错误是表达式和标识符的非法开头。如果我应该采用其他方式,请告诉。
我认为您需要回到基础…
这行不通…
fp.setBackground("white");
Component#setBackground不使用a String作为参数,而是使用Color
Component#setBackground
String
Color
您的所有addItemListener通话都无法正常进行,因为您尚未实现ItemListener
addItemListener
ItemListener
我不确定您希望通过此操作实现什么…
@Override fp.dRect();
但这是行不通的。@Override用于指示某个方法已被祖先覆盖,您只是在调用该方法FigurePanel
FigurePanel
Java和C和C ++一样,区分大小写。
没有这样的课程itemEvent…ItemEvent
itemEvent
ItemEvent
public void ItemStateChanged(itemEvent e) {
没有这样的课程graphics,Graphics
graphics
Graphics
public void paintComponent(graphics g) {
而且我什至不会尝试猜测您希望通过以下方式实现的目标…
public void paintComponent(graphics g) { super.paintComponent(g); dLine() { g.drawLine(10, 10, 160, 10); } dRect() { g.drawRect(10, 10, 150, 50); } dOval() { g.drawOval(10, 10, 150, 50); } fill() { g.setColor(Color.GREEN); if (rect.isSelected()) { g.fillRect(10, 10, 150, 50); } else if (oval.isSelected()) { g.fillOval(10, 10, 150, 50); } } erase() { g.setColor(Color.WHITE); if (rect.isSelected()) { g.fillRect(10, 10, 150, 50); } else if (oval.isSelected()) { g.fillOval(10, 10, 150, 50); } } }
Java不支持“内联方法”(或您想调用的任何方法),并且不支持,使它们成为方法也将无法实现您想要的工作…
实际上,您做得很好的一件事就是重写paintComponent并调用了super.paintComponent……做得好:D!
paintComponent
super.paintComponent
更新
我鼓励您通读…
更新了可能的运行示例
import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Shape; import java.awt.event.ActionEvent; import java.awt.geom.Ellipse2D; import java.awt.geom.Line2D; import java.awt.geom.Rectangle2D; import javax.swing.AbstractAction; import javax.swing.ButtonGroup; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class DrawShapes { public static void main(String[] args) { new DrawShapes(); } public DrawShapes() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { } JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(new DrawPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class DrawPane extends JPanel { public DrawPane() { setLayout(new BorderLayout()); RenderPane rp = new RenderPane(); add(new ControlsPane(rp), BorderLayout.NORTH); add(rp); } } public class ControlsPane extends JPanel { public ControlsPane(RenderPane rp) { JRadioButton[] btns = new JRadioButton[4]; btns[0] = new JRadioButton(new LineAction(rp)); btns[1] = new JRadioButton(new RectangleAction(rp)); btns[2] = new JRadioButton(new OvalAction(rp)); btns[3] = new JRadioButton(new ClearAction(rp)); ButtonGroup bg = new ButtonGroup(); for (JRadioButton btn : btns) { bg.add(btn); add(btn); } } } public class RenderPane extends JPanel { private Shape shape; @Override public Dimension getPreferredSize() { return new Dimension(400, 400); } public void setShape(Shape shape) { this.shape = shape; repaint(); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g.create(); if (shape != null) { g2d.setColor(Color.RED); g2d.draw(shape); } g2d.dispose(); } } public class LineAction extends AbstractRenderAction { public LineAction(RenderPane renderPane) { super(renderPane); putValue(NAME, "Line"); } @Override public Shape getShape() { return new Line2D.Float(0f, 0f, getRenderPane().getWidth(), getRenderPane().getHeight()); } } public class RectangleAction extends AbstractRenderAction { public RectangleAction(RenderPane renderPane) { super(renderPane); putValue(NAME, "Rectangle"); } @Override public Shape getShape() { return new Rectangle2D.Float(10, 10, getRenderPane().getWidth() - 20, getRenderPane().getHeight() - 20); } } public class OvalAction extends AbstractRenderAction { public OvalAction(RenderPane renderPane) { super(renderPane); putValue(NAME, "Oval"); } @Override public Shape getShape() { float radius = Math.min(getRenderPane().getWidth() - 20, getRenderPane().getHeight() - 20); return new Ellipse2D.Float(10, 10, radius, radius); } } public class ClearAction extends AbstractRenderAction { public ClearAction(RenderPane renderPane) { super(renderPane); putValue(NAME, "Clear"); } @Override public Shape getShape() { return null; } } public abstract class AbstractRenderAction extends AbstractAction { private RenderPane renderPane; public AbstractRenderAction(RenderPane renderPane) { this.renderPane = renderPane; } public RenderPane getRenderPane() { return renderPane; } public abstract Shape getShape(); @Override public void actionPerformed(ActionEvent e) { getRenderPane().setShape(getShape()); } } }