繁体   English   中英

Java-带GUI的停车场系统

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM