簡単な宿題をしようとしています。ここでは、ドアオブジェクトが開いているかどうかを示すテキスト行を表示します。その下で、(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()を介して描画される長方形のサイズをどのように調整しますか?