如何暂停 main()

2024-04-13

我正在尝试编写我的程序,以便当用户单击“Drive To...”JButton(在我的主类 Dispatch 中)时,它会从另一个类(Cab)打开一个 JFrame(GoToDistination),用户可以在其中输入所需的内容信息,单击“继续”后,它会立即更新 Dispatch JFrame 中的 mainTextArea。

我的问题是,当程序通过主 JFrame(Dispatch)时,它只是打开新的 JFrame 并继续,而不等待输入的信息。它仅在按下开关 JButton 两次后更新(这是因为它切换到 Cab#2,然后返回 Cab#1)。

我对线程进行了一些研究,但我对 Java 仍然是新手,到目前为止我所做的一切都是我自己学到的(这是针对初学者的 Java 大学课程,目前我已经远远超出了这一点) 。任何有关此问题的可能解决方案的帮助将不胜感激。这是相关代码:

Dispatch class:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;

public class Dispatch extends JFrame 
{
protected JTextPane mainTextArea;
private JPanel panel;
private JButton GoTo;
private JButton Switch;
private JButton quit;
private Font font;
private int cabNumber=1;
private Cab cab1=new Cab(); //Taxi #1
private Cab cab2=new Cab(); //Taxi #2

public Dispatch()
{
    super("Chess City Cab Service");                            //Sets the JFrame
    Dimension dim= Toolkit.getDefaultToolkit().getScreenSize();
    int width=400;      
    int height=200;     
    int xWindow=(dim.width-width)/2;
    int yWindow=(dim.height-height)/2;
    setLocation(xWindow, yWindow);
    SimpleAttributeSet bSet = new SimpleAttributeSet();             //For setting JTextPane to Center
    StyleConstants.setAlignment(bSet, StyleConstants.ALIGN_CENTER); //Alignment text.

    panel=new JPanel();
    panel.setBackground(Color.YELLOW);
    mainTextArea=new JTextPane();           //create and set JTextPane
    mainTextArea.setEditable(false);
    font=new Font("Serif",Font.PLAIN, 14);
    mainTextArea.setFont(font);
    mainTextArea.setBackground(Color.YELLOW);

    String cabButtonString="";
    menuOutput();
    mainTextArea.revalidate();
    panel.add(mainTextArea);
    StyledDocument doc = mainTextArea.getStyledDocument();
    doc.setParagraphAttributes(0, 104, bSet, false);

    GoTo=new JButton("Drive To...");            //Tells taxi to go to a certain destination
    GoTo.setToolTipText("Click this button to go to a destination");
    panel.add(GoTo);

    if(cabNumber==1)
        cabButtonString="Click this button to switch to cab #2";
    else
        cabButtonString="Click this button to switch to cab #1";

    Switch=new JButton("Switch");           //for switching be/w the two cabs
    Switch.setToolTipText(cabButtonString);
    panel.add(Switch);

    quit=new JButton("Quit");               //quit the program
    quit.setToolTipText("Click this button to quit program");
    panel.add(quit);

    add(panel);                                 //set JFrame size and to visible
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(400,200);
    setVisible(true);

    HandlerClass handler=new HandlerClass();
    GoTo.addActionListener(handler);
    Switch.addActionListener(handler);
    quit.addActionListener(handler);
}
private class HandlerClass implements ActionListener
{
    public void actionPerformed(ActionEvent event)
    {
        Object source = event.getSource();

        if(source==GoTo)            //Goes to the GoToDistinationScreen() in the 
        {                           //CabThreadTester Class where user tells the taxi
            if (cabNumber==1)       //where to go. This is where I need this JFram to pause
            {                       //and allow for other class to complete before moving on.
                cab1.GoToDistinationScreen();
            }
            else
            {
                cab2.GoToDistinationScreen();
            }
            mainTextArea.setText("");       //Clears mainTextArea and then reenters with updated
            mainTextArea.revalidate();      //information.
            menuOutput();
            mainTextArea.revalidate();
        }
        else if(source==Switch)     //Switch between two taxis, currently only way to update taxi location
        {                           //by pressing twice.
            if(cabNumber==1)
            {
                cabNumber=2;
                Switch.setToolTipText("Click this button to switch to cab #1");
                Switch.revalidate();
            }
            else
            {
                cabNumber=1;
                Switch.setToolTipText("Click this button to switch to cab #2");
                Switch.revalidate();
            }
            mainTextArea.setText("");
            mainTextArea.revalidate();
            menuOutput();
            mainTextArea.revalidate();
        }
        else if(source==quit)   //quits the program
        {
            System.exit(0);
        }
    }
}
public void menuOutput()    //Decides what the mainTextArea will show
{
    if(cabNumber==1)
    {
        mainTextArea.setText("     Cab #"+cabNumber+"\nCurrent Location: Intersection of "+cab1.getAlphaStreetName()+" & "+cab1.getNumericStreetName()+"\nPassenger on board");
    }
    else
    {
        mainTextArea.setText("     Cab #"+cabNumber+"\nCurrent Location: Intersection of "+cab2.getAlphaStreetName()+" & "+cab2.getNumericStreetName()+"\nPassenger on board");
    }
}
public static void main(String[] args) 
{   
    new Dispatch();
}
}

Cab class:

import java.awt.*;
import java.awt.event.*;
import javax.swing.text.*;
import javax.swing.*;

public class Cab
{
public boolean hasPassenger;
private int xLoc, yLoc,xGoTo, yGoTo;
public String alphaStreet;
public String numericStreet;

public Cab()
{
    hasPassenger=false;
    xLoc=0;
    yLoc=0;
    xGoTo=0;
    yGoTo=0;
    alphaStreet="A Street";
    numericStreet="Zero Street";
    //Sets the initial values
}
public String getAlphaStreetName() //returns alphabetical Street names
{
    return alphaStreet;
}
public String getNumericStreetName() //returns numerical street names
{
    return numericStreet;
}
public void GoToDistinationScreen()     //displays GoToDistination subclass
{
    GoToDistination go=new GoToDistination();
    go.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    go.setSize(250,175);
    go.setVisible(true);
}   
public class GoToDistination extends JFrame
{
    private JComboBox alphaBox;
    private JComboBox numericBox;
    private JTextArea goTextArea;   //1st textArea
    private JTextArea asTextArea;   //2nd textArea
    private JTextArea nsTextArea;   //3rd textArea
    private Font font;
    private String[] alpha={"A", "B", "C", "D", "E",        //both arrays for JComboBox options
            "F", "G", "H", "I", "J","K"};
    private String[] numeric={"Zero","1st","2nd","3rd","4th","5th","6th","7th",
            "8th","9th","10th"};
    private JButton Continue, Cancel;
    private String letter, number;      //Data Stored from ItemEvents
    private JPanel panel;

    public GoToDistination()
    {
        super("Chess City Cab Service");
        Dimension dim= Toolkit.getDefaultToolkit().getScreenSize();
        int width=250;                                              //sets the JFrame
        int height=175;
        int xWindow=(dim.width-width)/2;
        int yWindow=(dim.height-height)/2;
        setLocation(xWindow, yWindow);
        panel=new JPanel();
        panel.setBackground(Color.YELLOW);
        goTextArea=new JTextArea(1,20);     
        goTextArea.setEditable(false);          
        font=new Font("Serif",Font.PLAIN, 14);  
        goTextArea.setFont(font);                   //sets goTextArea
        goTextArea.setBackground(Color.YELLOW);
        goTextArea.append("  Drive to the intersection of: ");
        panel.add(goTextArea);
        alphaBox=new JComboBox(alpha);
        letter=alphaBox.getSelectedItem().toString();   //for if there is no ItemEvent 
        alphaBox.addItemListener(
                new ItemListener()
                {
                    public void itemStateChanged(ItemEvent event)
                    {
                        if(event.getStateChange()==ItemEvent.SELECTED)
                            letter=alphaBox.getSelectedItem().toString();
                    }
                }
        );          
        panel.add(alphaBox);                //sets the asTextArea
        asTextArea=new JTextArea(1,5);
        asTextArea.append(" Street & ");
        asTextArea.setEditable(false);
        asTextArea.setFont(font);
        asTextArea.setBackground(Color.YELLOW);
        panel.add(asTextArea);
        numericBox=new JComboBox(numeric);
        number=numericBox.getSelectedItem().toString();
        numericBox.addItemListener(
                new ItemListener()
                {
                    public void itemStateChanged(ItemEvent event)   //for if there is no ItemEvent
                    {
                        if(event.getStateChange()==ItemEvent.SELECTED)
                            number=numericBox.getSelectedItem().toString();
                    }
                }
        );          
        panel.add(numericBox);
        nsTextArea=new JTextArea(1,4);      //sets the nsTextArea
        nsTextArea.append(" Street");
        nsTextArea.setEditable(false);
        nsTextArea.setFont(font);
        nsTextArea.setBackground(Color.YELLOW);
        panel.add(nsTextArea);

        Continue=new JButton("Continue");
        Continue.setToolTipText("Click this button to enter selected distination");
        panel.add(Continue);

        Cancel=new JButton("Cancel");
        Continue.setToolTipText("Click this button to cancel actions and return to menu");
        panel.add(Cancel);
        add(panel);

        HandlerClass handler=new HandlerClass();
        Continue.addActionListener(handler);
        Cancel.addActionListener(handler);
    }
    private class HandlerClass implements ActionListener
    {
        public void actionPerformed(ActionEvent event)
        {
            Object source = event.getSource();
            if(source==Continue)
            {
                int hashletter=letter.hashCode();
                int hashnumber=number.hashCode();
                xGoTo=aSwitch(hashletter);
                yGoTo=nSwitch(hashnumber);
                alphaStreet=aStreetName(xGoTo);                 //sets Street names for the location of taxi
                numericStreet=nStreetName(yGoTo);
                dispose();
            }
            else if(source==Cancel)
            {
                dispose();
            }
        }
    }
    private String aStreetName(int xGoTo)
    {
        switch(xGoTo)
        {
        case 0:return "A Street";
        case 1:return "B Street";
        case 2:return "C Street";
        case 3:return "D Street";
        case 4:return "E Street";
        case 5:return "F Street";
        case 6:return "G Street";
        case 7:return "H Street";
        case 8:return "I Street";
        case 9:return "J Street";
        }
        return "K Street";
    }
    private String nStreetName(int yGoTo)
    {
        switch(yGoTo)
        {
        case 0:return "Zero Street";
        case 1:return "1st Street";
        case 2:return "2nd Street";
        case 3:return "3rd Street";
        case 4:return "4th Street";
        case 5:return "5th Street";
        case 6:return "6th Street";
        case 7:return "7th Street";
        case 8:return "8th Street";
        case 9:return "9th Street";
        }
        return "10th Street";
    }
    private int aSwitch(int hashletter)
    {
        switch(hashletter)
        {
        case 65:return 0;
        case 66:return 1;
        case 67:return 2;
        case 68:return 3;
        case 69:return 4;
        case 70:return 5;
        case 71:return 6;
        case 72:return 7;
        case 73:return 8;
        case 74:return 9;
        }
        return 10;
        /* hash table for alpha string array
        A: 65
        B: 66
        C: 67
        D: 68
        E: 69
        F: 70
        G: 71
        H: 72
        I: 73
        J: 74
        K: 75
         */
    }
    private int nSwitch(int hashnumber)
    {
        switch(hashnumber)
        {
        case 2781896:return 0;
        case 50770:return 1;
        case 51560:return 2;
        case 52645:return 3;
        case 53672:return 4;
        case 54633:return 5;
        case 55594:return 6;
        case 56555:return 7;
        case 57516:return 8;
        case 58477:return 9;
        }
        return 10;
        /*  hash table for numeric string array
            Zero: 2781896
            1st: 50770
            2nd: 51560
            3rd: 52645
            4th: 53672
            5th: 54633
            6th: 55594
            7th: 56555
            8th: 57516
            9th: 58477
            10th: 1509587
         */
    }

}
}

我不知道什么Dispatch给聚会带来的除外的不便。相反,我会关注单个人的状态Cab并根据需要多次复制。在下面的示例中,Cab有可调节的颜色和里程表。 ATimer定期增加里程表值。每个独立的Cab占据一个单独的选项卡JTabbedPane.

附录:回到问题“如何暂停 main()”,答案是“不要”。相反,使用单独的线程,例如所管理的人Timer,以推进模型的状态并更新显示。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DecimalFormat;
import java.util.Random;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.Timer;

/** @see http://stackoverflow.com/questions/5617027 */
public class Cab extends JPanel {

    private static final Random random = new Random();
    private static final String format = "00000000";
    private static final DecimalFormat df = new DecimalFormat(format);
    private Hue hue = Hue.Yellow;
    private Timer timer;
    private JLabel odometer = new JLabel(df.format(0));
    private int km;

    public Cab() {
        this.setPreferredSize(new Dimension(320, 240));
        this.setBackground(hue.getColor());
        this.add(odometer);
        final JComboBox colorBox = new JComboBox();
        for (Hue h : Hue.values()) {
            colorBox.addItem(h);
        }
        colorBox.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                Hue h = (Hue) colorBox.getSelectedItem();
                Cab.this.setBackground(h.getColor());
            }
        });
        this.add(colorBox);
        timer = new Timer(250, new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                km += random.nextInt(100);
                odometer.setText(df.format(km));
            }
        });
        timer.start();
    }

    private enum Hue {

        Yellow(Color.yellow), Cyan(Color.cyan), Magenta(Color.magenta);
        private final Color color;

        private Hue(Color color) {
            this.color = color;
        }

        public Color getColor() {
            return color;
        }
    }

    private static void display() {
        JFrame f = new JFrame("Dispatch");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JTabbedPane tabbedPane = new JTabbedPane();
        tabbedPane.add("Cab #1", new Cab());
        tabbedPane.add("Cab #2", new Cab());
        tabbedPane.add("Cab #3", new Cab());
        f.add(tabbedPane);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                display();
            }
        });
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何暂停 main() 的相关文章

随机推荐

  • 区分 8 种颜色中的一种最准确的方法是什么?

    想象一下我们如何使用一些基本颜色 RED Color 196 2 51 RED ORANGE Color 255 165 0 ORANGE YELLOW Color 255 205 0 YELLOW GREEN Color 0 128 0
  • img src 属性中使用 javascript 进行 XSS 攻击

    一些较旧的浏览器容易受到 XSS 攻击 img src 当前版本的 IE FF Chrome 不是 我很好奇是否有浏览器容易受到类似的攻击 img src somefile js or 或其他类似的地方 somefile js 包含一些恶意
  • Jenkins Git Publisher 标签未检测到环境变量

    在我的 Jenkins bash 脚本中 我导出以下环境变量 export TAG NAME v LIVE VERSION LIVE BUILD 在 Git 发布者部分中 我尝试创建一个标签 其标签名称字段填充为 TAG NAME 但它试图
  • atol() 与 strtol()

    atol 与 strtol 有什么区别 根据他们的手册页 它们似乎具有相同的效果以及匹配的参数 long atol const char nptr long int strtol const char nptr char endptr in
  • GetAssemblyIdentity 版本始终为 1.0.0.0

    尽管文件版本和产品版本均在 DLL 中定义 并且当我在 Windows 7 中查看其属性时正确显示 但版本为 1 0 0 0 有什么建议吗
  • 更改输入状态会延迟一个字符(useState 挂钩)

    我正在尝试在我的社交网络中实现用户个人资料的即时搜索 它似乎有效 但在输入更改时设置状态 使用挂钩 会导致延迟一个字符 我研究了一下 发现状态延迟的问题可以通过在 setState 中使用回调函数来解决 但是 useState 不支持这一点
  • 获取特定应用程序的屏幕截图

    我知道我可以使用 Graphics CopyFromScreen 获取整个屏幕的屏幕截图 但是 如果我只想要特定应用程序的屏幕截图怎么办 PrintWindow win32 api 将捕获窗口位图 即使该窗口被其他窗口覆盖或位于屏幕外 Dl
  • 什么是“柯里化”?

    我在几篇文章和博客中看到了对柯里化函数的引用 但我找不到一个很好的解释 或者至少是一个有意义的解释 柯里化是指将一个接受多个参数的函数分解为一系列函数 每个函数只接受一个参数 这是一个 JavaScript 示例 function add
  • jquery遍历新创建的元素

    我正在尝试在表中添加新行 并将它们保存到数据库中 首先 我使用 append 在表中追加行 tablename append tr td newly added row td tr 附加功能运行良好 我的页面显示了正确的结果 但是 我无法选
  • 如何以编程方式实例化新的视图控制器

    我有一个带有两个 UIButtons 和 UIlabels 的 ViewController 为了制作类似的 ViewController 我想以编程方式实例化一个新的视图控制器 像这样 let vc storyboard instanti
  • Android - 如何确定坐标是否位于 Google 地图中的道路上

    我需要在我的应用程序中进行检查 以确定给定的坐标是否位于 Google 地图中的道路上 Google Maps API 中是否有任何功能可以帮助我实现这一点 提前致谢 据我所知 使用 Google Maps API 无法完成此操作 我认为你
  • 将 html 输入对齐在同一行

    有人可以给出一个简单的解决方案 如何将表单输入对齐在同一行上 例如 很多时候 当我构建表单时 我可以让它们彼此对齐 并且看起来不错 但是如果我将两个输入 如文本区域 文本 放在另一个文本或按钮旁边 我会得到垂直对齐差异 有没有办法解决这个问
  • 突出显示两个字符串之间的差异

    如果我有两个较长的字符串 VARCHAR2 是否有一种简单的方法或算法可以复制或移植到 PL SQL 来比较它们 插入标记 即 以便在网页中呈现时 差异将突出显示 例如 BEGIN DBMS OUTPUT put line markup d
  • 如何动态切换 jquery 中的元素?

    所以我想做的是制作一个动态的小脚本来选择县和城市 好吧 我在 mysql 数据库中拥有所有国家和城市 如果我选择一个县
  • 如何在 GitLab CI 中显示来自另一个存储库的测试

    因此 我的项目包含单元测试 当我在 GitLab 中配置 CI 系统后发出合并请求时 它们会很好地显示为绿色或红色圆圈 但现在我也有一些集成测试 它们驻留在单独的存储库中 你为什么问 因为我有多个微服务需要一起测试 并且每个微服务都有自己的
  • vim 定界伴侣

    使用 DelimitMate 它会自动生成右括号 当我在括号内输入完毕后 按什么键可以快速转到右括号的右侧 现在我必须手动按 ESC 然后按 a 这些自动关闭插件 就像 Eclipse 等 IDE 中的原始功能实现一样 的想法是 您只需ty
  • C#:最易读的字符串连接。最佳实践[重复]

    这个问题在这里已经有答案了 可能的重复 我应该如何连接字符串 https stackoverflow com questions 3102806 how should i concatenate strings 在日常任务中 当执行任务时
  • 最小化时窗口内容消失

    我有一个简单的类 当鼠标拖动时画一条线 或者当鼠标按下 释放 时画一个点 当我最小化应用程序然后恢复它时 窗口的内容消失 除了最后一个点 像素 我明白这个方法super paint g 每次窗口更改时都会重新绘制背景 但无论我是否使用它 结
  • WebApi HTTPPOST 端点未命中

    我有以下简单的 HTTPPOST 端点 AllowAnonymous HttpPost Route forgotPassword public IHttpActionResult ForgotPassword string userName
  • 如何暂停 main()

    我正在尝试编写我的程序 以便当用户单击 Drive To JButton 在我的主类 Dispatch 中 时 它会从另一个类 Cab 打开一个 JFrame GoToDistination 用户可以在其中输入所需的内容信息 单击 继续 后