2017-10-05 119 views
0

我想要創建一個類,在該類中可以通過調用不同的方法來創建JFrame。然而沿着我的JTextArea是迷路線...某處當通過方法構建時,JTextArea不會出現在JScrollPane中

下面是一個名爲App類持有我需要開始建立方法...

public class App { 
    private JFrame frame = new JFrame(); 
    private JTextArea textArea = new JTextArea(); 
    private JScrollPane scrollPane = new JScrollPane(); 

    public void openJFrame(String title, int x, int y){ 
     JFrame.setDefaultLookAndFeelDecorated(true); 
     frame.setTitle(title); 
     frame.setSize(x, y); 
     frame.setResizable(false); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
    public JFrame getJFrame(){ 
     return frame; 
    } 
    public void addJTextArea(JScrollPane scrollPane){ 
     scrollPane.add(textArea); 
     textArea.setLineWrap(true); 
     textArea.setEditable(true); 
     textArea.setVisible(true); 
    } 
    public JTextArea getJTextArea(){ 
     return textArea; 
    } 
    public void addJScrollPane(JFrame frame){ 
     frame.add(scrollPane); 
     scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 

    } 
    public JScrollPane getJScrollPane(){ 
     return scrollPane; 
    } 

我想打電話從這個類我的主要方法並建立一個JFrame。以下是我的嘗試。

public class Main { 
    public static void main(String[] args){ 
     App app = new App(); 

     app.addJTextArea(app.getJScrollPane()); 
     app.addJScrollPane(app.getJFrame()); 
     app.openJFrame("title", 500, 500); 
    } 

是JFrame的和滾動窗格出現什麼happense。但是我的文字區域似乎沒有被添加到滾動窗格。

我誤解或忽略了某些東西?這可能是值得一提的是,如果在addJTextArea方法我直接將它添加到JFrame中不使用它出現在JScrollPane的方法(顯然沒有滾動窗格)

回答

2

雖然JScrollPane可能看起來/ ACT /聽起來類似於JPanel,它不是。因此,使用JScrollPane.add()向滾動窗格添加組件可能聽起來很自然,但是是錯誤的。 JScrollPane只能有一個內部滾動的組件,因此add()是錯誤的,但setViewportView()是使用的方法。

你必須去適應你的方法addJTextArea使用scrollPane.setViewportView()而不是scrollPane.add()

public void addJTextArea(JScrollPane scrollPane){ 
    scrollPane.setViewportView(textArea); 
    textArea.setLineWrap(true); 
    textArea.setEditable(true); 
    textArea.setVisible(true); 
}