[英]Java - Car Park system with GUI
我在这里寻求帮助。
我的任务是创建一个带有GUI界面而不是控制台界面的停车场管理系统。 该系统有15个车位-其中5个车位只能容纳“大型”车辆-其他10个车位是常规尺寸的车位。 它们是否很大取决于停车场的停车服务员。
进入停车场后,服务员需要填写有关汽车的信息(车辆编号),并单击“是”或“否”单选按钮,以了解汽车是否具有“高价值”,或者如果汽车是“大型车辆”)
我目前正在尝试构建一个界面,该界面在程序首次运行时显示停车场(当有可用空间时,空间将从红色变为绿色,反之亦然),这是我使用Graphics2D绘制的。 (这时我不确定如何使它出现在JFrame或我需要使用的任何东西中)在颜色不断变化的绘制停车场下,我将包括3个JButton-一个用于“添加汽车”,“删除汽车” ”和“搜索汽车”。 我不确定如何将'carPark'组件和前面提到的JButtons设置为运行时将出现的窗口。
因此,当我单击这些按钮时,将出现一个新窗口,显示与每个按钮相关的表单(添加,删除和搜索)
我必须怎么做才能使停车场和按钮出现在同一窗口中。
这是我到目前为止创建的代码-尽管它很不整洁,并且在几乎一堂课中我都知道发生了什么,并计划在我一切正常后将其拆分。 (我知道这对于编写代码不是很有效):
package carparksystem;
import javax.swing.*;
import javax.swing.JTabbedPane;
import javax.swing.JPanel;
import java.awt.Color;
public class DrawCarPark extends javax.swing.JFrame
{
public DrawCarPark()
{
JButton addACar = new JButton("Add Car");
JButton removeACar = new JButton("Remove Car");
JButton searchCars = new JButton("Search Cars");
JFrame frame = new JFrame();
frame.add(new CarPark());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setTitle("Car Park System");
frame.setSize(435, 600);
frame.setVisible(true);
frame.setResizable(false);
//frame.add(addACar);
//frame.add(removeACar);
//frame.add(searchCars);
GroupLayout mainLayout = new GroupLayout(getContentPane()); //chosen to display components in group layout
getContentPane().setLayout(mainLayout);
mainLayout.setAutoCreateGaps(true);
mainLayout.setAutoCreateContainerGaps(true);
mainLayout.setHorizontalGroup(mainLayout.createSequentialGroup()
.addGroup(mainLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(frame)
.addGroup(mainLayout.createSequentialGroup()
.addGroup(mainLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(addACar))
.addGroup(mainLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(removeACar))
.addGroup(mainLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(searchCars))))
);
mainLayout.setVerticalGroup(mainLayout.createSequentialGroup()
.addGroup(mainLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(frame)
.addGroup(mainLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(addACar)
.addComponent(removeACar)
.addComponent(searchCars)))
);
//addCarForm();
//removeCarForm();
//searchCarForm();
}
private void addCarForm()
{
/*JPanel panel = new JPanel();
//frame.add(panel);
panel.setSize(450, 650);
panel.setVisible(true);
panel.getSize();*/
JLabel regNumLabel = new JLabel("Registration Number:");
JLabel highValLabel = new JLabel("High Value?");
JLabel largeLabel = new JLabel("Large Vehicle?");
JRadioButton btnYesHighVal = new JRadioButton("Yes", false);
JRadioButton btnNoHighVal = new JRadioButton("No", true);
JRadioButton btnYesLarge = new JRadioButton("Yes", false);
JRadioButton btnNoLarge = new JRadioButton("No", true);
ButtonGroup highVal = new ButtonGroup(); //allows just one radio button from the group to be selected
highVal.add(btnYesHighVal);
highVal.add(btnNoHighVal);
ButtonGroup largeCar = new ButtonGroup(); //allows just one radio button from the group to be selected
largeCar.add(btnYesLarge);
largeCar.add(btnNoLarge);
JTextField regNumField = new JTextField();
JButton addCar = new JButton(" Add ");
JButton addCancel = new JButton("Cancel");
GroupLayout addLayout = new GroupLayout(getContentPane()); //chosen to display components in group layout
getContentPane().setLayout(addLayout);
addLayout.setAutoCreateGaps(true);
addLayout.setAutoCreateContainerGaps(true);
addLayout.setHorizontalGroup(addLayout.createSequentialGroup()
.addGroup(addLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(regNumLabel)
.addComponent(highValLabel)
.addComponent(largeLabel))
.addGroup(addLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(regNumField)
.addGroup(addLayout.createSequentialGroup()
.addGroup(addLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(btnYesHighVal)
.addComponent(btnYesLarge))
.addGroup(addLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(btnNoHighVal)
.addComponent(btnNoLarge))))
.addGroup(addLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(addCar)
.addComponent(addCancel))
);
addLayout.setVerticalGroup(addLayout.createSequentialGroup()
.addGroup(addLayout.createParallelGroup(GroupLayout.Alignment.BASELINE)
.addComponent(regNumLabel)
.addComponent(regNumField)
.addComponent(addCar))
.addGroup(addLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addGroup(addLayout.createSequentialGroup()
.addGroup(addLayout.createParallelGroup(GroupLayout.Alignment.BASELINE)
.addComponent(highValLabel)
.addComponent(btnYesHighVal)
.addComponent(btnNoHighVal))
.addGroup(addLayout.createParallelGroup(GroupLayout.Alignment.BASELINE)
.addComponent(largeLabel)
.addComponent(btnYesLarge)
.addComponent(btnNoLarge)))
.addComponent(addCancel))
);
setSize(375, 150);
setTitle("Add Car");
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}
private void removeCarForm()
{
JLabel regNumLabel = new JLabel("Registration Number:");
JTextField regNumField = new JTextField();
JButton removeCar = new JButton("Remove");
JButton removeCancel = new JButton("Cancel");
GroupLayout removeLayout = new GroupLayout(getContentPane());
getContentPane().setLayout(removeLayout);
removeLayout.setAutoCreateGaps(true);
removeLayout.setAutoCreateContainerGaps(true);
removeLayout.setHorizontalGroup(removeLayout.createSequentialGroup()
.addGroup(removeLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(regNumLabel))
.addGroup(removeLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(regNumField))
.addGroup(removeLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(removeCar)
.addComponent(removeCancel))
);
removeLayout.setVerticalGroup(removeLayout.createSequentialGroup()
.addGroup(removeLayout.createParallelGroup(GroupLayout.Alignment.BASELINE)
.addComponent(regNumLabel)
.addComponent(regNumField)
.addComponent(removeCar))
.addGroup(removeLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(removeCancel))
);
setSize(375, 150);
setTitle("Search Car");
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}
private void searchCarForm()
{
JLabel regNumLabel = new JLabel("Registration Number:");
JTextField regNumField = new JTextField();
JButton searchCar = new JButton("Search");
JButton searchCancel = new JButton("Cancel");
GroupLayout searchLayout = new GroupLayout(getContentPane());
getContentPane().setLayout(searchLayout);
searchLayout.setAutoCreateGaps(true);
searchLayout.setAutoCreateContainerGaps(true);
searchLayout.setHorizontalGroup(searchLayout.createSequentialGroup()
.addGroup(searchLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(regNumLabel))
.addGroup(searchLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(regNumField))
.addGroup(searchLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(searchCar)
.addComponent(searchCancel))
);
searchLayout.setVerticalGroup(searchLayout.createSequentialGroup()
.addGroup(searchLayout.createParallelGroup(GroupLayout.Alignment.BASELINE)
.addComponent(regNumLabel)
.addComponent(regNumField)
.addComponent(searchCar))
.addGroup(searchLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(searchCancel))
);
setSize(375, 150);
setTitle("Remove Car");
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}
public static void main(String[]args)
{
DrawCarPark carPark = new DrawCarPark();
carPark.setVisible(true);
}
}
这也是我绘制的停车场的主菜单类:
package carparksystem;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JButton;
public class CarPark extends javax.swing.JPanel
{
private void draw(Graphics g)
{
Graphics2D g2 = (Graphics2D) g;
//Draw carpark boundary
g2.drawLine(20, 20, 400, 20);
g2.drawLine(20, 450, 20, 20);
g2.drawLine(20, 450, 400, 450);
g2.drawLine(400, 20, 400, 140);
g2.drawLine(400, 330, 400, 450);
g2.drawString("ENTER", 370, 180); //labels
g2.drawString("EXIT", 375, 300);
g2.setColor(Color.WHITE); //attendants box
g2.fill3DRect(330, 200, 70, 70, true);
g2.setColor(Color.BLACK);
g2.drawString("Attendant", 338, 230);
g2.drawString("Station", 345, 245);
g2.drawRect(330, 200, 70, 70);
g2.setColor(Color.GREEN);
g2.fillRect(40, 40, 50, 100); //8 first row spaces
g2.fillRect(110, 40, 50, 100); //7
g2.fillRect(180, 40, 50, 100); //6
g2.fillRect(250, 60, 40, 80); //2
g2.fillRect(310, 60, 40, 80); //1
g2.setColor(Color.BLACK); //drawRect palces a black border around shape
g2.drawRect(40, 40, 50, 100);
g2.drawRect(110, 40, 50, 100);
g2.drawRect(180, 40, 50, 100);
g2.drawRect(250, 60, 40, 80);
g2.drawRect(310, 60, 40, 80);
g2.setColor(Color.GREEN); //second row spaces
g2.fillRect(90, 195, 40, 80); //13
g2.fillRect(150, 195, 40, 80); //12
g2.fillRect(210, 195, 40, 80); //11
g2.fillRect(270, 195, 40, 80); //3
g2.setColor(Color.BLACK);
g2.drawRect(90, 195, 40, 80);
g2.drawRect(150, 195, 40, 80);
g2.drawRect(210, 195, 40, 80);
g2.drawRect(270, 195, 40, 80);
g2.setColor(Color.GREEN); //3rd row spaces
g2.fillRect(30, 330, 40, 80); //15
g2.fillRect(90, 330, 40, 80); //14
g2.fillRect(150, 330, 50, 100); //10
g2.fillRect(220, 330, 50, 100); //9
g2.fillRect(290, 330, 40, 80); //5
g2.fillRect(350, 330, 40, 80); //4
g2.setColor(Color.BLACK);
g2.drawRect(30, 330, 40, 80);
g2.drawRect(90, 330, 40, 80);
g2.drawRect(150, 330, 50, 100);
g2.drawRect(220, 330, 50, 100);
g2.drawRect(290, 330, 40, 80);
g2.drawRect(350, 330, 40, 80);
g2.drawString("1", 328, 105); //place labels on each shape
g2.drawString("2", 268, 105);
g2.drawString("3", 288, 240);
g2.drawString("4", 368, 375);
g2.drawString("5", 308, 375);
g2.drawString("6", 203, 95);
g2.drawString("7", 133, 95);
g2.drawString("8", 63, 95);
g2.drawString("9", 242, 385);
g2.drawString("10", 168, 385);
g2.drawString("11", 225, 240);
g2.drawString("12", 165, 240);
g2.drawString("13", 105, 240);
g2.drawString("14", 103, 375);
g2.drawString("15", 43, 375);
}
@Override
public void paintComponent(Graphics g)
{
draw(g);
}
}
预先感谢任何人愿意提供帮助。
您所提出的实际问题的答案是“在JFrame和/或JPanel中使用布局管理器来定位组件,但是您应该已经知道这一点。您已经在两个JFrame之一中使用了GroupLayout管理器。
我认为您的问题可能是您有两个。 您在DrawCarPark中声明一个JFrame变量,该类也扩展了JFrame。 您可能不需要或不希望两者兼而有之,这可能使您感到困惑-如果您希望事情在声明的JFrame中显示,则由于DrawCarPark扩展了JFrame,因此调用时不引用该实例的JFrame方法将通过编译器。他们不会做你想要的。 如果要在其中包含所有GUI元素的一个窗口,请除去变量或JFrame的扩展。
我可能会建议对其余的JFrame使用其他布局管理器-默认值为BorderLayout,在我看来,这对您想要的可能更好。 将您的按钮放入JPanel(使用所需的任何其他布局管理器,GroupLayout或其他工具),然后将该面板放入BorderLayout的NORTH部分。 然后将您的CarPark面板放入该BorderLayout的CENTER中,然后得到的JFrame将同时具有两者。
祝你好运。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.