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