私は本当に自分の質問を語る良い方法を見つける必要があります。 基本的には、Webページから情報を取り出し、画面全体にうまく表示するプログラムを作成しました。メインメソッドを小さなメソッドで待つようにする(java)
ユーザーがプログラムを閉じると、実際にはプログラムが閉じられます。
また、情報が更新されているかどうかを定期的にチェックする別の方法もあります。 残念ながら、私が問題にしているのは、それが速くループするということです。私はそれが40秒ごとに情報をチェックしたいだけです。
私が試したのは、メソッド自体とプログラムのメインに待機(1000,1000)を挿入したことです。どちらもIllegalMonitorStateExceptionの原因となります。
スレッドを正しく待機させる正しい方法ですか?それとも良い方法がありますか? 注:私が持っている唯一のスレッドはメインです。 UPDATES
FORMAIN
class Marquee
{
public static void main(String[] args) throws InterruptedException
{
MyFrame frame = new MyFrame();
frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
frame.setVisible(true);
frame.setAlwaysOnTop(true);
frame.setBackground(Color.BLACK);
frame.setResizable(true);
while(true)
{
// this doesnt work
frame.wait(1000,1000);
frame.notifyAll();
frame.checkForNewUpdate();
System.out.println(" ____________________________next line _______________________________");
}
}
}
CHECK
public String[] checkForNewUpdate()
{
//setVisible(true);
String tempUpdate = getEngineersUpdate();
if (latestUpdate[0] != tempUpdate)
{
// do nothign
setVisible(false);
}
else if(latestUpdate[0]==tempUpdate)
{
latestUpdate[0] = tempUpdate;
//show the page again
setVisible(true);
}
else if(latestUpdate[0]!= "NULL")
{
// do nothing
//latestUpdate[0] = tempUpdate;
}
else
{
latestUpdate[0] = tempUpdate;
}
return latestUpdate;
}
1:時間のギャップを作るために他の方法があります:私はこの例外
2を取得するために、間違って何をしていますメソッド内で
3:これらのメソッドを別のスレッドに入れなければならないのですか?リクエストによって何
// my constructor which I failed to mention has a timer in it. only i dont know hwo to use it
class MyFrame extends JFrame implements ActionListener
{
private ActionListener listener;
private Timer t1;
private String [] latestUpdate = new String[1];
public MyFrame()
{
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();// gets the maximum size of the screen
setSize(d.width,(d.height/100)*10);//sets it to max. need to change this
// this shit find the max size of screen and puts it bottom left
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice defaultScreen = ge.getDefaultScreenDevice();
Rectangle rect = defaultScreen.getDefaultConfiguration().getBounds();
int x = (int)rect.getMinX();
int y = (int)rect.getMaxY()-getHeight();
setLocation(x,y-30);
setTitle("ALERT::OUTAGE");
MyPanel panel = new MyPanel();
add(panel);
listener = this;
t1 = new Timer(50,listener);
t1.start();
}
を言っていないしてください、ここでgetEngineersUpdate()である
public String getEngineersUpdate() //gets data from page and sets it to string.
{
String update = "blank";
final WebClient webClient = new WebClient();
webClient.setJavaScriptEnabled(false);// javascript causes some serious problems.
webClient.setCssEnabled(false);
String forChecking;
HtmlPage page;
try
{
URL outageURL = new URL("file:\\C:\\Users\\0vertone\\Desktop\\version control\\OUTAGE\\Outages.html"); //local drive at home
page = webClient.getPage(outageURL);
//All this crap can be gone if we just give the table an id
Object[] dates = page.getByXPath("//span[@id='date']/text()").toArray();
Object[] sites = page.getByXPath("//span[@id='site']/text()").toArray();
Object[] issues = page.getByXPath("//span[@id='issue']/text()").toArray();
System.out.println("" + dates[0].toString());
System.out.println("" + sites[0].toString());
System.out.println("" + issues[0].toString());
update = (dates[0].toString() + " " + sites[0].toString() + " " +issues[0].toString());
forChecking = dates[0].toString();
/**some examples of the getCellAt() method*/
//update = table.getCellAt(0,0).asText(); // This returns DATE/Time
//update = table.getCellAt(1,0).asText(); // This return the actual date
//update = table.getCellAt(0,1).asText(); // This returns, SITE/Sector
//update = table.getCellAt(1,1).asText(); // This returns the actual site issue
}
catch (FailingHttpStatusCodeException a)
{
System.out.println("Failing HTTP Status Execution");
a.printStackTrace();
}
catch (MalformedURLException b)
{
System.out.println("Malformed URL");
b.printStackTrace();
}
catch (IOException c)
{
System.out.println("IO PROBLEMS!");
c.printStackTrace();
}
webClient.closeAllWindows();
return update;
}
GUIに関連するすべてのコールは、Swingイベントディスパッチスレッド(EDT)で発生する必要があります。 SwingUtilities.invokeLaterを見たり、詳細をWeb検索したりしてください。あなたは1つのスレッドだけを持っているように見えますが、EDTはGUIを作成することによって起動されているので、実行しています。また、==を使用して文字列を比較し、代わりにstring.equals(otherString)を使用します。 –
あなたはスイングを使用しているので、メインはあなたが持っている唯一のスレッドではありません。少なくともイベントディスパッチスレッドがあります –