帧只在java的某些时间出现

帧只在java的某些时间出现,java,user-interface,Java,User Interface,出于某种原因(似乎完全独立于代码),我的程序框架只会在某些时候出现(可能是20%)。如果我只是不断地点击run,我最终会成功地显示画面,但它永远不会重复。这曾经发生在其他人身上吗?我高度怀疑这与代码有关,但以防万一 public class Trader{ public static Trader INSTANCE = new Trader(); JTextArea msgBox; ApiController m_controller; Connection connect; Quotes

出于某种原因(似乎完全独立于代码),我的程序框架只会在某些时候出现(可能是20%)。如果我只是不断地点击run,我最终会成功地显示画面,但它永远不会重复。这曾经发生在其他人身上吗?我高度怀疑这与代码有关,但以防万一

public class Trader{

public static Trader INSTANCE = new Trader();
JTextArea msgBox;
ApiController m_controller;

Connection connect;
Quotes quotes;

ArrayList<String> m_acctList = new ArrayList();


public static void main(String[] args) {
    INSTANCE.run();
}


public  void run(){
    connect = new Connection();
}



public ArrayList<String> accountList()  { return m_acctList; }
public ApiController controller()       { return m_controller; }
public JFrame frame()           { return connect.frame; }

}
公共类交易员{
public static Trader实例=new Trader();
JTextArea msgBox;
ApiController m_控制器;
连接;
引述;
ArrayList m_acctList=新建ArrayList();
公共静态void main(字符串[]args){
INSTANCE.run();
}
公开募捐{
connect=新连接();
}
public ArrayList accountList(){return m_acttlist;}
公共ApiController控制器(){return m_controller;}
公共JFrame(){return connect.frame;}
}
下节课

 public class Connection implements IConnectionHandler{

static int port = 4001;
Quotes quotes;

JFrame frame;
CPanel panel;

boolean connected = false;

JTextArea logIn = new JTextArea();
JTextArea logOut = new JTextArea();
JTextArea msgBox = new JTextArea();

Logger loggerIn = new Logger(logIn);
Logger loggerOut = new Logger(logOut);

ApiController m_controller = new ApiController(this, loggerIn, loggerOut);

final ArrayList<String> m_acctList = new ArrayList<String>();

Connection(){
    frame = new JFrame("Trader");
    panel = new CPanel();
    frame.add(panel);
    frame.setSize(800,400);
    frame.setResizable(false);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
}

class CPanel extends JComponent{

    Point frameLoc = frame.getLocation();
    Dimension frameSize = frame.getSize();

    JLabel text = new JLabel("Messages");

    JScrollPane messages = new JScrollPane(msgBox);


    CPanel(){

        setLayout(null);

        add(text);
        text.setBounds(frameLoc.x+5, frameLoc.y+5, 
                text.getPreferredSize().width, text.getPreferredSize().height);

        add(messages);
        msgBox.setEditable(false);
        msgBox.setLineWrap(true);

        messages.setBounds(text.getLocation().x, text.getLocation().y+text.getSize().height+10, 
                720, 300);


        m_controller.connect(null, port, 0);

    }


}


 @Override public void connected() {
    show( "connected");

    m_controller.reqCurrentTime( new ApiController.ITimeHandler() {
        @Override public void currentTime(long time) {
            show( "Server date/time is " + Formats.fmtDate(time * 1000) );
        }
    });

    m_controller.reqBulletins( true, new ApiController.IBulletinHandler() {
        @Override public void bulletin(int msgId, Types.NewsType newsType, String message, String exchange) {
            String str = String.format( "Received bulletin:  type=%s  exchange=%s", newsType, exchange);
            show( str);
            show( message);
        }
    });    

      //  Quotes quotes = new Quotes();
}

@Override public void disconnected() {
    show( "disconnected");
}

@Override public void accountList(ArrayList<String> list) {
    show( "Received account list");
    m_acctList.clear();
    m_acctList.addAll( list);
}

@Override public void error(Exception e) {
    show( e.toString() );
}

@Override public void message(int id, int errorCode, String errorMsg) {
    show( id + " " + errorCode + " " + errorMsg);
}

@Override public void show( final String str) {
    SwingUtilities.invokeLater( new Runnable() {
        @Override public void run() {
            msgBox.append(str);
            msgBox.append( "\n\n");

            Dimension d = msgBox.getSize();
            msgBox.scrollRectToVisible( new Rectangle( 0, d.height, 1, 1) );
        }
    });
}



private static class Logger implements ILogger{
    final private JTextArea msgBox;

    Logger(JTextArea area){
        msgBox = area;
    }

    @Override public void log(final String str) {
        SwingUtilities.invokeLater( new Runnable() {
            @Override public void run() {
//                  m_area.append(str);
//                  
//                  Dimension d = m_area.getSize();
//                  m_area.scrollRectToVisible( new Rectangle( 0, d.height, 1, 1) );
            }
        });
    }

    }
 }
公共类连接实现IConnectionHandler{
静态int端口=4001;
引述;
JFrame框架;
CPanel小组;
布尔连接=假;
JTextArea logIn=newjtextarea();
JTextArea logOut=新的JTextArea();
JTextArea msgBox=新的JTextArea();
Logger loggerIn=新的记录器(登录);
记录器注销=新记录器(注销);
ApiController m_controller=新的ApiController(this,loggerIn,loggerOut);
最终ArrayList m_acctList=新ArrayList();
连接(){
框架=新的JFrame(“交易者”);
面板=新CPanel();
框架。添加(面板);
框架设置尺寸(800400);
frame.setresizeable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
类CPanel扩展了JComponent{
点frameLoc=frame.getLocation();
维度frameSize=frame.getSize();
JLabel text=新的JLabel(“消息”);
JScrollPane messages=新的JScrollPane(msgBox);
CPanel(){
setLayout(空);
添加(文本);
text.setBounds(frameLoc.x+5,frameLoc.y+5,
text.getPreferredSize().width,text.getPreferredSize().height);
添加(消息);
msgBox.setEditable(false);
msgBox.setLineWrap(true);
messages.setBounds(text.getLocation().x,text.getLocation().y+text.getSize().height+10,
720, 300);
m_controller.connect(空,端口,0);
}
}
@覆盖已连接的公共void(){
显示(“关联”);
m_controller.reqCurrentTime(新的ApiController.ITimeHandler(){
@覆盖公共无效currentTime(长时间){
显示(“服务器日期/时间为”+格式.fmtDate(时间*1000));
}
});
m_controller.reqBulletins(true,新的ApiController.IBulletinHandler(){
@重写公共无效公告(int-msgId,Types.NewsType-NewsType,字符串消息,字符串交换){
String str=String.format(“收到的公告:类型=%s exchange=%s”,新闻类型,exchange);
show(str);
显示(信息);
}
});    
//引号=新引号();
}
@重写公共void disconnected(){
显示(“断开”);
}
@覆盖公共无效帐户列表(ArrayList列表){
显示(“收到的账户清单”);
m_acctList.clear();
m_acctList.addAll(列表);
}
@覆盖公共无效错误(异常e){
显示(例如toString());
}
@覆盖公共无效消息(int-id、int-errorCode、String-errorMsg){
显示(id+“”+errorCode+“”+errorMsg);
}
@覆盖公共空白显示(最终字符串str){
SwingUtilities.invokeLater(新的Runnable(){
@重写公共无效运行(){
msgBox.append(str);
msgBox.append(“\n\n”);
维度d=msgBox.getSize();
scrollRectToVisible(新矩形(0,d.height,1,1));
}
});
}
私有静态类记录器实现ILogger{
最终私有JTextArea msgBox;
记录器(JTextArea){
msgBox=面积;
}
@重写公共无效日志(最终字符串str){
SwingUtilities.invokeLater(新的Runnable(){
@重写公共无效运行(){
//m_区追加(str);
//                  
//尺寸d=m_面积。getSize();
//m_区域。scrollRectToVisible(新矩形(0,d.height,1,1));
}
});
}
}
}
最后

public class Quotes {

int numberOfStocks = 0;
JTextArea msgBox = Trader.INSTANCE.connect.msgBox;
String symbol;

File file = new File("/Users/spencerclayman/Desktop/IB_API/API_Data/stockList.txt");

ArrayList<quote> stockList = new ArrayList();
Quotes(){

    msgBox.append("Getting stock quotes");
    try(Scanner input = new Scanner(file);){

       while(input.hasNextLine()){
            symbol = input.nextLine();
            newStock(newContract(symbol));
        }
    }
    catch(Exception ex){msgBox.append("Error getting quotes");}

    try{wait(10000);}catch(Exception ex){msgBox.append("error waiting - quote");}

    for(int i = 0; i < numberOfStocks() -1 ; i++){

        msgBox.append(stockList.get(i).m_description
        + " - " + stockList.get(i).m_last +"\n");
    }
}




void newStock( NewContract contract) {
    quote stock = new quote(contract.description());
    stockList.add(stock);
    Trader.INSTANCE.controller().reqTopMktData(contract, "", false, stock);
}

void newStock( quote stock) {
    stockList.add(stock);
}

public void desubscribe() {
    for (quote stock : stockList) {
        Trader.INSTANCE.controller().cancelTopMktData(stock);
    }
}




public int numberOfStocks(){

    try(Scanner input = new Scanner(file);){

        while(input.hasNextLine()){
            numberOfStocks++;
            input.nextLine();
        }
    }
    catch(Exception ex){msgBox.append("Error getting symbols");}

    return numberOfStocks;
}



static class quote extends TopMktDataAdapter{

            String m_description;
    double m_bid;
    double m_ask;
    double m_last;
    long m_lastTime;
    int m_bidSize;
    int m_askSize;
    double m_close;
    int m_volume;
    boolean m_frozen;

            quote(String description){ 
                m_description = description;

            }



            public String change() {
        return m_close == 0 ? null : fmtPct( (m_last - m_close) / m_close);
    }

        @Override public void tickPrice( NewTickType tickType, double price, int canAutoExecute) {
    switch( tickType) {
            case BID:
                m_bid = price;
                break;
            case ASK:
                m_ask = price;
                break;
            case LAST:
                m_last = price;
                break;
            case CLOSE:
                m_close = price;
                break;
        }
    }

        @Override public void tickSize( NewTickType tickType, int size) {
        switch( tickType) {
            case BID_SIZE:
                m_bidSize = size;
                break;
            case ASK_SIZE:
                m_askSize = size;
                break;
            case VOLUME:
                m_volume = size;
                break;
        }
    }

        @Override public void tickString(NewTickType tickType, String value) {
        switch( tickType) {
            case LAST_TIMESTAMP:
                m_lastTime = Long.parseLong( value) * 1000;
                break;
        }
    }

        @Override public void marketDataType(Types.MktDataType marketDataType) {
        m_frozen = marketDataType == Types.MktDataType.Frozen;
    } 

}




    public NewContract newContract(String symbol){
        NewContract c = new NewContract();

        c.symbol(symbol);
        c.secType(Types.SecType.STK);
        c.exchange("SMART");
        c.currency("USD");

        return c;
    }


 }
公共类引号{
int numberOfStocks=0;
JTextArea msgBox=Trader.INSTANCE.connect.msgBox;
字符串符号;
File File=新文件(“/Users/spencerclayman/Desktop/IB_API/API_Data/stockList.txt”);
ArrayList stockList=新的ArrayList();
引号(){
附加(“获取股票报价”);
尝试(扫描仪输入=新扫描仪(文件);){
while(input.hasNextLine()){
symbol=input.nextLine();
newStock(新合同(符号));
}
}
catch(异常ex){msgBox.append(“获取引号时出错”);}
尝试{wait(10000);}catch(Exception ex){msgBox.append(“error waiting-quote”);}
对于(int i=0;i