3

簡単な宿題をしようとしています。ここでは、ドアオブジェクトが開いているかどうかを示すテキスト行を表示します。その下で、(drawRectを使用して)視覚的に表現します。下部には2つのボタンがあり、ドアを開閉してテキストと長方形を変更できます。

編集:今与えられたコンパイル可能なコードのリスト:

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;

    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextField;

    public class Test {

    public static void main(String[] args) {

        // Creates new JFrame called frame, with title "Door" 
        // (displayed at top of screen).
        JFrame frame = new JFrame ("Door");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        TempDoorPanel panel = new TempDoorPanel();
        frame.add(panel);
        frame.pack();
        frame.setVisible(true);

        }
    }

    class Door {

    private String state;
    private String message;

    Door (String state) {
        this.state = state;
        message = "The door is currently closed.";
    }

    public boolean isOpen() {
        return state.equals ("open");
    }

    public boolean isClosed() {
        return state.equals ("closed");
    }

    public void setState(String state) {
        this.state = state;
    }

    public String getMessage() {
        return message; 
    }

    public void open() {
        if (state.equals("open")) {
            message = "The door is already open.";
        }
        else {
            state = "open";
            message = "The door has been opened.";
        }
    }

    public void drawOpenDoor (Graphics page) {
        page.drawRect(100, 100, 100, 100);
    }
    }

    class TempDoorPanel extends JPanel {

    private Door door;
    private JTextField currentStateOfDoor;
    private JButton openDoor;

    public TempDoorPanel() {
        super.setLayout(new BorderLayout());
        door = new Door("closed");
        super.setBackground(Color.blue);
        super.setPreferredSize(new Dimension (360, 400));

        currentStateOfDoor = new JTextField(14);
        currentStateOfDoor.setText(door.getMessage());
        super.add(currentStateOfDoor, BorderLayout.NORTH);

        openDoor = new JButton("Open Door");

        class openDoorListener implements ActionListener {
            public void actionPerformed (ActionEvent event) {
                door.open();
                repaintText();
            }
        }

        openDoorListener openlistener = new openDoorListener();
        openDoor.addActionListener(openlistener);

        JPanel holder = new JPanel();
        holder.add(openDoor);
        super.add(holder, BorderLayout.SOUTH);
    }

    private void repaintText() {
        currentStateOfDoor.setText(door.getMessage());
        // These methods are from Door class.
    }

    public void paintComponent (Graphics page) {
        super.paintComponent(page);
        if (door.isOpen())
            door.drawOpenDoor(page);
        // isOpen is a boolean method from Door class.
    }
}

何が機能するか:

  • ボタンは、画面の適切な場所、BorderLayout.SOUTHに次々に表示されます。
  • JTextFieldは、BorderLayout.NORTHの適切な場所に表示されます
  • 最後に、青い領域が画面中央の適切な場所に表示されます。

私が修正しようとしていること:

  • その青い領域の真ん中に長方形を正しく表示する方法がわかりません。長方形の座標とサイズを変更してみましたが、サイズはまったく変更されていません。drawRect(100、100、100、100)にすることができ、何も変更されません。
  • また、長方形が現在JTextFieldの左上隅の後ろに隠れていることも知っていますが、それをBorderLayoutに移動する方法がわかりません。

質問:

  • BorderLayoutに長方形をどのように配置しますか?
  • このようなレイアウトで、drawrect()を介して描画される長方形のサイズをどのように調整しますか?
4

2 に答える 2

4

JPanelにコンポーネントを追加するので、上にJTextField描画すると、描画がカバーされます。

解決:

1)メソッドでJTextField高さをチェックしてこれを補正しますdrawRect(..)

以上

JPanel2)助けられない場合を除いて、描画しているものにコンポーネントを追加しないでください。

だから基本的に私はあなたに新しいものをTempDoorPanel追加しました。これは私たちが今使用できる描画パネルであり、それはの左上隅に表示されます。JPanelBorderLayout.CENTERdrawRect(0,0,10,10)JPanel drawingPanel

  • また、図面に合ったをオーバーライドsetPreferredSizeして返すことは避けてください。JPanelgetPreferredSize()Dimension

  • paintComponentクラスの外部で呼び出すには、単にrepaint()そのインスタンスを呼び出します

ポイント2を使用するこの例を参照してください。

ここに画像の説明を入力してください

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class Test {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame("Door");
                frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

                TempDoorPanel panel = new TempDoorPanel();
                frame.add(panel);
                frame.pack();
                frame.setVisible(true);
            }
        });
    }
}
class Door {

    private String state;
    private String message;

    public Door(String state) {
        this.state = state;
        message = "The door is currently closed.";
    }

    public void drawOpenDoor(Graphics page) {
        page.setColor(Color.GREEN);
        page.drawRect(0, 0, 10, 10);
    }
}

class TempDoorPanel extends JPanel {

    private Door door;
    private JTextField currentStateOfDoor;
    private JButton openDoor;

    public TempDoorPanel() {
        super.setLayout(new BorderLayout());
        door = new Door("closed");

        currentStateOfDoor = new JTextField(14);
        //AcurrentStateOfDoor.setText(door.getMessage());
        super.add(currentStateOfDoor, BorderLayout.NORTH);

        openDoor = new JButton("Open Door");

        final JPanel drawingPanel = new JPanel() {
            @Override
            protected void paintComponent(Graphics grphcs) {
                super.paintComponent(grphcs);
                // if (door.isOpen()) {
                door.drawOpenDoor(grphcs);
                // }
                // isOpen is a boolean method from Door class.

            }
        };
        drawingPanel.setBackground(Color.blue);
        add(drawingPanel);

        class openDoorListener implements ActionListener {

            public void actionPerformed(ActionEvent event) {
                //door.open();
                repaintText();
                drawingPanel.repaint();//so paint component of drawing panel is called
            }
        }

        openDoorListener openlistener = new openDoorListener();
        openDoor.addActionListener(openlistener);

        JPanel holder = new JPanel();
        holder.add(openDoor);
        super.add(holder, BorderLayout.SOUTH);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(300, 300);
    }

    private void repaintText() {
        // currentStateOfDoor.setText(door.getMessage());
        // These methods are from Door class.
    }
}
于 2013-02-14T14:57:43.703 に答える
3

リスナーと一緒にドアを開けるイベントを処理するとき。

class openDoorListener implements ActionListener {
  public void actionPerformed(ActionEvent event) {
    door.open();
    repaintText();
  }
}

パネルを再描画するための呼び出しは実際には含まれていません。したがって、パネルのpaintComponent()メソッドは呼び出されdoor.drawOpenDoor()ず、呼び出されません。ボタンをクリックしてからフレームのサイズを変更することで、これをテストできます。サイズを変更すると、パネルが自動的に塗り直されてビンゴになり、ドアが表示されます。

repaint()ActionListenerにへの呼び出しを追加することで、これを修正できます。

class openDoorListener implements ActionListener {
  public void actionPerformed(ActionEvent event) {
    door.open();
    repaintText();
    repaint();   // requests that the panel be repainted
  }
}
于 2013-02-14T15:12:03.330 に答える