java - 涉及Swing的EDT的线程错误

标签 java multithreading swing error-handling jbutton

正如您从我的代码中看到的那样,我在这里完全缺少一个完整的概念。我的目标是让用户输入:

Jbutton文本字段:
文字方向和助记符

我将该信息传递给我的Button类,该类检查错误并返回已经定义的按钮。

然后,根据用户要求,使用上述按钮填充JFrame。

BASIC显然是一个类(class)问题,但我的智慧到此为止。这是我第一次寻求帮助,所以请放心。

import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JButton;


/**
 * This class will create a button using the Button class and with user input to define the instance
 * of the Button Class.
 * 
 */
public class CreateButton extends JPanel
{
    // instance variables 
    private static String userIn; // user input
    private static Button userButton; // button to be manipulated
    public static JButton createdButton; // finished button



    /**
     * Contructor for the CreateButton class.
     */
    public static void main (String [] args)
    {

            System.out.println("\nThis program will create a button with some input for you.");
            System.out.println("What would you like to call this button?");

            userIn = StringIn.get();

            userButton = new Button();
            userButton.buttonText(userIn);

            System.out.println("\nYou can orient your text on the button in the vertical and");
            System.out.println("horizontal axis. We will start with the vertical. Where would you like");
            System.out.println("the text, on the top, center, or bottom?");

            userIn = StringIn.get();

            String vertical = userIn;

            System.out.println("\nNext let's select the horizontal alignment. Would you like the text");
            System.out.println("aligned to the left, center, or right?");

            userIn = StringIn.get();

            String horizontal = userIn;

            userButton.textPosition(vertical,horizontal);

            System.out.println("\nFinally let's add a mnemonic or hotkey to the button. Pick a letter");
            System.out.println("from a-z on the keyboard and you can activate the button by pushing");
            System.out.println("ALT + your letter of choice. Please enter your letter:");

            userIn = StringIn.get();

            userButton.buttonMnemomic(userIn);

            System.out.println("\nGreat let's create and see this button.");


            javax.swing.SwingUtilities.invokeLater(new Runnable() 
            {
                public void run() 
                {
                   createAndShowGUI();
                }
            }); 

    }

     private static void createAndShowGUI() 
    {

        //Create and set up the window.
        JFrame frame = new JFrame("Create a Button");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Create and set up the content pane.
        CreateButton newContentPane =  new CreateButton();
        newContentPane.setOpaque(true); //content panes must be opaque
        frame.setContentPane(newContentPane);


        //Display the window.
        frame.pack();
        frame.setVisible(true);

    }
}

我的按钮错误检查器代码如下:
import javax.swing.AbstractButton;
import javax.swing.JButton;


/**
 * This class will demonstrate the use of a button.
 * 
 */
public class Button                        
{
    // instance variables 
    protected JButton myButton; // button to be created and manipulated
    private String myButtonText; // text on the button
    private String myButtonVerticalTextPosition; 
    private String myButtonHorizontalTextPosition;
    private String myButtonMnemonic; // hotkey for the button

    /**
     * Constructor for objects of class Button
     */
    public Button()
    {

    }

    /**
     *Set button text. String input.
     */
    public void buttonText(String textIn)
    {
        myButtonText = textIn;
    }

    /**
     *Set button text position. String input for vertical (top, center, bottom) and horizontal
     *(left, center, right).
     */
    public void textPosition(String verticalIn, String horizontalIn)
    {
        myButtonVerticalTextPosition = verticalIn;

        boolean validInput = false;

        do
        {
            if  ((myButtonVerticalTextPosition.compareToIgnoreCase("top") == 0)||  
                 (myButtonVerticalTextPosition.compareToIgnoreCase("centre") == 0) ||
                 (myButtonVerticalTextPosition.compareToIgnoreCase("center") == 0) ||
                 (myButtonVerticalTextPosition.compareToIgnoreCase("bottom") == 0))
            {

                validInput = true;
            } else
            {

               System.out.println("\nPlease enter top, center, or bottom for vertical position:");
               myButtonVerticalTextPosition = StringIn.get();
            } 
        } while (validInput == false);

        myButtonHorizontalTextPosition = horizontalIn;

        validInput = false;

        do
        {
            if  ((myButtonHorizontalTextPosition.compareToIgnoreCase("left") == 0) ||  
                 (myButtonHorizontalTextPosition.compareToIgnoreCase("centre") == 0) ||
                 (myButtonHorizontalTextPosition.compareToIgnoreCase("center") == 0) ||
                 (myButtonHorizontalTextPosition.compareToIgnoreCase("right") == 0))
            {

                validInput = true;
            } else 
            {

                System.out.println("\nPlease enter left, center, or right for horizontal position:");
                myButtonHorizontalTextPosition = StringIn.get();
            } 
        } while (validInput == false);
    }

    /**
     *Set button mnemomic. String input for mnemomic [a-z].
     */
    public void buttonMnemomic(String mnemomicIn)
    {
        myButtonMnemonic = mnemomicIn;
        boolean validInput = false;

        do
        {
            if  (myButtonMnemonic.length() > 1)
            {
                System.out.println("\nPlease enter a letter from a-z: ");
                myButtonMnemonic = StringIn.get();
            } else if (!myButtonMnemonic.matches("^[a-zA-Z]+$"))
            {
                System.out.println("\nPlease enter a letter from a-z: ");
                myButtonMnemonic = StringIn.get();
            } else if ((myButtonMnemonic.length() == 1) && 
                       (myButtonMnemonic.matches("^[a-zA-Z]+$")))
            {
                validInput = true;
            }
        } while (validInput == false);
    }

    /**
     *Create button. Void method to create the button to the variables provided.
     */
    public void createButton()
    {
        // create new button

        myButton = new JButton(myButtonText);

        // set text position

        switch (myButtonVerticalTextPosition)
        {
            case "top":
                myButton.setVerticalTextPosition(AbstractButton.TOP);
                break;
            case "centre":
                myButton.setVerticalTextPosition(AbstractButton.CENTER);
                break;
            case "center":
                myButton.setVerticalTextPosition(AbstractButton.CENTER);
                break;
            case "bottom":
                myButton.setVerticalTextPosition(AbstractButton.BOTTOM);
                break;
            default:
                System.err.format("%n%s is an invalid entry.", myButtonVerticalTextPosition);
                break;
        }

        switch (myButtonHorizontalTextPosition)
        {
            case "left":
                myButton.setHorizontalTextPosition(AbstractButton.LEADING);
                break;
            case "centre":
                myButton.setHorizontalTextPosition(AbstractButton.CENTER);
                break;
            case "center":
                myButton.setHorizontalTextPosition(AbstractButton.CENTER);
                break;
            case "right":
                myButton.setHorizontalTextPosition(AbstractButton.TRAILING);
                break;
            default:
                System.err.format("%n%s is an invalid entry.", myButtonVerticalTextPosition);
                break;
        }

        // set button mnemonic

        StringBuilder hotKey = new StringBuilder("KeyEvent.VK_");
        hotKey.append(myButtonMnemonic.toUpperCase());
        myButton.setMnemonic(hotKey.charAt(0));

        // set tool tip text

        myButton.setToolTipText("Push the button. You know you want to.");
    }

    /**
     *Returns a JButton for the button type.
     */
    public JButton returnButton()
    {
        return myButton;
    }
}

所有这些都可以在添加“createdButton”的部分完成。如果我将其设置为默认按钮,则会执行所有 Action 并设置默认按钮。

仅供引用,这是我的StringIn代码:
import java.util.Scanner;
import java.io.IOException;

/**
 * This class will allow the user to type in string from the console.
 * 
 */

public class StringIn 
{
    // instance variables 
    private static String userIn;

    public static String get() 
    {

        try (Scanner in = new Scanner(System.in))
        {
            userIn = new String(in.nextLine()); // Read the string from console.
        }
        return userIn;

    }
}

最佳答案

对于StringIn类,只需执行以下操作:

    import java.util.Scanner;


    public class StringIn 
    {
        // instance variables 
        private static Scanner scanner = new Scanner(System.in);

        public static String get(){
            return scanner.nextLine();
        }
    }

编辑2:

好的,所以我将您的代码复制到我的IDE中,并且得到的错误是源自您的StringIn类的错误。 (我真的不记得了,但这并不重要。)

您的StringIn类应类似于上面的示例。

对于您的createAndShowGUI()函数:
    private static void createAndShowGUI() 
    {

        //Create and set up the window.
        JFrame frame = new JFrame("Create a Button");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Create and set up the content pane. ( Why were you even doing this? )

        frame.add(createdButton); //( To display the actual button you need to
        //add it to the frame)

        //Display the window.
        frame.pack();
        frame.setVisible(true);

    }

那样做^

我无法使与助记符相关的东西正常工作,并且我不想花太多时间在上面,所以我只删除了它们。
定向事物也不起作用。

将其放在main(String args [])的底部
    createdButton = userButton.createButton(); // Make createButton() return Button;

除了以下部分,您不需要在代码中的任何位置使用JButton:
    public class Button extends JButton
    // And of course the import statement...

您可以使用Button.TOP代替AbstractButton.TOP,这将为您消除导入语句。

关于java - 涉及Swing的EDT的线程错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12127248/

相关文章:

java - 理解netty中的DelimeterDecoder

c# - C#中的线程同步

cocoa - 如果我不在创建对象的线程上显式访问它们,那么操作在线程外部创建的对象是否安全?

java - 防止 JScrollPane 扩展其 viewPort 组件

java - IntelliJ Idea(社区)扫描已关闭文件中的错误

java - Android Studio LibGDX 游戏问题

java - Java 中并发的 gremlin-server 和图形查询

Python:获取并发.futures执行器等待done_callbacks完成

java - 使图像在 JFrame 内容 Pane 中可滚动

java - 将实例化对象修改为实例化对象