[英]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.