2014-01-07 107 views
1

我想添加到窗口從x,y位置JTextArea與滾動。 問題是,當我做可視化代碼時,它確實填充了500x500窗口,我希望在x,y pos只填充200x200的完整值。GUI JTextArea&JScrollPane&定位

我在做什麼錯?這裏是我的代碼:

public static void main(String args[]) 
{ 
    JFrame window = new JFrame(); 
    window.setSize(500, 500); 
    window.setResizable(false); 

    JTextArea ta = new JTextArea("Default message"); 
    ta.setEditable(true); 

    JScrollPane scroll = new JScrollPane(ta); 
    scroll.setBounds(10,10,200,200); 
    window.add(scroll); 

    window.setVisible(true); 
} 
+0

@AndrewThompson,對於一個強大的圖形用戶界面,最合理的舉動是使用佈局管理器? Arent還有其他的選擇嗎? – user1768615

回答

3

Padded Text Area

import java.awt.*; 
import javax.swing.*; 
import javax.swing.border.EmptyBorder; 

public class PaddedTextArea { 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 
      @Override 
      public void run() { 
       // the GUI as seen by the user (without frame) 
       JPanel gui = new JPanel(new BorderLayout()); 
       // adjust as needed 
       gui.setBorder(new EmptyBorder(20,10,20,10)); 

       // better way to size a text area is using columns/rows 
       // in the constructor 
       JTextArea ta = new JTextArea(3,40); 
       JScrollPane sp = new JScrollPane(ta); 
       gui.add(sp); 

       JFrame f = new JFrame("Padded Text Area"); 
       f.add(gui); 
       // Ensures JVM closes after frame(s) closed and 
       // all non-daemon threads are finished 
       f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       // See https://stackoverflow.com/a/7143398/418556 for demo. 
       f.setLocationByPlatform(true); 

       // ensures the frame is the minimum size it needs to be 
       // in order display the components within it 
       f.pack(); 
       // should be done last, to avoid flickering, moving, 
       // resizing artifacts. 
       f.setVisible(true); 
      } 
     }; 
     // Swing GUIs should be created and updated on the EDT 
     // http://docs.oracle.com/javase/tutorial/uiswing/concurrency 
     SwingUtilities.invokeLater(r); 
    } 
} 

更普遍的:Java的圖形用戶界面可能需要在多個平臺上工作,使用不同PLAFs不同的屏幕分辨率&。因此,它們不利於組件的準確放置。要爲可靠的GUI組織組件,請改爲使用佈局管理器或combinations of them 以及佈局填充&邊框爲white space

4

不要使用setBounds()來設置組件的大小。 Swing使用佈局管理器來調整組件大小。

默認情況下,JFrame使用BorderLayout,並將組件添加到CENTER,以便組件佔用所有可用空間。

而是做這樣的事情:

JTextArea text Area = new JTextArea(5, 40); 
JScrollPane scrollPane = new JScrollPane(textArea); 
frame.add(scrollPane, BorderLayout.NORTH); 
frame.pack(); 
frame.setVisible(); 

當您顯示幀文本區域將佔據整個空間,但如果調整框架更大然後文本區域將只顯示在北部和CENTER會有空的空間。

+2

還可以考慮利用'EmptyBorder'來影響組件的位置和大小 – MadProgrammer