2016-11-06 167 views
-1

我試圖將JScrollPane添加到我的大JTextArea中,但是無論何時包含JScrollPane代碼,我的整個JTextArea都會消失。將JScrollPane添加到JPanel中的JTextArea

public myGUI() { 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setBounds(100, 100, 1174, 656); 
    contentPane = new JPanel(); 
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
    setContentPane(contentPane); 
    contentPane.setLayout(null); 
    contentPane.setVisible(true); 

    JTextArea textArea_1 = new JTextArea(); 
    textArea_1.setBounds(203, 5, 869, 440); 
    textArea_1.setEditable(true); 
    textArea_1.setVisible(true); 
    contentPane.add(textArea_1); 

    JScrollPane scroll = new JScrollPane (textArea_1); 
    scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
    scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 
    contentPane.add(scroll); 

}

回答

6

的幾個問題與您的代碼:

  • 你試圖添加一個組件,在這裏你的JTextArea叫textArea_1,多個集裝箱,這裏的contentPane 的JScrollPane中。 Swing中不能這樣做,因爲組件只能添加到一個組件中。將它僅添加到JScrollPane而不添加到contentPane,然後將滾動窗格添加到GUI。
  • 您通過setBounds約束了您的JTextArea的大小,這幾乎可以保證JScrollPane不會工作,因爲這樣做會阻止JTextArea在保存比顯示的文本更多的文本時展開。相反,請設置JScrollPane的行和列屬性,而不是其邊界。這將是它應該在滾動窗格中顯示的行和列的數量
  • 您正在使用空佈局但未指定JScrollPane的大小,因此它默認大小爲[0,0] - 這就是爲什麼你的JTextArea消失。空佈局需要完整規定所有組件的大小和位置。
  • 您正在使用空白布局來設置您的GUI。雖然Swing的新手可能看起來像是創建複雜GUI的最簡單也是最好的方式,但更多Swing GUI的創建使用它們時會遇到更嚴重的困難。它們不會在GUI大小調整時調整組件的大小,它們是增強或維護的皇室女巫,當它們放在滾動窗格中時它們會完全失敗,在所有平臺或屏幕分辨率與原始視圖不同時,它們看起來會非常糟糕。

例如:

import java.awt.BorderLayout; 
import java.awt.Font; 
import java.awt.GridLayout; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class MyGuiPanel extends JPanel { 
    // some row and column values for our JTextArea 
    private static final int TXT_AREA_ROWS = 25; 
    private static final int TXT_AREA_COLS = 80; 

    // create the JTextArea, passing in the rows and columns values 
    private JTextArea textArea = new JTextArea(TXT_AREA_ROWS, TXT_AREA_COLS); 

    public MyGuiPanel() { 
     // create the JScrollPane, adding our JTextArea 
     JScrollPane scroll = new JScrollPane(textArea); 
     scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
     scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 

     // lets add some buttons to the bottom of the GUI just for fun 
     JPanel buttonPanel = new JPanel(new GridLayout(1, 0, 5, 0)); 
     buttonPanel.add(new JButton("Save")); 
     buttonPanel.add(new JButton("Open")); 
     buttonPanel.add(new JButton("Delete")); 
     buttonPanel.add(new JButton("Exit")); 

     // let's add a title to the top: 
     JLabel title = new JLabel("This is my Applications's Title", SwingConstants.CENTER); 
     title.setFont(title.getFont().deriveFont(Font.BOLD, 24)); // and make 
                    // the text 
                    // *BIG* 

     // use a BorderLayout for our GUI 
     setLayout(new BorderLayout(5, 5)); 
     setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 
     add(scroll, BorderLayout.CENTER); // add the scrollpane to the center 
     add(buttonPanel, BorderLayout.PAGE_END); // the button panel to the 
               // bottom 
     add(title, BorderLayout.PAGE_START); // and the title JLabel to the top 
    } 

    private static void createAndShowGui() { 
     // create our GUI JPanel 
     MyGuiPanel mainPanel = new MyGuiPanel(); 

     // create a JFrame to add it to 
     JFrame frame = new JFrame("My GUI"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); // add the GUI to the JFrame 
     frame.pack(); // tell the layout managers to do their work 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); // display the GUI 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 

另外,如果你的程序擴展的JFrame,明白你是畫自己在一個角落裏做這個,迫使你創建和顯示JFrames時往往更多靈活性呼籲。事實上,我敢打賭,我已經創建了大多數Swing GUI代碼,而且我已經看到了而不是擴展了JFrame,事實上很少有人會想要這樣做。更常見的是,您的GUI類將專門用於創建JPanel,然後可將其放置到JFrame或JDialogs或JTabbedPanes中,或在需要時通過CardLayouts進行交換。這將大大增加您的GUI編碼的靈活性。

2

您不需要爲您的JTextArea設置setBounds。由於您使用的是空佈局,並且JScrollPane沒有邊界,因此不會顯示任何內容。你的JTextArea也被添加到兩個會導致一些問題的地方。我會建議任何波動layout managers。作爲使用BorderLayout的一個例子,它是最簡單的管理者之一:

public mygui() { 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setVisible(true); 
    setSize(700, 500); 
    setLayout(new BorderLayout()); 

    JTextArea textArea_1 = new JTextArea(); 
    textArea_1.setEditable(true); 

    JScrollPane scroll = new JScrollPane(textArea_1); 
    scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
    scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 

    add(scroll, BorderLayout.CENTER); 
}