【问题标题】:How to add text and delete text using GUI in Java如何在 Java 中使用 GUI 添加和删除文本
【发布时间】:2019-04-10 00:45:09
【问题描述】:

我正在创建一个哑电话(就像旧的传统电话一样)并且我正在使用 GUI 编程。我需要帮助来拨号码。我不知道如何让数字在显示屏上弹出并留在那里,并且也使用删除按钮删除显示屏上的数字。我将发布一个 youtube 链接,以便您查看示例运行。

我目前坚持从应该显示数字的每个数字的按钮传递文本,但是它正在显示按钮的文本。我也,不知道如何在按下其他按钮而不重置它的情况下将数字保留在那里。

这是我的代码:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;
import javax.swing.*;

public class DumbPhone extends JFrame
{
private static final long serialVersionUID = 1L;
private static final int WIDTH = 300;
private static final int HEIGHT = 500;

private static final String CALL_BUTTON_TEXT = "Call";
private static final String TEXT_BUTTON_TEXT = "Text";
private static final String DELETE_BUTTON_TEXT = "Delete";
private static final String CANCEL_BUTTON_TEXT = "Cancel";
private static final String SEND_BUTTON_TEXT = "Send";
private static final String END_BUTTON_TEXT = "End";
private static final String CALLING_DISPLAY_TEXT = "Calling...";
private static final String TEXT_DISPLAY_TEXT = "Enter text...";
private static final String ENTER_NUMBER_TEXT = "Enter a number...";

private JTextArea display;

private JButton topMiddleButton;
private JButton topLeftButton;
private JButton topRightButton;

private JButton[] numberButtons;

private JButton starButton;
private JButton poundButton;

private boolean isNumberMode = true;

private String lastPressed = "";
private int lastCharacterIndex = 0;
private Date lastPressTime;

public DumbPhone()
{
    setTitle("Dumb Phone");
    setSize(WIDTH, HEIGHT);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    createContents();
    setVisible(true);
    topLeftButton.setEnabled(false);
}
private void createContents()
{
    //create JPanel, and JTextArea display
    JPanel panel = new JPanel(new GridLayout(5,3));
    display = new JTextArea();
    display.setPreferredSize(new Dimension(280, 80));
    display.setFont(new Font("Helvetica", Font.PLAIN, 32));
    display.setLineWrap(true);
    display.setEnabled(false);
    panel.add(display);
    //create JButtons
    topLeftButton = new JButton(DELETE_BUTTON_TEXT);
    topMiddleButton = new JButton((CALL_BUTTON_TEXT));
    topRightButton = new JButton((TEXT_BUTTON_TEXT));
    numberButtons = new JButton[10];
    numberButtons[1] = new JButton("<html><center>1<br></center></html>");
    numberButtons[2] = new JButton("<html><center>2<br>ABC</center></html>");
    numberButtons[3] = new JButton("<html><right>3<br>DEF</right></html>");
    numberButtons[4] = new JButton("<html><center>4<br>GHI</center></html>");
    numberButtons[5] = new JButton("<html><center>5<br>JKL</center></html>");
    numberButtons[6] = new JButton("<html><center>6<br>MNO</center></html>");
    numberButtons[7] = new JButton("<html><center>7<br>PQRS</center></html>");
    numberButtons[8] = new JButton("<html><center>8<br>TUV</center></html>");
    numberButtons[9] = new JButton("<html><center>9<br>WXYZ</center></html>");
    numberButtons[0] = new JButton("<html><center>0<br>space</center></html>");

    poundButton = new JButton("#");
    starButton = new JButton("*");
    //add JButtons to buttons JPanel
    panel.add(topLeftButton);
    panel.add(topMiddleButton);
    panel.add(topRightButton);
    panel.add(numberButtons[1]);
    panel.add(numberButtons[2]);
    panel.add(numberButtons[3]);
    panel.add(numberButtons[4]);
    panel.add(numberButtons[5]);
    panel.add(numberButtons[6]);
    panel.add(numberButtons[7]);
    panel.add(numberButtons[8]);
    panel.add(numberButtons[9]);
    panel.add(starButton);
    panel.add(numberButtons[0]);
    panel.add(poundButton);
    //add Listener instance (inner class) to buttons
    topLeftButton.addActionListener(new Listener());
    topMiddleButton.addActionListener(new Listener());
    topRightButton.addActionListener(new Listener());
    //JButton[] array = new JButton[10];
    for (int i = 0; i < numberButtons.length; i++)
    {
        numberButtons[i].addActionListener(new Listener());
        numberButtons[i] = new JButton(String.valueOf(i));
    }
        starButton.addActionListener(new Listener());
        poundButton.addActionListener(new Listener());
    //add display and buttons to JFrame
    setLayout(new BorderLayout());
    add(display, BorderLayout.NORTH);
    add(panel, BorderLayout.CENTER);
}

private class Listener implements ActionListener
{

    public void actionPerformed(ActionEvent e)
    {
        if(e.getSource() == topLeftButton)
        {
                if(lastPressTime == null)
                {
                    display.setText(ENTER_NUMBER_TEXT);
                }
                else
                {
                    topLeftButton.setEnabled(true);
                    lastCharacterIndex--;
                    lastPressed = lastPressTime.toString();
                }
        }
        else if(e.getSource() == topMiddleButton)
        {
            if(lastPressTime == null || lastCharacterIndex == 0)
            {
                display.setText(ENTER_NUMBER_TEXT);
            }
            else
            {
                display.setText(CALLING_DISPLAY_TEXT);
            }
        }
        else if(e.getSource() == topRightButton)
        {
            if(lastPressTime == null || lastCharacterIndex == 0)
            {
                display.setText(TEXT_DISPLAY_TEXT);
            }
            else
            {
                display.setText(CALLING_DISPLAY_TEXT);
            }
        }
        else
        {
            topLeftButton.setEnabled(true);
            if (e.getSource() instanceof JButton)
            {
                //String text = ((JButton) e.getSource()).getText();
                display.setText(lastPressed + " f" + numberButtons[lastCharacterIndex].getText());
            }
        }
        Date currentPress = new Date();

        long currentTime = currentPress.getTime();
        if(lastPressTime != null)
        {
            //long lastPressTime = lastPressTime.getTime();
            //subtract lastPressTime from currentPress time to find amount of time elapsed since last button pressed.
        }
        lastPressTime = currentPress;
        String buttonLetters = ""; // Parse Letter from button (e.g "abc").
        //update lastCharacterIndex.
        lastCharacterIndex++;
        lastCharacterIndex = lastCharacterIndex % buttonLetters.length();
    }
}

例如,如果我按下按钮 2,而不是给我“2”,它会给我

2
ABC

因此,我需要帮助

  1. 有数字按钮,当被按下时显示被按下的数字。
  2. 能够删除这些号码。

这是示例运行的链接:https://www.youtube.com/watch?v=evmGWlMSqqg&feature=youtu.be

尝试在 20 秒后开始播放视频。

【问题讨论】:

  • display.setText 将替换现有文本。我的“一般”建议是使用StringBuilder 作为您的主要缓冲区。这样您就可以轻松地添加和删除字符,然后将其传递给display.setText
  • @MadProgrammer 我将在我的代码中的哪个位置放入 StringBuilder?
  • 您可以将其设为实例字段。当用户按下按钮时,您将根据您的规则和要求对其进行更新,然后将其传递给display.setText
  • @MadProgrammer 实例字段是什么意思?我不知道那是什么......
  • private JTextArea display; 是一个实例字段 - 它是一个变量,在类级别定义,但与声明的 static 不同,它需要类的实例才能访问。

标签: java swing event-handling jbutton actionlistener


【解决方案1】:

要删除数字,可以使用labelname.setText("")

【讨论】:

    【解决方案2】:

    在基本层面上,您只想将“数字”与 UI 分开维护。这就是俗称的“模型”。模型独立于 UI 存在,并允许根据应用程序的需要以多种可能的方式表示模型。

    在您的情况下,您可以使用链表、数组或其他一些简单的基于顺序的列表,但最简单的可能是使用StringBuilder,因为它提供了您需要的功能(追加和删除)并且可以String 非常简单。

    所以,你需要做的第一件事就是创建一个模型实例作为实例级字段;

    private StringBuilder numbers = new StringBuilder(10);
    

    这将允许在类实例中的任何位置访问缓冲区。

    那你需要更新模型...

    else
    {
        topLeftButton.setEnabled(true);
        if (e.getSource() instanceof JButton)
        {
            String text = numberButtons[lastCharacterIndex].getText();
            numbers.append(text);
        }
    }
    

    要删除最后一个字符,您可以简单地使用类似...

    if (numbers.length() > 0) {
        numbers.deleteCharAt(numbers.length() - 1);
    }
    

    然后,当您需要时,您可以使用类似...的方式更新 UI。

    display.setText(numbers.toString());
    

    现在,这只是基本概念,您需要将这些想法应用到您的代码库中

    【讨论】:

    • 我知道填写的更多细节
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    相关资源
    最近更新 更多