2012-08-26 47 views
0

正如您从我的代码中可以看到的,我完全忽略了这里的一个完整的概念。我的目标是让用户输入:涉及Swing的EDT的线程错误

JButton的文本字段: 文字方向和助记符

我传递信息到我的Button类来检查错误,还给已定义的按钮。

然后用所述按钮填充用户规格的JFrame。

基本和显然是一个课程的问题,但我在我的智慧在这里结束。这是我第一次请求帮助,请让我轻松一下。

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”的部分。如果我将它设为默认按钮,它会通过运动并放置默认按钮。

仅供参考,这是我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; 

    } 
} 
+1

另外考虑一个不依赖'System.in'的设计。 – trashgod

回答

0

对于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(); 
     } 
    } 

EDIT2:

好了,所以我复制你的代码到我的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); 

    } 

做这样的^

我不能让记忆有关的东西才能正常工作,而且我也不想花那么多时间在它上面,所以我只是删除它们。 方向thingies也没有工作。

public class Button extends JButton 
    // And of course the import statement... 

您可以使用Button.TOP

在main(字符串ARGS [])

createdButton = userButton.createButton(); // Make createButton() return Button; 

你不需要的JButton在你的代码的任何地方,除了这部分在底部将这个而不是AbstractButton.TOP这将摆脱你的进口声明。

+0

参见[*初始线程*](http://download.oracle.com/javase/tutorial/uiswing/concurrency/initial.html)。 – trashgod

+0

@ user1555857调用createAndShowGUI方法(在可运行的范围内)是合适的和推荐的。不能保证主体将在EDT – MadProgrammer

+0

内被调用嗯...感谢您的更多智慧:)虽然该特定程序的行为并未因我的编辑而改变。 但最好是安全比对不起,我猜^^ 编辑:*修正* – user1555857