我需要创建一个程序来绘制形状(用户使用单选按钮选择),以及是否填充形状(用户使用复选框选择)。这是我到目前为止的代码:
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
不采用 String
作为参数,它采用 Color
您的所有 addItemListener
调用都无法正常工作,因为您尚未实现 ItemListener
我不确定您希望通过这样做实现什么......
@Override
fp.dRect();
但这行不通。 @Override 用于指示某个方法被祖先覆盖,您只需调用 FigurePanel
Java 与 C 和 C++ 一样区分大小写;
没有这样的类itemEvent
...它是ItemEvent
public void ItemStateChanged(itemEvent e) {
没有这样的类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!
已更新
我鼓励您仔细阅读...
- The Java Trails ,尤其是那些涵盖基础知识的内容,尤其是那些涵盖继承的内容
- Custom Painting
- 2D Graphics
更新了可能的运行示例
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());
}
}
}
关于java - 绘制用户选择的形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14993827/