Допустим, я создал нить с кнопкой в twitterpanel class
например
public class twitterpanel extends javax.swing.JFrame {
Thread oto;
/....
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
oto = new Thread(new Runnable() {
@Override
public void run() {
ArrayList<String> textler = new ArrayList<String>();
textler.add(jTextField1.getText());
textler.add(jTextField2.getText())
new Twitter(textler);
}
});
oto.start();
} }
Метод, например:
public void twittermethod() {
for (;;) {
System.out.println("Close me please..");
}
}
И я хочу закрыть эту тему с помощью другой кнопки, и кнопка находится в twitterpanel class
. Может быть, это просто, но я ничего не мог найти, например, мой мозг остановился. Надеюсь, я могу ясно объяснить себя. Заранее спасибо..
Опять же, как указано в предыдущем удаленном вопросе,
Ваш вопрос - проблема XY в том, что вы спрашиваете о конкретных решениях кода, которые могут быть неправильными, и вы не обсуждали свою цель.
Например, вы можете часто запускать и останавливать Threads с фоновым потоком SwingWorker. Подробнее о том, как использовать этот инструмент, читайте в учебнике SwingWorker, с которым я связан выше, и который вы можете найти здесь.
Пример минимальной программы Swing с SwingWorker, которая делает то, что вы пытаетесь сделать (я думаю!):
import java.awt.event.*;
import javax.swing.*;
@SuppressWarnings("serial")
public class StopThreadGui extends JPanel {
private JTextField field1 = new JTextField("Hello", 10);
private JTextField field2 = new JTextField("Goodbye", 10);
private JButton startButton = new JButton(new StartAction("Start", KeyEvent.VK_S));
private JButton endButton = new JButton(new EndAction("End", KeyEvent.VK_E));
private MySwingWorker myWorker;
public StopThreadGui() {
add(field1);
add(field2);
add(startButton);
add(endButton);
}
private static void createAndShowGui() {
StopThreadGui mainPanel = new StopThreadGui();
JFrame frame = new JFrame("StopThreadGui");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
private class StartAction extends AbstractAction {
public StartAction(String name, int mnemonic) {
super(name);
putValue(MNEMONIC_KEY, mnemonic);
}
@Override
public void actionPerformed(ActionEvent evt) {
if (myWorker != null && !myWorker.isDone()) {
return;
}
String text1 = field1.getText();
String text2 = field2.getText();
myWorker = new MySwingWorker(text1, text2);
myWorker.execute();
}
}
private class EndAction extends AbstractAction {
public EndAction(String name, int mnemonic) {
super(name);
putValue(MNEMONIC_KEY, mnemonic);
}
@Override
public void actionPerformed(ActionEvent evt) {
if (myWorker == null || myWorker.isDone()) {
return;
}
myWorker.cancel(true);
}
}
}
class MySwingWorker extends SwingWorker<Void, Void> {
private static final long SLEEP_TIME = 400;
private String text1;
private String text2;
public MySwingWorker(String text1, String text2) {
this.text1 = text1;
this.text2 = text2;
}
@Override
protected Void doInBackground() throws Exception {
boolean foo = true;
while (foo) {
System.out.printf("Text1: %s; Text2: %s%n", text1, text2);
System.out.println("Close me please..");
Thread.sleep(SLEEP_TIME);
}
return null;
}
}
doingBackground()
, onPreExecute()
, OnPostExecute()
. но для меня ваш пример сложный, потому что я новичок в Java. Но теперь я сначала посмотрю на SwingWorker ... а затем попытаюсь понять ваш пример. еще раз спасибо
Используйте Swing Timer, который наиболее подходит для качания приложений двумя способами:
Подробнее о том, как использовать качающиеся таймеры
Просто вызовите timer#start()
и timer#stop()
Образец кода:
// wait for 2 seconds
Timer timer=new Timer(2000,new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
// do your action here
}
});
timer.setRepeats(false); // if needed then repeat it
timer.start();
oto
переменную класса.