2012-12-26 37 views
4

我對在文本字段和文本區域(Java Swing)上定位組件和一些問題有一些疑問。任何幫助是極大的讚賞。在Swing GUI中定位組件

現在我正試圖讓兩個文本字段彼此相鄰,每個上面有不同的標籤來描述文本字段的作用。爲了達到這個目的,我把它們放在了GridLayout(2, 2)

  1. 這是最好的方法嗎?這是我知道有一個標籤直接在另一個組件上的唯一途徑。有沒有更好的辦法?如果一個按鈕上方只有一個標籤,那麼怎麼辦?通過GridLayout(2, 1)這個位置是否明智?我是視力受損的,所以我不認爲只是按照它們的像素位置來定位按鈕是一種選擇,除非有一種簡單的方法來將組件的相對像素數放置到另一個組件上。

  2. 這引導我到我的下一個問題。 什麼是最好的方式來具有上述相同的用戶界面,但與另一個組件(按鈕)集中在它下面。本質上,用戶界面應由兩個帶有計算按鈕的命名文本字段組成。我這樣做的方法是將上述組件放在一個面板中,然後將計算按鈕加到周圍的面板上,並使用GridLayout(2, 1)。問題是,按鈕變得像它上面的面板一樣大(我假設)。我怎樣才能調整這個,並仍然有按鈕在文本字段/標籤面板下完美對齊?與文本區域上方的標籤類似。標籤應該很小,但在文本區域的空間較大。

  3. (text field): 再次提到上面的用戶界面,如果用戶在第一個文本字段中鍵入了很多字符,字母是否會越過右側的文本字段?如果是這樣,我該如何防止呢?

  4. 如果我將文本追加到文本區域並且它已經滿了,它會自動允許用戶滾動嗎?如果不是什麼是使文本區域可滾動的簡單方法?

  5. 現在我不設置文本區域的大小。它是否隨我添加文字而增長?它是否具有與字符數量一樣的默認大小?

+3

所有這些問題都在Swing教程中解答。請參閱http://docs.oracle.com/javase/tutorial/uiswing/layout/index.html和http://docs.oracle.com/javase/tutorial/uiswing/components/textarea.html。 –

回答

9

還有一些佈局管理器那可能能夠爲你提供你所需要的東西。

因爲,GridBagLayout將是我的選擇(我有偏見,因爲我已經使用這個佈局管理器在過去12年一直是;) )

enter image description here

public class TestLayout17 { 

    public static void main(String[] args) { 
     new TestLayout17(); 
    } 

    public TestLayout17() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
      setLayout(new GridBagLayout()); 
      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridx = 0; 
      gbc.gridy = 0; 
      gbc.insets = new Insets(2, 2, 2, 2); 

      add(new JLabel("Label 1"), gbc); 
      gbc.gridx++; 
      add(new JLabel("Label 2"), gbc); 

      gbc.gridx = 0; 
      gbc.gridy++; 
      gbc.fill = GridBagConstraints.HORIZONTAL; 
      add(new JTextField(10), gbc); 
      gbc.gridx++; 
      add(new JTextField(10), gbc); 

      gbc.gridx = 0; 
      gbc.gridy++; 
      gbc.fill = GridBagConstraints.NONE; 
      gbc.gridwidth = 2; 
      add(new JButton("Click"), gbc); 

     } 

    } 

} 

我也用複合容器,使你的生活,從長遠來看

容易的Eng.Fouad的建議,同意你可能會發現Laying Out Components Within a Container而讀一個值得。

+0

這些都很棒。非常感謝!那麼文本字段呢?它們會重疊嗎?他們會自動添加滾動 –

+0

感謝這些佈局看起來非常有用!那麼textfields呢?它們會重疊嗎?他們會自動添加滾動 –

+0

不,他們不會重疊,他們應該一直呆在那裏牢房。 JTextField默認提供水平滾動,對於垂直滾動,你將需要一個JTextArea(或者等價的)和一個JScollPane – MadProgrammer

7

現在我想擁有對方旁邊的兩個文本字段與上述各描述該文本框做什麼 不同的標籤。到 實現這個我已經把他們放在一個GridLayout(2,2)。這是 最好的方法嗎?這是我知道的只有在另一個組件上直接標註標籤的唯一方法。有沒有更好的辦法?如果只有一個按鈕上方有一個標籤 ,怎麼辦?通過一個 GridLayout(2,1)來定位它是否明智?

我自己,我總是通過嵌套面板與BorderLayout做到這一點。例如:

enter image description here

JFrame frame = new JFrame("The Title"); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

JPanel panOuter = new JPanel(new BorderLayout()); 
JPanel panLeft = new JPanel(new BorderLayout()); 
panLeft.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 
JPanel panRight = new JPanel(new BorderLayout()); 
panRight.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 

panOuter.add(panLeft, BorderLayout.WEST); 
panOuter.add(panRight, BorderLayout.EAST); 

JLabel lblLeft = new JLabel("Label 1", JLabel.CENTER); 
JLabel lblRight = new JLabel("Label 2", JLabel.CENTER); 

JTextField txtLeft = new JTextField(10); 
JTextField txtLright = new JTextField(10); 

panLeft.add(lblLeft, BorderLayout.NORTH); 
panLeft.add(txtLeft, BorderLayout.CENTER); 

panRight.add(lblRight, BorderLayout.NORTH); 
panRight.add(txtLright, BorderLayout.CENTER); 

frame.setContentPane(panOuter); 
frame.pack(); 
frame.setVisible(true); 

需要注意的是,你可以操縱的部件之間的間隙與設置空邊界。此外,您可以使用BorderLayout.LINE_STARTBorderLayout.LINE_END而不是使用BorderLayout.WESTBorderLayout.EAST,這將增加對RTL語言(例如阿拉伯語)的支持。


這使我對我的下一個問題。 與上面相同的用戶界面的最佳方式是什麼,但是其中的另一個組件(按鈕)居中。 本質上,用戶界面應由兩個帶有 計算按鈕的命名文本字段組成。我這樣做的方法是將上述 組件放在一個面板中,然後將計算按鈕加上帶有GridLayout(2,1)的 周圍面板。問題是, 按鈕變得像它上面的面板一樣大(我假設)。我怎樣才能調整這個,並仍然在 的textfields/labels面板下完全對齊按鈕?

我會通過嵌套面板做到這一點,因爲我先前做的,但現在的底部面板上有一個FlowLayout佈局管理器以獲取按鈕大小適中:

enter image description here

JFrame frame = new JFrame("The Title"); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

JPanel panOuter = new JPanel(new BorderLayout()); 
JPanel panLeft = new JPanel(new BorderLayout()); 
panLeft.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 
JPanel panRight = new JPanel(new BorderLayout()); 
panRight.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 
JPanel panBottom = new JPanel(); // default is FlowLayout 
panBottom.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 

panOuter.add(panLeft, BorderLayout.WEST); 
panOuter.add(panRight, BorderLayout.EAST); 
panOuter.add(panBottom, BorderLayout.SOUTH); 

JLabel lblLeft = new JLabel("Label 1", JLabel.CENTER); 
JLabel lblRight = new JLabel("Label 2", JLabel.CENTER); 

JTextField txtLeft = new JTextField(10); 
JTextField txtLright = new JTextField(10); 

JButton btnBottom = new JButton("Press it!"); 

panLeft.add(lblLeft, BorderLayout.NORTH); 
panLeft.add(txtLeft, BorderLayout.CENTER); 

panRight.add(lblRight, BorderLayout.NORTH); 
panRight.add(txtLright, BorderLayout.CENTER); 

panBottom.add(btnBottom); 

frame.setContentPane(panOuter); 
frame.pack(); 
frame.setVisible(true); 

與文本區域上方的標籤類似。標籤應該很小,但是 對於文本區域有較大的空間。

我會建議你使用TitledBorder

enter image description here

JFrame frame = new JFrame("The Title"); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

JPanel panOuter = new JPanel(new BorderLayout()); 
JPanel panLeft = new JPanel(new BorderLayout()); 
panLeft.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 
JPanel panRight = new JPanel(new BorderLayout()); 
panRight.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 
JPanel panBottom = new JPanel(); // default is FlowLayout 
panBottom.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 

JPanel panInput = new JPanel(new BorderLayout()); 
panInput.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 
JPanel panConsole = new JPanel(new BorderLayout()); 

Border outsideBorder = BorderFactory.createEmptyBorder(5, 5, 5, 5); 
Border insideBorder = BorderFactory.createTitledBorder("The Console"); 
Border theBorder = BorderFactory.createCompoundBorder(outsideBorder, insideBorder); 
panConsole.setBorder(theBorder); 

panInput.add(panLeft, BorderLayout.WEST); 
panInput.add(panRight, BorderLayout.EAST); 
panInput.add(panBottom, BorderLayout.SOUTH); 

panOuter.add(panInput, BorderLayout.NORTH); 
panOuter.add(panConsole, BorderLayout.CENTER); 

JLabel lblLeft = new JLabel("Label 1", JLabel.CENTER); 
JLabel lblRight = new JLabel("Label 2", JLabel.CENTER); 

JTextField txtLeft = new JTextField(10); 
JTextField txtLright = new JTextField(10); 

JButton btnBottom = new JButton("Press it!"); 

JTextArea txtConsole = new JTextArea(5, 10); 

panLeft.add(lblLeft, BorderLayout.NORTH); 
panLeft.add(txtLeft, BorderLayout.CENTER); 

panRight.add(lblRight, BorderLayout.NORTH); 
panRight.add(txtLright, BorderLayout.CENTER); 

panBottom.add(btnBottom); 

panConsole.add(txtConsole, BorderLayout.CENTER); 

frame.setContentPane(panOuter); 
frame.pack(); 
frame.setVisible(true); 

第三(文本字段):再次提及UI上面,如果用戶鍵入 許多字符放到第一個文本字段中,將這些字母放在 右邊的文本字段中?如果是的話,我怎麼能阻止呢?

試試上面的代碼,看看它是如何作用:)


第四:如果我追加文本到文本區域,它是已經滿了,會 自動允許用戶滾動?如果不是什麼簡單的方法 使文本區域可滾動?

您需要使用一種叫做JScrollPane

enter image description here

JFrame frame = new JFrame("The Title"); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

JPanel panOuter = new JPanel(new BorderLayout()); 
JPanel panLeft = new JPanel(new BorderLayout()); 
panLeft.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 
JPanel panRight = new JPanel(new BorderLayout()); 
panRight.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 
JPanel panBottom = new JPanel(); // default is FlowLayout 
panBottom.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 

JPanel panInput = new JPanel(new BorderLayout()); 
panInput.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 
JPanel panConsole = new JPanel(new BorderLayout()); 

Border outsideBorder = BorderFactory.createEmptyBorder(5, 5, 5, 5); 
Border insideBorder = BorderFactory.createTitledBorder("The Console"); 
Border theBorder = BorderFactory.createCompoundBorder(outsideBorder, insideBorder); 
panConsole.setBorder(theBorder); 

panInput.add(panLeft, BorderLayout.WEST); 
panInput.add(panRight, BorderLayout.EAST); 
panInput.add(panBottom, BorderLayout.SOUTH); 

panOuter.add(panInput, BorderLayout.NORTH); 
panOuter.add(panConsole, BorderLayout.CENTER); 

JLabel lblLeft = new JLabel("Label 1", JLabel.CENTER); 
JLabel lblRight = new JLabel("Label 2", JLabel.CENTER); 

JTextField txtLeft = new JTextField(10); 
JTextField txtLright = new JTextField(10); 

JButton btnBottom = new JButton("Press it!"); 

JTextArea txtConsole = new JTextArea(5, 10); 

JScrollPane srcPane = new JScrollPane(txtConsole, 
      JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, 
      JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 

panLeft.add(lblLeft, BorderLayout.NORTH); 
panLeft.add(txtLeft, BorderLayout.CENTER); 

panRight.add(lblRight, BorderLayout.NORTH); 
panRight.add(txtLright, BorderLayout.CENTER); 

panBottom.add(btnBottom); 

panConsole.add(srcPane, BorderLayout.CENTER); 

frame.setContentPane(panOuter); 
frame.pack(); 
frame.setVisible(true); 

希望我回答你所有的問題:)

+0

謝謝。我已經使用java,但不是東西的擺動面,所以這些都非常有用。 –