2

私は基本的にswingを使用する初心者です。だからここで我慢してください。私は、swing ライブラリーの既製のコンポーネントを使用して、単純な GUI を行うことができます。しかし、JPanel に基本的な形状を描画する方法を理解しようとしている時が来ました。この場合、再帰的に収集した Square オブジェクトのコレクションであり、互いに同心円状に表示されるはずです。

数週間前、図形の描画を含む小さなプロジェクトを行いましたが、これらの図形は JFrame に直接描画されました。JPanel または JComponent を拡張するクラスでこれを実行しようとしている今、あまりにも多くの障害に直面しています。この時点では、JPanel には何も表示されていません。

ここに私がこれまでに受けたクラスがあります。

スクエアクラス。これは単純な正方形を作成するだけです

public class Square
{
    private int x, y, width, height;
    private Color theColor;

    public Square(int xS, int yS, int widthS, int heightS, Color squareColor)
    {
        x = xS;
        y = yS;
        width = widthS;
        height = heightS;
        theColor = squareColor;
    }

    public void draw(Graphics2D g2)
    {
        g2.setColor(theColor);
        Rectangle rectDraw = new Rectangle(x,y,width,height);
        g2.draw(rectDraw);
    }
}

GUI クラス

public class SquareGUI extends JFrame
{
    private JComboBox colorChoices, shapeChoices;
    private JTextArea numberOfTimes;
    private SquarePanel thisPanel;

    public SquareGUI()
    {
        thisPanel = new SquarePanel();
        JPanel northPanel = new JPanel(new FlowLayout());
        setSize(640, 480);
        setLayout(new BorderLayout());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        ActionListener listener = new CommandListener();

        colorChoices = new JComboBox();
        shapeChoices = new JComboBox();
        numberOfTimes = new JTextArea(1,3);
        colorChoices.addItem("Black");
        colorChoices.addItem("Blue");
        colorChoices.addItem("Red");
        colorChoices.addItem("Green");
        shapeChoices.addItem("Square");
        shapeChoices.addItem("Circle");

        colorChoices.addActionListener(listener);
        shapeChoices.addActionListener(listener);



        northPanel.add(colorChoices);
        northPanel.add(shapeChoices);
        northPanel.add(new JLabel("Number of Shapes:"));
        northPanel.add(numberOfTimes);
        add(northPanel, BorderLayout.NORTH);

        add(thisPanel, BorderLayout.CENTER);

        setVisible(true);
    }

    public void addShapesRecursively(int x, int y, int width, int height, int times)
    {
        if (times == 0) { return; }
        Color colorChoice = null;
        switch (colorChoices.getSelectedIndex())
        {
            case 0: colorChoice = Color.BLACK; break;
            case 1: colorChoice = Color.BLUE; break;
            case 2: colorChoice = Color.RED; break;
            case 3: colorChoice = Color.GREEN; break;
        }
        if (shapeChoices.getSelectedIndex() == 0)
            thisPanel.add(new Square(x, y, width, height, colorChoice));
        else
            System.out.println("todo");

        addShapesRecursively(x-15, y-15, width + 15, height + 15, times - 1);
    }

    class CommandListener implements ActionListener
    {

        @Override
        public void actionPerformed(ActionEvent arg0) 
        {
            addShapesRecursively(getWidth()/2,getHeight()/2,20,20,Integer.parseInt(numberOfTimes.getText()));
        }

    }

    public static void main(String[]args)
    {
        new SquareGUI();
    }
}

そして、正方形を表示するはずのJPanelクラス。

public class SquarePanel extends JPanel
{

    private ArrayList<Square> squareList;
    public SquarePanel()
    {
        setBackground(Color.WHITE);
        squareList = new ArrayList<Square>();

    }

    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;

        for (int i = 0; i < squareList.size(); i++)
        {
            Square tempSquare = squareList.get(i);
            tempSquare.draw(g2);
        }
    }

    public void add(Square addSquare)
    {
        squareList.add(addSquare);
    }
}

申し訳ありませんが、これにはまだコメントなどがありません。これを機能させようとして、髪を引っ張っています。実行後にその ArrayList に x 量の Square オブジェクトがあるため、再帰ビットが機能することはわかっています。JPanelでこれらの四角形をペイントするだけの問題です。

JComponent を拡張した別のクラスでこれを最初に試しましたが、オーバーライドされた paintComponent をその中で起動させることはできませんでした。だから私は周りを見回して、JPanelでもpaintComponentをオーバーライドできることを発見しました。したがって、期待どおりに起動していますが、JPanel 自体には何も表示されません。

私の全体的な質問は、正方形を正しく表示するにはどうすればよいですか?

4

1 に答える 1

2

パネルが自己更新するように促す必要があります。

パネルrepaintのメソッドに呼び出しを追加します...add

public void add(Square addSquare) {
    squareList.add(addSquare);
    repaint();
}
于 2012-12-02T18:57:23.023 に答える