Java 在程序运行时,如何显示实时、更改的文本数据?
例如,我想找到一辆车在离开无线电发射塔的特定时刻接收到的瞬时信号强度。车辆与塔的瞬时距离也将实时显示 我可以在程序运行时使用JTextArea显示信号和距离的变化值吗?下面是我想做的事情的大致思路Java 在程序运行时,如何显示实时、更改的文本数据?,java,jtextarea,worldwind,Java,Jtextarea,Worldwind,例如,我想找到一辆车在离开无线电发射塔的特定时刻接收到的瞬时信号强度。车辆与塔的瞬时距离也将实时显示 我可以在程序运行时使用JTextArea显示信号和距离的变化值吗?下面是我想做的事情的大致思路 public class Stuff { public static double calculateSignal(double d, double f) { GUI.d=Mover.instantDistance(animpos); //needs to
public class Stuff
{
public static double calculateSignal(double d, double f)
{
GUI.d=Mover.instantDistance(animpos); //needs to be displayed
double atten=20*(Math.log10(d))+20*(Math.log10(f))+32.44; //would also like to display this
return atten;
}
...
JTextArea textArea_3 = new JTextArea();
textArea_3.setEditable(false);
textArea_3.setText(GUI.d); //would have to be converted to String
textArea_3.setBounds(147, 481, 215, 32);
panel_3.add(textArea_3);
JTextArea textArea_4 = new JTextArea();
textArea_4.setEditable(false);
textArea_4.setText(atten); //would have to be converted to String
textArea_4.setBounds(147, 527, 215, 27);
panel_3.add(textArea_4);
您可以利用发布者侦听器模式()
import java.util.LinkedList;
导入java.util.List;
导入java.util.Random;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JTextArea;
导入javax.swing.SwingUtilities;
公共类PublisherListenerSignalExample{
专用接口侦听器{
无效1例(事件e);
}
私有静态类事件{
私人双倍距离;
私家双顾;
公共活动(双倍距离,双倍出席){
这个距离=距离;
this.atten=atten;
}
公共双getDistance(){
返回距离;
}
公共双getAtten(){
返回ATEN;
}
}
私有静态类GUI{
公共静态双d;
}
私有静态类移动器{
公共静态双InstantInstance(双animpos){
返回0;
}
}
私有静态双距离,animpos;
私有静态列表侦听器=新建LinkedList();
私人静态无效火灾(事件){
for(侦听器l:侦听器){
l、 单心室(事件);
}
}
公共静态void addListener(Listener l){
添加(l);
}
公共静态双计算信号(双d,双f){
GUI.d=Mover.instantInstance(animpos);//需要显示
double atten=20*(数学日志10(d))+20*(数学日志10(f))+32.44;//将
//也
//像
//到
//展示
//这个
火灾(新事件(d,atten));
返回ATEN;
}
公共静态void main(字符串[]args){
addListener(新侦听器(){
@凌驾
公共无效事件(事件e){
System.out.println(String.format(“distance=%f atten=%f”,e.getDistance(),e.getAtten());
}
});
最终JTextArea textArea_3=新JTextArea();
text区域_3.设置可编辑(假);
text区域_3.立根(1474811532);
最终JTextArea textArea_4=新JTextArea();
text区域_4.设置可编辑(假);
text区域_4.立根(147、527、215、27);
addListener(新侦听器(){
@凌驾
公共无效事件(最终事件e){
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
textArea_3.setText(“+e.getDistance());//必须转换为字符串
textArea_4.setText(“+e.getAtten());//必须转换为字符串
}
});
}
});
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
JFrame=新JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel面板=新的JPanel();
frame.setContentPane(面板);
面板。添加(文本区域_3);
面板。添加(文本区域_4);
frame.pack();
frame.setVisible(true);
}
});
线程工作线程=新线程(new Runnable(){
@凌驾
公开募捐{
随机rnd=新随机();
while(true){
计算信号(rnd.nextDouble(),rnd.nextDouble());
试一试{
睡眠(1000);
}捕捉(中断异常e){
e、 printStackTrace();
}
}
}
});
worker.setDaemon(true);
worker.start();
}
}
如果您使用的是长时间运行的计算,请使用SwingWorker--read。或者,如果您只是在没有长时间运行的代码的情况下进行定期更新,请使用Swing计时器--read。如果我只需要在按下播放按钮时进行计算,那么这是否属于定期更新?这取决于计算所需的时间。如果需要一段时间才能执行,那么就在后台线程中执行。@气垫船上满是鳗鱼我已经重新阅读了我的代码,我想我找到了一种草率但在技术上合法的方法来显示数据的变化。目前,我有一个向前循环,它将车辆从收音机上移开。是否可以为每个for loop增量更新相应的距离和信号区域?
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
public class PublisherListenerSignalExample {
private interface Listener {
void onEventRecieved(Event e);
}
private static class Event {
private double distance;
private double atten;
public Event(double distance, double atten) {
this.distance = distance;
this.atten = atten;
}
public double getDistance() {
return distance;
}
public double getAtten() {
return atten;
}
}
private static class GUI {
public static double d;
}
private static class Mover {
public static double instantDistance(double animpos) {
return 0;
}
}
private static double distance, animpos;
private static List<Listener> listeners = new LinkedList<>();
private static void fire(Event event) {
for(Listener l : listeners) {
l.onEventRecieved(event);
}
}
public static void addListener(Listener l) {
listeners.add(l);
}
public static double calculateSignal(double d, double f) {
GUI.d = Mover.instantDistance(animpos); // needs to be displayed
double atten = 20 * (Math.log10(d)) + 20 * (Math.log10(f)) + 32.44; // would
// also
// like
// to
// display
// this
fire(new Event(d, atten));
return atten;
}
public static void main(String[] args) {
addListener(new Listener() {
@Override
public void onEventRecieved(Event e) {
System.out.println(String.format("distance=%f atten=%f", e.getDistance(), e.getAtten()));
}
});
final JTextArea textArea_3 = new JTextArea();
textArea_3.setEditable(false);
textArea_3.setBounds(147, 481, 215, 32);
final JTextArea textArea_4 = new JTextArea();
textArea_4.setEditable(false);
textArea_4.setBounds(147, 527, 215, 27);
addListener(new Listener() {
@Override
public void onEventRecieved(final Event e) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
textArea_3.setText(""+e.getDistance()); //would have to be converted to String
textArea_4.setText(""+e.getAtten()); //would have to be converted to String
}
});
}
});
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
frame.setContentPane(panel);
panel.add(textArea_3);
panel.add(textArea_4);
frame.pack();
frame.setVisible(true);
}
});
Thread worker = new Thread(new Runnable() {
@Override
public void run() {
Random rnd = new Random();
while(true) {
calculateSignal(rnd.nextDouble(), rnd.nextDouble());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
worker.setDaemon(true);
worker.start();
}
}