0

図形を描画するプログラム(ユーザーがラジオボタンで選択)と、図形が塗りつぶされているかどうか(ユーザーがチェックボックスで選択)を作成する必要があります。これは私がこれまでに持っているコードです:

 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);
        }
    }
}
}

私が得ているエラーは、式と識別子の不正な開始が予想されます。別の方法でアプローチする必要がある場合は、教えてください。

4

2 に答える 2

4

基本に戻る必要があると思います...

これは機能しません...

fp.setBackground("white");

Component#setBackgroundStringパラメータとしてを取りません、それは取ります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は「インラインメソッド」(またはそれらを呼び出したいもの)をサポートしていません。いいえ、それらをメソッドにすることも、あなたがやろうとしていることを達成しません...

実際、あなたが非常にうまくやったことの1つは、オーバーライドpaintComponentして呼び出すことでしたsuper.paintComponent...よくできました:D!

更新しました

読んでいただくことをお勧めします...

可能な実行例で更新

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());
        }

    }

}
于 2013-02-21T03:12:30.967 に答える
1

さて、以下は間違いなく有効なJavaコードではありません。

    dLine() {
        g.drawLine(10,10,160,10);
    }

以下のdRectなども同様です。

そのコードで何を達成しようとしているのか正確にはわかりません。dLineというメソッドを定義する場合は、代わりに次のようにします。

public void dLine(Graphics g) {
    g.drawLine(10, 10, 160, 10);
}

また、現在問題を引き起こしていない次のコードにも気づきましたが、次のようになります。

public void ItemStateChanged(itemEvent e) {

これは適切に大文字化されていないため、コンパイルされず、イベントをリッスンしていないため、呼び出されることはありません。

コードには他にもさまざまなエラーがありますが、これで開始できます。

于 2013-02-21T03:12:10.610 に答える