簡體   English   中英

使用從文件讀入的新數據更新JTextArea

[英]Updating JTextArea with new data read in from file

我有一個用戶可以鍵入狀態的搜索框,它將從文本文件中讀取有關該狀態選舉結果的數據。 但是我的JTextArea不顯示新數據。 我調試並確定數據正在正確讀取。 我已經閱讀了許多與我類似的問題,但沒有找到適用於我的特定問題的解決方案。 任何人都可以提出任何關於我應該怎么做的建議。 這是我的代碼。

    package view;

import data.VoteIO;
import business.State;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.event.*;
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;

//illustrate listening for a selection of the JList
public class Voting2000 extends JFrame implements ActionListener{

    private ResultsView votePanel;
    private Container pane;
    private JTextField search;
    private JButton goSearch;
    private JLabel instructions;

    public Voting2000() throws IOException{
        votePanel = new ResultsView(new State("Nebraska", "NE")); 
        search = new JTextField();
        goSearch = new JButton("Search");
        instructions = new JLabel("To search for a states input must be in following format State, State's abbreviate for example Nebraska, NE ");
        pane = getContentPane();
        goSearch.addActionListener(this);
        pane.setLayout(new BorderLayout());
        pane.add(BorderLayout.NORTH,instructions);
        pane.add(BorderLayout.CENTER, votePanel);
        pane.add(BorderLayout.SOUTH,search);
        pane.add(BorderLayout.EAST,goSearch);
        pack();
        setVisible(true);
    }

    public static void main(String[] args) throws IOException{
            Voting2000 listing = new Voting2000();
    }

    public void actionPerformed(ActionEvent e)
    {
        String state = search.getText().toLowerCase();
        String[] fields = state.split(",");
        try {
            State aState = new State(fields[0].trim(),fields[1].trim());;
            votePanel = new ResultsView(aState);
            pane.add(BorderLayout.CENTER,votePanel);
            pane.revalidate();
            pane.repaint();
        } catch (IOException ex) {
            Logger.getLogger(Voting2000.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

}

這是創建JTextArea的ResultsView類

package view;

import javax.swing.*;
import java.util.List;
import business.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
 *
 * @author rmildenb
 */
public class ResultsView extends JPanel{
    private JTextArea results;
    private Stats stat;


    public ResultsView(){

        createView();
    }

    public ResultsView(Stats state) {
        this.stat = state;
        createView();
    }

    public void createView(){
        results = new JTextArea(5, 35);
        JScrollPane pane = new JScrollPane(results);
        pane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        this.add(pane);
        showInformation();
    }

    public void showInformation(){
        results.setText("");
        results.setText(stat.getDescription());
        results.setCaretPosition(0);

    }



}

我試圖從容器窗格中刪除votePanel重繪它有效,但是當我嘗試添加剛剛創建的新窗格並重新繪制窗格時,沒有任何內容出現。

votePanel = new ResultsView(aState);

創建新組件不會將組件添加到GUI。 組件只是坐在內存中。

您應該擁有一個只使用新文本刷新文本區域的方法,而不是創建新的ResultsView面板。 然后文本區域將自動重新繪制。

另一種選擇要復雜得多。 代碼類似於:

panel.remove(exisiting ResultsView panel);
panel.add( new ResultsView panel );
panel.revalidate();
panel.repaint();

revalidate()是鍵,因為它調用布局管理器,因此可以正確調整所有組件的大小和位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM