2011-04-07 51 views
4

我想顯示一個JScrollPane內一個JTextArea,但我只是得到一個空框,當我跑我的(簡化)程序:爲什麼我的JScrollPane在使用空的LayoutManager時顯示JTextArea?

import java.awt.Container; 
import java.awt.Dimension;  
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 

public class ScrollPaneTest extends JFrame { 
    private Container myCP; 
    private JTextArea resultsTA; 
    private JScrollPane scrollPane; 

    public ScrollPaneTest() { 
     setSize(500, 500); 
     setLocation(100, 100); 
     myCP = this.getContentPane(); 
     myCP.setLayout(null); 

     resultsTA = new JTextArea("Blah blah"); 
     scrollPane = new JScrollPane(resultsTA, 
       JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, 
       JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 
     scrollPane.setPreferredSize(new Dimension(200, 100)); 
     scrollPane.setLocation(100, 300); 
     myCP.add(scrollPane); 

     setVisible(true); 
     addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent e) { 
       System.exit(0); 
      } 
     }); 
    } 

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

我使用空佈局管理要與課本我的一致從教學到教學。

+3

如果你的教科書上的空LayoutManager的堅持往往比教手動定位和上漿一次(和由顯示胡赫多的工作是,當你遇到:-)扔到垃圾桶 - 這是無用的; - )所謂的零布局是一個不容否認的方式 – kleopatra 2011-04-07 07:53:57

+0

這本教材是由我的部門的高級成員和好朋友。 :-)我只是一次爲她講授課程。 – 2011-04-07 13:50:15

回答

7

這將工作:

public class ScrollPaneTest extends JFrame { 
    private Container myCP; 
    private JTextArea resultsTA; 
    private JScrollPane scrollPane; 

    public ScrollPaneTest() { 
     setSize(500, 500); 
     setLocation(100, 100); 
     myCP = this.getContentPane(); 
     myCP.setLayout(null); 

     resultsTA = new JTextArea("Blah blah"); 
     resultsTA.setBounds(10, 10, 150, 30); 

     scrollPane = new JScrollPane(resultsTA,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 
     scrollPane.setPreferredSize(new Dimension(200, 100)); 
     scrollPane.setBounds(0, 0, 500, 500); 

     myCP.add(scrollPane); 
     setVisible(true); 
     addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent e) { 
       System.exit(0); 
      } 
     }); 
    } 

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

如果使用空佈局,那麼你必須指定範圍。


編輯

setBounds()方法coveres setLocation()法的任務。

例如,setBounds(x,y,w,h);

第一2將設置該組件的x/y位置相對於它的容器中。 秒2(w/h)將設置該組件的大小。

換句話說: -

  1. 的setBounds(INT的x,INT Y,INT witdh,INT高度) - 設置組件的大小和位置
  2. setLocation(INT的x,int y)對 - 設置組件的位置
+0

問題是你需要指定textarea的大小和界限,不僅如上所述,對於scrollpane。 – 2011-04-07 05:47:08

+0

非常感謝! – 2011-04-07 05:55:42

+0

您隨時歡迎。 – 2011-04-07 05:57:10

1

我必須同意kleopatra對此的評論。

下面是使用佈局的Harry Joy代碼的一個變體。它出現在屏幕上幾乎與原始GUI大小相同,但可調整大小。它也可以很容易地適應不同的PLAF,默認的字體大小等(儘管它可能會在屏幕上顯示不同的大小),而具有null佈局的東西則不會。

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

public class ScrollPaneTest extends JFrame { 
    private Container myCP; 
    private JTextArea resultsTA; 
    private JScrollPane scrollPane; 

    public ScrollPaneTest() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocation(100, 100); 
     myCP = this.getContentPane(); 

     resultsTA = new JTextArea("Blah blah", 28, 43); 

     scrollPane = new JScrollPane(resultsTA,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 

     myCP.add(scrollPane); 
     setVisible(true); 
     pack(); 
    } 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 
      public void run() { 
       new ScrollPaneTest(); 
      } 
     }; 
     SwingUtilities.invokeLater(r); 
    } 
} 
+0

我不知道setDefaultCloseOperation()或pack(),這兩個對我來說都是非常有用的。謝謝。 – 2011-04-09 15:09:21

相關問題