2011-05-04 54 views
0

所以我有一個簡單的GUI,只能打開文本文件,並且應該只顯示它​​們在要編輯的文本區域中。我知道我的字符串包含文件內容,因爲我可以打印出來,但是當我嘗試將其添加到我的文本區域時,它不會顯示出來。我想知道這是否是一個重疊文本區域的問題,但我似乎無法找到錯誤。Java GUI在打開時不顯示我的文件

我的代碼的第一部分只是創建GUI。另一部分應該打開一個文件並用它填充文本區域。問題究竟在哪裏,我該如何解決?任何幫助,將不勝感激。

這裏是我的代碼部分,它與創建框架和麪板特惠:

public class MenuView extends JFrame { 
    private JPanel centerPanel; 
    private JPanel bottomPanel; 
    private JMenuBar menuBar; 
    private JMenu fileMenu; 
    private JMenuItem openItem; 
    private JMenuItem closeItem; 
    private JButton setButton; 
    private JTextField text; 
    private JTextArea label; 
    private JMenuItem fileNew; 

    public MenuView(){ 
      super(); 
      setSize(500, 400); 
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      setLayout(new BorderLayout()); 
      setTitle("Menu Demo"); 

     //The center panel that will contain text 
     centerPanel = new JPanel(); 
     centerPanel.setLayout(new FlowLayout()); 
     label = new JTextArea(400,500); 
     centerPanel.add(label); 
     add(centerPanel, BorderLayout.CENTER); 
     //The bottom panel with the text field and button 
     bottomPanel = new JPanel(); 
     bottomPanel.setLayout(new GridLayout(1, 2)); 
     setButton = new JButton("Set Text"); 
     text = new JTextField(); 
     bottomPanel.add(setButton); 
     bottomPanel.add(text); 
     add(bottomPanel, BorderLayout.SOUTH); 

     //Setting up the menu 
     menuBar = new JMenuBar(); 
     fileMenu = new JMenu("File"); 
     fileNew = new JMenu("New"); 
     openItem = new JMenuItem("Open"); 
     closeItem = new JMenuItem("Exit"); 
     fileMenu.add(openItem); 
     fileMenu.add(closeItem); 
     fileMenu.add(fileNew); 
     menuBar.add(fileMenu); 
     setJMenuBar(menuBar); 

     setButton.addActionListener(new ButtonCommand(label, text)); 
     closeItem.addActionListener(new QuitMenuCommand()); 
     openItem.addActionListener(new OpenMenuCommand(label)); 

    } 

    public static void main(String [] args){ 
     MenuView v = new MenuView(); 
     v.setVisible(true); 
    } 
} 

下面是與打開的文件打交道的代碼:

public class OpenMenuCommand implements ActionListener { 

    private JTextArea theLabel; 
    private JFileChooser fc; 
    private String k = ""; 

    public OpenMenuCommand(JTextArea l){ 
     theLabel = l; 
     theLabel.getParent(); 
     fc = new JFileChooser(); 
     fc.setFileFilter(new FileNameExtensionFilter("Text file", "txt")); 
    } 

    public void actionPerformed(ActionEvent e) { 
     StringBuffer text = new StringBuffer(); 

     int returnValue = fc.showOpenDialog(null); 
     if(returnValue == fc.APPROVE_OPTION){ 
      theLabel.removeAll(); 
      File f = fc.getSelectedFile(); 
      try{ 
       BufferedReader inFile = new BufferedReader(new FileReader(f)); 
       String in = inFile.readLine(); 
       while(in != null){ 
        k = k + in; 
        in = inFile.readLine(); 
       } 
       System.out.println(k); 
       theLabel.setText(k); 
       inFile.close(); 
       theLabel.setVisible(true); 
      }catch(FileNotFoundException exc){ 
       //Should never trigger 
      }catch(IOException exc){ 
       theLabel.setText("Error reading in file."); 
      } 
     } 

    } 
} 
+0

有趣的一個。你可以張貼截圖嗎?另外,如果您認爲它可能與JTextFields重疊,則嘗試使用已經包含一些文本的文本字段進行初始化,僅用於測試。如果初始文本顯示出來,那麼我猜你可能沒有重疊的問題。 – jefflunt 2011-05-04 01:56:24

+0

@normalocity:它與重疊無關,而是與將大型組件(JTextArea)添加到小型FlowLayout使用容器有關。 – 2011-05-04 02:15:13

+0

這不是將數據加載到文本區域的方式。只需使用JTextArea.read(...)方法即可。它的一行代碼。無需循環邏輯。 – camickr 2011-05-04 03:11:55

回答

0

你的東西被添加到JTextArea,但你沒有看到由於JTextArea的大小。它實際上是一個受詛咒的大的JTextArea:

label = new JTextArea(400, 500); 

,並通過添加大量的JTextArea到FlowLayout中,使用JPanel的大部分是關閉屏幕。 要明白我的意思,它添加到您的actionPerformed方法:

System.out.println(theLabel.getBounds()); 

你會看到,寬度和高度是巨大的,而且更重要的是,左側是一個大的負數。

解決方案:讓您的JTextArea更合理的大小(看看這些數字意味着在API中 - 行和列,而不是點),並把它添加到JScrollPane中,然後用容器BorderLayout.CENTER添加到BorderLayout的。

例如,小GUI SSCCE顯示了使用左側的JPanel和我的JTextArea右側一個JScrollPane內您在FlowLayout中的JTextArea:

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

public class MenuViewSSCCE { 
    private static final Dimension APP_SIZE = new Dimension(500, 400); 

    private static void createAndShowUI() { 
     JTextArea label = new JTextArea(400, 500); // friggin big! 
     JTextArea label2 = new JTextArea(400, 500); // friggin big! 
     label.setText("Look at how big this JTextArea is!"); 
     label2.setText("Look at how big this JTextArea is!"); 

     JPanel centerPanel = new JPanel(); 
     centerPanel.setPreferredSize(APP_SIZE); 
     centerPanel.setLayout(new FlowLayout()); // this line is redundant 
     centerPanel.add(label); 

     JScrollPane myScrollpane = new JScrollPane(label2); 
     myScrollpane.setPreferredSize(APP_SIZE); 

     JPanel gridPanel = new JPanel(new GridLayout(1, 0)); 
     gridPanel.add(centerPanel); 
     gridPanel.add(myScrollpane); 

     JFrame frame = new JFrame("Your code on left, mine on right"); 
     frame.getContentPane().add(gridPanel, BorderLayout.CENTER); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowUI(); 
     } 
     }); 
    } 
} 
+0

非常感謝。我認爲大小應該是像素的,而不是列和行,並且因爲這麼多而感到沮喪。 – Eric 2011-05-04 02:37:12

+0

@Eric:不客氣! – 2011-05-04 02:38:58