【问题标题】:Java2d - set a variable when I close a JFrameJava2d - 当我关闭 JFrame 时设置一个变量
【发布时间】:2014-10-28 22:38:39
【问题描述】:

我需要做的是在我关闭 JFrame 时设置一个变量。我的项目中有一个线程。我希望这个线程只有在另一个类中的静态变量设置为 true 时才运行。 这是我将在其中设置变量 (sliderActivated) 的类:

import java.awt.Container;
import java.awt.Dimension;
import java.awt.Toolkit;

import javax.swing.JFrame;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;




public class ZoomSlider extends JFrame implements ChangeListener{

    private static final long serialVersionUID = -9026587156796382276L;
    private JSlider slider;
    private static boolean sliderActivated = false;

    public ZoomSlider(){
        //setSliderActivated(true);

        Container contentPane = getContentPane();
        this.setTitle("Zoom");
        this.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
        this.setAlwaysOnTop(true);
        Toolkit mioToolkit = Toolkit.getDefaultToolkit();
        Dimension dimensioniSchermo = mioToolkit.getScreenSize();

        int larghezzaFrame, altezzaFrame;
        larghezzaFrame = 80;
        altezzaFrame = (int)(dimensioniSchermo.getHeight() - 70);
        this.setSize(larghezzaFrame, altezzaFrame);

        this.setLocation(0,50);

        slider = new JSlider(JSlider.VERTICAL, 50, 200, 100);
        slider.setMajorTickSpacing(50);  
        slider.setMinorTickSpacing(10);  
        slider.setPaintTicks(true);  
        slider.setPaintLabels(true);  
        slider.addChangeListener(this);  

        contentPane.add(slider);

        this.setVisible(true);

    }

    @Override
    public void stateChanged(ChangeEvent arg0) {
        //setSliderActivated(true);

        int value = ((JSlider)arg0.getSource()).getValue();  
        EarthPanel.SCALE = value/100.0; 

        //setSliderActivated(false);    
    }

    public static boolean isSliderActivated() {
        return sliderActivated;
    }

    public static void setSliderActivated(boolean sliderActivated) {
        ZoomSlider.sliderActivated = sliderActivated;
    }
}

这是使用变量的线程的运行方法:

public void run() {     
     while(true){

        if(ZoomSlider.isSliderActivated()){
        this.setPreferredSize(new Dimension((int)(width * SCALE),(int)(height * SCALE)));
            repaint();
        }
    }
}

我的想法是仅在 JFrame ZoomSlider.java 可见时重新绘制主面板(此问题中不存在代码)。在那一刻,sliderActivated 将被设置为 true。相反,当我关闭 JFrame 时,sliderActivated 将设置为 false 并且线程将停止运行。 我该怎么做?

【问题讨论】:

标签: java swing jframe repaint java-2d


【解决方案1】:

基本上,您需要向 JFrame 添加一个 WindowListener,它可以响应关闭或关闭事件:

jFrame.addWindowListener(new WindowAdapter() {
  @Override
  public void windowClosed(WindowEvent e) {
     // Do something
  }

  @Override
  public void windowClosing(WindowEvent e) {
     // Do something
  }
});

【讨论】:

  • 嗨!谢谢您的回答;我尝试使用您的方法,但遇到了同样的问题:关闭 jFrame 时未调用 windowClosed() 方法。你知道为什么吗?
  • 嗯,你可能需要同时响应 windowClosed() 和 windowClosing(),调用哪个取决于窗口的关闭方式(代码片段已更改)。
  • 好的,我用WindowListener接口的windowClosing()方法解决了我的问题!感谢您的帮助!
【解决方案2】:

您应该将WindowListenerWindowStateListener 添加到您的框架实例。 WindowStateListener 示例:

public class ZoomSlider extends JFrame implements ChangeListener, WindowStateListener {

    private static volatile boolean sliderActivated = false;

    [...]

    public void windowStateChanged(WindowEvent e) {
        if (e.getNewState() == WindowEvent.WINDOW_CLOSED) {
            setSliderActivated(false);
        } else if (e.getNewState() == WindowEvent.WINDOW_OPENED) {
            setSliderActivated(true);
        }
    }

}

请注意,您必须将该字段声明为 volatile,因为在写入/读取它时涉及两个不同的线程。

【讨论】:

  • 感谢您的回答;我尝试使用您的示例(我在 jFrame 的构造函数中添加了 this.addWindowStateListener(this)),但是 windowStateChanged() 方法仅在我最小化或最大化它时调用,而不是在我关闭它时调用。有什么问题吗?
  • @Giordano 嗯,也许最好使用WindowListener
猜你喜欢
  • 2013-01-17
  • 1970-01-01
  • 2014-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-29
  • 2019-02-22
  • 1970-01-01
相关资源
最近更新 更多