1

私は現在、初心者向けのCS106AスタンフォードJavaコースを行っています。私は配布番号7で立ち往生しており、キャンバス上にGLabelが付いたGRectを描画し、ドラッグしたり、再度削除したり、キャンバス全体をクリアしたりできる簡単なプログラムを作成する必要があります。このようなボックスを追加するために、SOUTHにJTextFieldを追加してボックスの名前を入力し、[追加]、[削除]、[クリア]ボタンを追加しました。

ボックスを追加するためにテキストフィールドに名前を入力すると機能します。私の問題は、JTextFieldに入力したテキストが(新しいボックスに表示されるため)記録されていても、JTextField自体に表示されないため、[追加]をクリックして読むまで入力内容が表示されないことです。ボックス自体に。

これが私のコードです:

    package handout07Interactors;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.util.HashMap;

import javax.swing.*;

import acm.graphics.*;
import acm.program.*;

@SuppressWarnings("serial")
public class Box_Diagram extends GraphicsProgram{

    public void init() {
        displayButtons();
        addActionListeners();

        //TODO make draggable

    }

    public void actionPerformed(ActionEvent e) {

        if (e.getActionCommand().equals("ADD")) {

            //create box
            GCompound canvasBox = createBox(tf.getText());

            //add box to HashMap
            map.put(tf.getText(), canvasBox);

            //add box to canvas
            int x = (int) (getWidth() - canvasBox.getWidth()) / 2;
            int y = (int) (getHeight() - canvasBox.getHeight()) / 2;
            add(canvasBox, x, y);

        } else if (e.getActionCommand().equals("REMOVE")) {

            //remove box with name
            if (map.get(tf.getText()) != null) {remove(map.get(tf.getText()));}; //if box exists, remove it 

        } else {

            for( String name: map.keySet() )
            {
                remove(map.get(name));
            }



        }

    }

    private GCompound createBox(String text) {

        // GCompound
        GCompound box = new GCompound();

        // create GRect
        GRect rect = new GRect(BOX_WIDTH, BOX_HEIGHT);
        box.add(rect);

        // add GLabel
        GLabel label = new GLabel(text);
        int x = (int) (rect.getWidth() - label.getWidth()) / 2;
        int y = 30; //manual entry, somehow calculation didn't work as it does for width
        box.add(label, x, y);

        map.put(text, box);

        return box;

    }

    private void displayButtons() {

        //label
        add(new JLabel("Name:"), SOUTH);

        //textfield
        tf = new JTextField(30);
        tf.addActionListener(this);
        add(tf, SOUTH);

        //ADD REMOVE CLEAR
        add(new JButton("ADD"), SOUTH);
        add(new JButton("REMOVE"), SOUTH);
        add(new JButton("CLEAR"), SOUTH);

    }

    //IVARS
    private JTextField tf;
    public static final int BOX_WIDTH = 100;
    public static final int BOX_HEIGHT = 50;
    public HashMap<String, GCompound> map = new HashMap<String, GCompound>();



}
4

2 に答える 2

3

5 つの異なるコンポーネント (ラベル、テキスト フィールド、および 3 つのボタン) をレイアウトの同じ場所 (ボーダー レイアウトの SOUTH セクション) に追加します。

たとえば FlowLayout を使用して、これら 5 つのコンポーネントを別の JPanel に追加してから、このパネルをメイン パネルの SOUTH に追加する必要があります。

于 2012-11-17T17:06:35.160 に答える