gpt4 book ai didi

java - 神秘的一次性选角异常

转载 作者:行者123 更新时间:2023-12-01 19:25:17 24 4
gpt4 key购买 nike

我正在尝试使用 JComponent 类的 PropertyChangeSupport。但是当我执行以下代码时,第一次单击菜单按钮会出现运行时转换异常,但随后它始终运行良好。

FrameListener.java

import javax.swing.*;
import java.beans.*;
import java.awt.*;
import java.awt.event.*;

public class FrameListener extends JFrame implements ActionListener, PropertyChangeListener
{

JLabel lblMessage;
JMenuItem changeFont;
FontSource fe = new FontSource(this,"Font Editor");

public FrameListener(){

super("Hello World");
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE) ;
increaseReadability() ;

changeFont.addActionListener(this);

fe.addPropertyChangeListener(this);

setSize(400,200);
setVisible(true);
}

private void increaseReadability(){
JPanel panel = new JPanel();
Font f = new Font("Times New Roman",Font.BOLD,24);
lblMessage = new JLabel("HELLO WORLD",SwingConstants.CENTER);
lblMessage.setFont(f);
panel.add(lblMessage);


JMenuBar actionBar = new JMenuBar();
JMenu edit = new JMenu("Edit");
changeFont = new JMenuItem("Font");

actionBar.add(edit);
edit.add(changeFont);
add(actionBar,BorderLayout.NORTH);
add(panel,BorderLayout.CENTER);
}

public void propertyChange(PropertyChangeEvent pcevent){
Object obj = pcevent.getNewValue() ;
System.out.println(obj.getClass()) ;

//Statement occuring problem 1st time
Font newFt = (Font)obj;

lblMessage.setFont(newFt);
}

public void actionPerformed(ActionEvent evt){
fe.setVisible(true);
}

public static void main(String argv[]) {
new FrameListener();
}
}

FontSource.java

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.beans.*;


public class FontSource extends JDialog implements ActionListener {

private Font newFont = new Font("Times New Roman",Font.BOLD,12);

JComboBox cbfType,cbfStyle,cbfSize;
JButton btnOk,btnCancel;

//protected PropertyChangeSupport changes = new PropertyChangeSupport(this);

public Font getNewFont(){
return newFont;
}

public void setNewFont(Font f){
Font old = newFont;

try{

//this statement calls the propertyChange() of FrameListener
//if u are removing comments, replace the following statement with
// changes.firePropertyChange("Font Changed",old,f);
firePropertyChange("Font Changed",old,f);

newFont = f;
}
catch(Exception e){
System.out.println(e);
}
}

public FontSource(Frame fr,String title){

super(fr,title);
// getting font family from the graphics environment.
GraphicsEnvironment gf = GraphicsEnvironment.getLocalGraphicsEnvironment();
String myfont[] = gf.getAvailableFontFamilyNames();
cbfType = new JComboBox(myfont);
add(cbfType);

String fontStyle[] = {"PLAIN","ITALIC","BOLD",};
cbfStyle = new JComboBox(fontStyle);
add(cbfStyle);

String fontSize[] = {"10","12","14","16","18","20","24","26","28","36","48","72"};
cbfSize = new JComboBox(fontSize);
add(cbfSize);

btnOk =new JButton("OK");
btnCancel =new JButton("Cancel");

add(btnOk);
add(btnCancel);

// adding action listener
btnOk.addActionListener(this);
btnCancel.addActionListener(this);

// setting layout and size for the dialog
setLayout(new FlowLayout());
setSize(170,170);
}

public void actionPerformed(ActionEvent ae){

if(ae.getSource()==btnOk){
String type = (String) cbfType.getSelectedItem();
String style = (String)cbfStyle.getSelectedItem();
int s = 0;
int size = Integer.parseInt((String)cbfSize.getSelectedItem());
if(style=="PLAIN")
s= Font.PLAIN;
else {
if(style =="BOLD")
s= Font.BOLD;
else
s= Font.ITALIC;
}

Font f = new Font(type,s,size);

setNewFont(f);
}
else{
this.setVisible(false);
}
}

/*
public void addPropertyChangeListener(PropertyChangeListener l){
System.out.println("attachement done...");
changes.addPropertyChangeListener(l);
}

public void removePropertyChangeListener(PropertyChangeListener l){
changes.removePropertyChangeListener(l);
}
*/
}

但是如果我使用自己的PropertyChangeSupport(删除FontSource.java中的注释),那么它就可以完美工作。我尽力了,但没有得到这个。提前致谢:--)

最佳答案

如果您实现PropertyListener,您将收到您注册的组件的所有属性更改。可以有多种类型,其值将由属性更改的类型决定。

setFontComponent 方法的实现将触发名称为 “font” 的属性更改。如果您测试该名称,应该没问题:

public void propertyChange(PropertyChangeEvent pcevent){
Object obj = pcevent.getNewValue() ;
System.out.println(obj.getClass()) ;

//Problem should not occur with this call.
if (pcevent.getPropertyName().equals("font")){
Font newFt = (Font)obj;

lblMessage.setFont(newFt);
}
}

关于java - 神秘的一次性选角异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1562568/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com