2012-12-02 177 views
4

我試圖讓打字導師象下面這樣:的Java Swing虛擬鍵盤上的JFrame

keyboard 這是我寫的代碼:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.GridLayout; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.util.Arrays; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
/** 
* Simple swing based typing tutor using frame 
* @author 
* @date 
*/ 
public class TypingTutor extends JFrame implements KeyListener 
{ 
//Individual keyboard rows 
String firstRow[] = {"~","1","2","3","4","5","6","7","8","9","0","-","+","<<<<<"};//BackSpace 
String secondRow[] = {"Tab","Q","W","E","R","T","Y","U","I","O","P","[","]","\\"}; 
String thirdRow[] = {"Caps","A","S","D","F","G","H","J","K","L",":","\"","Enter"}; 
String fourthRow[] = {"Shift","Z","X","C","V","B","N","M",",",".","?"," ^" }; 
String fifthRow[]={"  " ,"<" ,"\\/",">" }; 

//all keys without shift key press 
String noShift="`1234567890-=qwertyuiop[]\\asdfghjkl;'zxcvbnm,./"; 
//special charactors on keyboard that has to be addressed duing keypress 
String specialChars ="~-+[]\\;',.?"; 

//Jbuttons corresponting to each individual rows 
JButton first[]; 

JButton second[]; 

JButton third[]; 

JButton fourth[]; 

JButton fifth[]; 

//default color of the button to be repainted when key released 
Color cc = new JButton().getBackground(); 

/* 
* Invoked when a key has been pressed. 
* @see java.awt.event.KeyListener#keyPressed(java.awt.event.KeyEvent) 
*/ 
public void keyPressed(KeyEvent evt) 
{ 


}//end of keypressed 

/** 
* Invoked when a key has been released. 
*/ 
public void keyReleased(KeyEvent evt) 
{ 

} 

/* 
* Driver main method to start the application 
*/ 
public static void main(String[] args) { 
    //launch typing tutor 
    new TypingTutor().setVisible(true); 
} 
/* 
* No argument construtor to create frame 
*/ 
public TypingTutor() 
{ 
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    //set non resizable 
    this.setResizable(false); 
    //super.setSize(500,300); 
    //set size of the content pane ie frame 
    this.getContentPane().setPreferredSize(new Dimension(1000,600)); 
    //super.getContentPane().setSize(800,400); 
    //set location for the frame 
    this.setLocation(50,50); 

    //init and paint frame 
    initWidgets(); 
} 

/** 
* Method to initialize frame component 
*/ 
private void initWidgets() 
{ 
    //set the text area on top 
    JTextArea text = new JTextArea(); 
    text.setPreferredSize(new Dimension(800,200)); 
    //JScrollPane scrollPane = new JScrollPane(text); 
    //scrollPane.setPreferredSize(new Dimension(800, 200)); 

    // add(typingArea, BorderLayout.PAGE_START); 
    // add(scrollPane, BorderLayout.CENTER); 
    //set the info label on top 
    JLabel info = new JLabel("<html>Type some text using your keyboard.The keys you press will be highlighted and text will be displayed.<br> Note : Clicking the buttons with your mouse will not perform any action. <br><br> </html>"); 
    //set the bold font for info 
    info.setFont(new Font("Verdana",Font.BOLD,14)); 

    /*set the layout and place compomnet in place and pack it */ 
    setLayout(new BorderLayout()); 
    /*Various panel for the layout */ 
    JPanel jpNorth = new JPanel(); 
    JPanel jpCenter = new JPanel(); 
    JPanel jpKeyboard = new JPanel(); 
    JPanel jpNote = new JPanel(); 
    add(jpNorth, BorderLayout.NORTH); 
    add(jpNote); 
    add(jpCenter, BorderLayout.CENTER); 
    add(jpKeyboard, BorderLayout.SOUTH); 

    jpNorth.setLayout(new BorderLayout()); 
    jpNorth.add(info, BorderLayout.WEST); 
    jpNorth.add(info, BorderLayout.SOUTH); 

    jpCenter.setLayout(new BorderLayout()); 
    jpCenter.add(text, BorderLayout.WEST); 
    jpCenter.add(text, BorderLayout.CENTER); 

    //add(text,BorderLayout.WEST); 
    // add(scrollPane,BorderLayout.CENTER); 

    //layout for keyboard 
    jpKeyboard.setLayout(new GridLayout(5,1)); 
    //pack the components 
    pack(); 

    /*paint first keyboard row and add it to the keyboard*/ 
    first = new JButton[firstRow.length]; 
    //get the panel for the row 
    JPanel p = new JPanel(new GridLayout(1, firstRow.length)); 
    for(int i = 0; i < firstRow.length; ++i) 
    { 
     JButton b= new JButton(firstRow[i]); 
     b.setPreferredSize(new Dimension(100,50)); 
     first[i] = b; 
     p.add(first[i]); 
    } 
    jpKeyboard.add(p); 

    /*paint second keyboard row and add it to the keyboard*/ 
    second = new JButton[secondRow.length]; 
    //get the panel for the row 
    p = new JPanel(new GridLayout(1, secondRow.length)); 
    for(int i = 0; i < secondRow.length; ++i) 
    { 
     second[i] = new JButton(secondRow[i]); 
     p.add(second[i]); 

    } 
    jpKeyboard.add(p); 

    /*paint third keyboard row and add it to the keyboard*/ 

    third = new JButton[thirdRow.length]; 
    //get the panel for the row 
    p = new JPanel(new GridLayout(1, thirdRow.length)); 
    for(int i = 0; i < thirdRow.length; ++i) 
    { 
     third[i] = new JButton(thirdRow[i]); 
     p.add(third[i]); 
    } 
    jpKeyboard.add(p); 

    /*paint fourth keyboard row and add it to the keyboard*/ 
    fourth = new JButton[fourthRow.length]; 
    //get the panel for the row 
    p = new JPanel(new GridLayout(1, fourthRow.length)); 
    for(int i = 0; i < fourthRow.length; ++i) 
    { 
     fourth[i] = new JButton(fourthRow[i]); 
     p.add(fourth[i]); 
     if(i==fourthRow.length-2) 
      p.add(new JPanel()); 

    } 
    p.add(new JPanel()); 
    jpKeyboard.add(p); 

    //paint the fifth row 
    fifth = new JButton[fifthRow.length]; 
    //get the panel for the row 
    p = new JPanel(new GridLayout(1, fifthRow.length)); 
    /*put empty panel for layout adjustments */ 
    for(int i = 0; i < 1; ++i) 
    { 
     JPanel spacePanel = new JPanel(); 
     p.add(spacePanel); 
    } 
    /*draw the buttons */ 
    for(int i = 0; i < fifthRow.length; ++i) 
    { 
     if(i==1) //space bar panel 
     { 
      JButton b = new JButton(fifthRow[i]); 
      b.setPreferredSize(new Dimension(400,10)); 
      b.setBounds(10, 10, 600, 100); 
      fifth[i]=b; 
      //add empty panels for layout 
      p.add(new JPanel());p.add(new JPanel());p.add(new JPanel());p.add(new JPanel());p.add(new JPanel());p.add(new JPanel());p.add(new JPanel());p.add(new JPanel()); 
     } 
     else 
     { 
      fifth[i]=new JButton(fifthRow[i]); 
     } 
     if(i==0) //first black panel 
     { 
      //place a black panel at first 
       JPanel spacePanel = new JPanel(); 
       p.add(spacePanel); 
     } 

     p.add(fifth[i]); 

    } 
    jpKeyboard.add(p); 
    /*add listeners */ 
    getContentPane().addKeyListener(this); 
    text.addKeyListener(this); 
    /*add listeners to all the button */ 
    for(JButton b : first) 
     b.addKeyListener(this); 

    for(JButton b : second) 
     b.addKeyListener(this); 
    for(JButton b : third) 
     b.addKeyListener(this); 

    for(JButton b : fourth) 
     b.addKeyListener(this); 

    for(JButton b : fifth) 
     b.addKeyListener(this); 

    } //end of initWidgets 
}//end of class 

以上是非常簡單的代碼,但給我下面的佈局:

enter image description here

問題描述

對於鍵盤的最後一行,我只好把空Jpanels爲 間距和我一點都不能夠調整的空間按鈕。它應該跨3個常規按鈕跨越。請給你的 valualbe建議。

+0

你不指望我會讀這一切,你呢? – Mordechai

+0

我相信那裏的人肯定會讀。 – Burfi

+0

好吧,發佈一個[SSCCE](http://sscce.org),以獲得更好更快的答案。 – Mordechai

回答

3

閱讀javax.swing.Box.Filler類,爲間距,或簡單地創建一個方式,通過使Box

+0

感謝您的建議。關於如何調整空格按鈕的任何想法? – Burfi

2

靜態create...方法之一,這將是一個非常快速和骯髒實現,如果窗口心不是可調整大小。

但添加這麼多面板只是爲了獲得空間不是我稱之爲偉大的編碼。如果遇到更多佈局問題,我會建議您查看關於LayoutManager的各種教程。

for(int i = 0; i < fifthRow.length; ++i) 
{ 
    if(i==0) //space bar panel 
    { 
     JButton b = new JButton(fifthRow[i]); 
     fifth[i]=b; 
     //add empty panels for layout 
     p.add(new JPanel());p.add(new JPanel());p.add(new JPanel());p.add(new JPanel());p.add(new JPanel());p.add(new JPanel());p.add(new JPanel());p.add(new JPanel()); 
     Container glassPane = (Container) getRootPane().getGlassPane(); 
     glassPane.setVisible(true); 
     glassPane.setLayout(new GridBagLayout()); 
     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.weightx = 1.0; 
     gbc.weighty = 1.0; 
     gbc.fill = GridBagConstraints.NONE; 
     gbc.insets = new Insets(getBounds().y-350, 180, 0, 20); 
     gbc.anchor = GridBagConstraints.SOUTHWEST; 
     b.setPreferredSize(new Dimension(450,50)); 
     glassPane.add(fifth[i], gbc); 
    } 
    else 
    { 
     fifth[i]=new JButton(fifthRow[i]); 
     p.add(fifth[i]); 
    } 
    if(i==0) //first black panel 
    { 
     //place a black panel at first 
      JPanel spacePanel = new JPanel(); 
      p.add(spacePanel); 
    } 



}