【问题标题】:this seems to be underlined in red这似乎用红色下划线
【发布时间】:2014-12-24 21:19:46
【问题描述】:

修改

现在导入显示在这里带有下划线

导入 javax.swing.event.ChangeListener;

下面的行也带有下划线

slider.addChangeListener(ChangeListener());

这个我不清楚

完整代码

package areaofrectangleslider;

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.event.ChangeListener;


public class Areaofrectangleslider extends JFrame implements 
        ActionListener, ChangeListener {

    private JPanel panel;
    private Random random;
    private javax.swing.Timer timer;
    private JSlider slider;
    private JTextField gapField;
    private JLabel gapLabel;



    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        EventQueue.invokeLater(new Runnable() {
        public void run(){
        Areaofrectangleslider frame = new Areaofrectangleslider();
        frame.setSize(250,300);
        frame.createGUI();
        frame.setVisible(true);

        }


    });
    }

    public void actionPerformed(ActionEvent e) {
     //   throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    int x, y, size;
    Graphics paper = panel.getGraphics();
    x = random.nextInt(200);
    y = random.nextInt(200);
    size = random.nextInt(20);
    paper.fillOval(x, y, size, size);

    }

    @Override
    public void changed(ObservableValue observable, Object oldValue, Object newValue) {
       // throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    int timeGap = slider.getValue();
    gapField.setText(Integer.toString(timeGap));
    timer.setDelay(timeGap);

    }

    private void createGUI() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        Container window = getContentPane();
        window.setLayout(new FlowLayout());
        random = new Random();

        panel = new JPanel();
        panel.setPreferredSize(new Dimension(200,200));
        panel.setBackground(Color.white);
        window.add(panel);

        gapLabel = new JLabel("TIme Gap: ");
        window.add(gapLabel);
        gapField = new JTextField(10);
        window.add(gapField);

        slider = new JSlider(JSlider.HORIZONTAL,200,2000,1000);
        window.add(slider);
        slider.addChangeListener(ChangeListener());
        gapField.setText(Integer.toString(slider.getValue()));
        timer = new javax.swing.Timer(1000, this);
        timer.start();



//        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

}

我似乎无法弄清楚为什么我在这里收到错误

slider.addChangeListener(this);

(this) 显示为红色下划线

我得到的控制台读数是:

Exception in thread "main" java.lang.ClassCastException: areaofrectangleslider.Areaofrectangleslider cannot be cast to javax.swing.event.ChangeListener
    at areaofrectangleslider.Areaofrectangleslider.createGUI(Areaofrectangleslider.java:91)
    at areaofrectangleslider.Areaofrectangleslider.main(Areaofrectangleslider.java:46)
Java Result:

完整代码如下

package areaofrectangleslider;

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JTextField;


public class Areaofrectangleslider extends JFrame implements 
        ActionListener, ChangeListener {

    private JPanel panel;
    private Random random;
    private javax.swing.Timer timer;
    private JSlider slider;
    private JTextField gapField;
    private JLabel gapLabel;



    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Areaofrectangleslider frame = new Areaofrectangleslider();
        frame.setSize(250,300);
        frame.createGUI();
        frame.setVisible(true);


    }

    @Override
    public void actionPerformed(ActionEvent e) {
     //   throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    int x, y, size;
    Graphics paper = panel.getGraphics();
    x = random.nextInt(200);
    y = random.nextInt(200);
    size = random.nextInt(20);
    paper.fillOval(x, y, size, size);

    }

    @Override
    public void changed(ObservableValue observable, Object oldValue, Object newValue) {
       // throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    int timeGap = slider.getValue();
    gapField.setText(Integer.toString(timeGap));
    timer.setDelay(timeGap);

    }

    private void createGUI() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        Container window = getContentPane();
        window.setLayout(new FlowLayout());
        random = new Random();

        panel = new JPanel();
        panel.setPreferredSize(new Dimension(200,200));
        panel.setBackground(Color.white);
        window.add(panel);

        gapLabel = new JLabel("TIme Gap: ");
        window.add(gapLabel);
        gapField = new JTextField(10);
        window.add(gapField);

        slider = new JSlider(JSlider.HORIZONTAL,200,2000,1000);
        window.add(slider);
        slider.addChangeListener(this);
        gapField.setText(Integer.toString(slider.getValue()));
        timer = new javax.swing.Timer(1000, this);
        timer.start();



//        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

}

【问题讨论】:

  • 永远不要使用getGraphics(),这不是自定义绘画的工作方式。请参阅Painting in AWT and SwingPerforming Custom Painting 了解更多详情
  • 很好地描述了您的问题和完整的代码示例。更多人应该问这样的问题。

标签: java swing changelistener


【解决方案1】:

javafx.beans.value.ChangeListener;javax.swing.event.ChangeListener不一样

切勿使用getGraphics 尝试执行自定义绘画,这不是Swing 中绘画的工作方式。请参阅 Painting in AWT and SwingPerforming Custom Painting 了解有关自定义绘画如何工作以及应在 Swing 中实现的更多详细信息

此外(如下所述),所有 UI 创建和修改都应在 Event Dispatching Thread 的上下文中执行...

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            Areaofrectangleslider frame = new Areaofrectangleslider();
            frame.setSize(250,300);
            frame.createGUI();
            frame.setVisible(true);
        }
    });
}

更多详情请见Initial Threads

【讨论】:

  • 此外,所有 Swing 代码都应该在 Event Dispatch Thread. 上完成,而 main() 入口点至少不需要。
  • @markspace 或者至少你不应该假设 main 将在 EDT 的上下文中被调用
【解决方案2】:

JSlider 中 addChangeListner 的方法签名是 public void addChangeListener(ChangeListener l) 其中 ChangeListner 是 javax.swing.event.ChangeListener。因此,在您的代码中,您传递的 javafx.beans.value.ChangeListener 类型是错误的,并且无法转换。

【讨论】:

  • 我不明白,javax.swing.event.ChangeListener 不是可用的导入
  • @MrAssistance Yes it is
  • 我已经在上面发布了我的新代码 - 我很坚持这个
猜你喜欢
  • 2011-09-19
  • 2020-07-29
  • 1970-01-01
  • 2017-06-10
  • 1970-01-01
  • 2020-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多