Я пытаюсь выполнить простую домашнюю работу, где я показываю строку текста, показывающую, открыт ли дверной объект или нет. Под этим я визуально представляю его (используя метод drawRect). И внизу у меня есть две кнопки, которые могут открывать или закрывать дверь, тем самым меняя текст и прямоугольник.Добавление графики в JFrame с использованием BorderLayout
Edit: Список кода, который может быть составлен с учетом ныне:
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(), в таком макете?
Пожалуйста произвести [SSCCE] (http://sscce.org), который требует одну копию и вставьте Теперь мы должны пойти и создать новый проект, новый класс и новый главный т.д., я хочу, чтобы просто создать класс с тем же именем, что и ваш, и скопируйте и вставьте код. Но эй, это я ленив: P тоже не должен содержать ошибок, т. Е. 'Door.isOpen()' дает ошибку, потому что вы не включили метод –
Теперь работаем над этим, спасибо за подсказку –
Проблема, с которой вы не видите прямоугольник - это его покрытие JTextField, потому что ваши координаты пытаются: 'page.drawRect (100, 100, 10, 10);' –