2011-08-23 90 views
1
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class Gui extends JFrame 
{ 
    private JFrame window = new JFrame(); 
    private JButton but[] = new JButton[9]; 

    public Gui() 
    { 
     window.setSize(300,400); 
     window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     window.setLayout(new GridLayout(4, 3)); 

     JLabel txt = new JLabel("Will you dare?", JLabel.CENTER); 
     txt.setLayout(new GridLayout(1, 1)); 
     txt.setHorizontalTextPosition(JLabel.CENTER); 
     txt.setFont(new Font("Serif", Font.PLAIN, 21)); 
     window.add(txt); 

     for(int i = 0; i < 9; i++) 
     { 
      but[i] = new JButton(); 
      window.add(but[i]); 
     } 

     window.setVisible(true); 

    } 

    public void actionPerformed(ActionEvent e) 
    { 

    } 

} 

我是爪哇noob,所以,你能告訴我,爲什麼「你敢」文本不出現在一行?你能告訴我你是如何找到解決方案的,所以其他時間我也可以自己做。JLabel,GridLayout

+1

似乎在一行中對我來說http://i.imgur.com/JD4LZ.png –

+1

您可能希望張貼你有什麼圖片,因爲它應該在一行。 –

回答

2

胡亂猜測這裏,但我想你想要的東西,如:

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

public class Gui extends JFrame 
{ 
    private JFrame window = new JFrame(); 
    private JButton but[] = new JButton[9]; 

    public Gui() 
    { 
     window.setSize(300,400); 
     window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
//  window.setLayout(new GridLayout(4, 3)); 
     JPanel panel = new JPanel(new GridLayout(3, 3)); 
     window.add(panel, BorderLayout.CENTER); 

     JLabel txt = new JLabel("Will you dare?", JLabel.CENTER); 
//  txt.setLayout(new GridLayout(1, 1)); 
     txt.setHorizontalTextPosition(JLabel.CENTER); 
     txt.setFont(new Font("Serif", Font.PLAIN, 21)); 
//  window.add(txt); 
     window.add(txt, BorderLayout.NORTH); 

     for(int i = 0; i < 9; i++) 
     { 
      but[i] = new JButton(); 
//   window.add(but[i]); 
      panel.add(but[i]); 
     } 

     window.setVisible(true); 

    } 

    public static void main(String args[]) throws Exception 
    { 
     new Gui(); 
    } 

} 
2

有兩點需要說明在您的代碼:您使用以下表達式來添加組件

window.add(txt); 
//.... 
window.add(but[i]); 

兩個呼叫的快捷方式到

window.getContentPane().add 

和內容窗格默認情況下,JFrame具有BorderLayout。並且默認情況下,如果添加時未指定其他區域/約束,則此佈局將在中心區域添加組件。所以你只需將組件放在另一個之上,只剩下最後一個。

你應該「削減」(不好的翻譯,切片?)更多的GUI,添加你的JLabel在中心,然後在南部添加另一個JPanel,並在其內部使用流佈局並添加按鈕。

Here is a good start使用我提到的佈局,這是非常標準的。

另外您使用JLabel作爲容器。幾乎所有的擺動組件都從java.awt.Container繼承,這是由swing用於提供複合組件,但實際上,你不應該將它們用作容器,即不要將其他組件放在裏面或給它們佈局。你這樣做,給它一個佈局線

txt.setLayout(new GridLayout(1, 1)); 

所以刪除此行。使用swing組件和JPanel(或JTabbedPane等)作爲容器。

Regards, Stéphane btw,從來沒有硬編碼值,使用常量。不是9,而是BUTTON_COUNT = 9靜態成員。 你可以考慮購買一本java書。我曾經向我的學生推薦Deitel和Deitel。

1

問題這裏很簡單:您要添加的佈局到標籤名爲「txt」。

您是說標籤「txt」應該佔據JFrame的第一行,第一列。第一行,第一列將導致一個框。當你創建一個這樣的盒子時,你需要確保盒子足夠寬,以便你的文本完全適合一行。在這種情況下,您的文本只是跳到下一行,因爲您爲整個標籤創建的「框」中沒有足夠的空間以適合一行。

修復的問題:

  • 刪除此行:txt.setLayout(new GridLayout(1, 1));

OR

  • 更改以下行:txt.setLayout(new GridLayout(1, 1));txt.setLayout(new GridLayout(1,2));

你有,我注意到另外一個問題:

  • 以下行應該走在上面,private JButton but[] = new JButton[9];下:JLabel txt = new JLabel("Will you dare?");//Removing the 'JLabel.CENTER'

應該這樣做(我不我想我錯過了什麼)。 :)