gpt4 book ai didi

java - 代码拒绝在 JTextArea 中显示文本

转载 作者:行者123 更新时间:2023-12-01 22:42:12 26 4
gpt4 key购买 nike

我创建了一个 JTextArea,以便在程序运行时以多种颜色显示消息。我使用 NetBeans 8.0,并在编写代码之前向 jFrame 添加了一个名为“log”的 JTextArea。

首先,我定义了一个名为 apppane 的类:

private void apppane(JTextPane log, String msg, Color c)
{
/*This allows multi-colour inside the logging pane*/
StyleContext sc = StyleContext.getDefaultStyleContext();
AttributeSet aset = sc.addAttribute(SimpleAttributeSet.EMPTY, StyleConstants.Foreground, c);

aset = sc.addAttribute(aset, StyleConstants.FontFamily, "Lucida Console");
aset = sc.addAttribute(aset, StyleConstants.Alignment, StyleConstants.ALIGN_JUSTIFIED);

int len = log.getDocument().getLength();
log.setCaretPosition(len);
log.setCharacterAttributes(aset, false);
log.replaceSelection(msg);
}

接下来,我编写了代码来以颜色显示文本:

/*time1 gets the current system time and it works perfectly, no errors there*/
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
Thread t1;
FTPClient cli=new FTPClient();
FTPClientConfig conf=new FTPClientConfig();
boolean err=false;

try{
String ServAddress="195.191.24.202";
int reply;
TimeNow time1=new TimeNow();
apppane(log,time1.whatsthetime()+": Connecting to "+ServAddress+"\n",Color.RED);
System.out.println(time1.whatsthetime()+": Connecting to "+ServAddress+"\n");
cli.connect(ServAddress);
cli.configure(conf);
TimeNow time2=new TimeNow();
apppane(log,time2.whatsthetime()+": Connected to "+ServAddress,Color.BLUE);
System.out.println(time2.whatsthetime()+": Connected to "+ServAddress+"\n");
System.out.println(time2.whatsthetime()+": "+cli.getReplyString());
reply=cli.getReplyCode();
if(!FTPReply.isPositiveCompletion(reply)){
cli.disconnect();
TimeNow time3=new TimeNow();
apppane(log,time3.whatsthetime()+": Connection rejected. \n", Color.RED);
System.out.println(time3.whatsthetime()+": Connectiion failed \n");
}
log.setText(ServAddress);
}
catch (Exception e){
e.printStackTrace();
}
}

但是,JTextPane 中没有出现任何文本。请帮忙!

怀疑:我是否定义了一个新的 JTextPane,而我却没有定义?

更新 1:这是 NetBeans 生成的 Swing GUI 代码:

private void initComponents() {

dochello = new javax.swing.JLabel();
jButton1 = new javax.swing.JButton();
jScrollPane2 = new javax.swing.JScrollPane();
log = new javax.swing.JTextPane();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("MayvilFTP");
getContentPane().setLayout(null);

dochello.setFont(new java.awt.Font("Tahoma", 0, 24)); // NOI18N
dochello.setText("Welcome, Dr. ");
getContentPane().add(dochello);
dochello.setBounds(10, 30, 350, 30);

jButton1.setText("Connect");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
getContentPane().add(jButton1);
jButton1.setBounds(370, 30, 110, 23);

log.setEditable(false);
log.setOpaque(false);
jScrollPane2.setViewportView(log);

getContentPane().add(jScrollPane2);
jScrollPane2.setBounds(10, 230, 480, 110);

pack();
}// </editor-fold>

最佳答案

在整个 jButton1ActionPerformed 方法返回之前,您的文本不会显示。

您的代码正在 Swing 事件线程中运行。这是同一个线程,它将实际执行组件的绘制...并处理所有其他事件。因此,当 FTP 正在进行时,您的 GUI 基本上会被卡住。

如果您执行的操作需要一些时间,则应该在新线程中启动该操作。您不应在按钮按下事件中执行 FTP 操作。

您创建了一个变量Thread t1但从未使用它。为什么不在这个线程中执行 FTP,并在适当的时候使用 java.awt.EventQueue.invokeLater 调用 apppane 呢?

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
Thread t1 = new Thread(new Runnable() { public void run(){
apppane_threadsafe( ... );
// do your ftp stuff
apppane_threadsafe( ... );
}});
t1.start();
}

private void apppane_threadsafe(JTextPane log, String msg, Color c){
EventQueue.invokeLater(new Runnable() { public void run() {
apppane(log, msg, c);
}
}}

关于java - 代码拒绝在 JTextArea 中显示文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25976055/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com