gpt4 book ai didi

java - 单击按钮时如何在Java中的运行时强制转换对象

转载 作者:行者123 更新时间:2023-12-02 11:14:20 24 4
gpt4 key购买 nike

所以我需要知道如何在运行时将父类转换为子类(或以其他方式指向可用的 4 个工具之一)。我有一个带有 4 个工具的绘图程序,这些工具是我的父工具类“DrawingTool”类的子类。我的类中有一个字段,它为我的“ Canvas ”扩展 JPanel 以保存 myCurrentTool,该字段需要根据用户当前选择的 JToggleButton 进行更改。我正在设置它,以便在选择按钮时我的 Action 监听器更改为正确的工具。因此,当特定按钮处于 Activity 状态时,paint 方法将调用该字段,并且它需要对它应该引用的任何特定子类使用覆盖的方法。我试过 myCurrentTool = myTool,不行。无法弄清楚如何在没有编译错误的情况下进行转换(希望我只是不知道它的语法。

任何建议都会很棒。以下是一些代码片段。我的代码被分成 9 个不同的类,所以这与任何地方的相关 block 都很少。

public DrawingAction(final String theName, final Icon theIcon,
final DrawingTool theTool, final int theKey) {
super(theName, theIcon);
putValue(Action.SHORT_DESCRIPTION, theName + " background");
putValue(Action.SELECTED_KEY, true);
putValue(Action.MNEMONIC_KEY, theKey);
myTool = theTool;

}

...
myDrawingActions `enter code here`= new ArrayList<DrawingAction>();
myDrawingActions.add(new DrawingAction("Pencil", new ImageIcon("icons\\pencil.gif"),
new PencilTool(), KeyEvent.VK_L));
myDrawingActions.add(new DrawingAction("Line", new ImageIcon("icons\\line.gif"),
new LineTool(), KeyEvent.VK_L));
myDrawingActions.add(new DrawingAction("Rectangle",
new ImageIcon("icons\\rectangle.gif"),
new RectangleTool(), KeyEvent.VK_R));
myDrawingActions.add(new DrawingAction("Ellipse", new ImageIcon("icons\\ellipse.gif"),
new EllipseTool(), KeyEvent.VK_E));

...
public void paintComponent(final Graphics theGraphics) {
super.paintComponent(theGraphics);
final Graphics2D g2 = (Graphics2D) theGraphics;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setStroke(new BasicStroke(myLineThickness));
g2.setColor(myColor);
g2.draw(myCurrentTool.draw());
}

...
/**
* Instance of the Line Drawing Tool.
*/
private LineTool myLine;

/**
* Instance of Rectangle Tool.
*/
private RectangleTool myRectangle;

/**
* Instance of Ellipse Tool.
*/
private EllipseTool myEllipse;

/**
* Instance of Pencil Tool.
*/
private PencilTool myPencil;

/**
* Holds the currently selected tool.
*/
private DrawingTool myCurrentTool;

最佳答案

编辑:

子类可以完美地融入父类,但反之则不然。您可能正试图将一个不相关的对象放入另一个对象中。

原文:

您可能想要重构您的代码。
如果我理解正确,您想动态转换为运行时?这很容易使用反射,但我会用不同的方式来做:

您只需从 DrawingAction 中获取 ID(您在构造函数中使用的字符串)并将其用作 map 中的键 Map<String, MyClass> tools; .

MyClass 只是一个接口(interface),其中包含您可能想要通知当前事件的方法。

例如:
public void onButtonClicked(Button b, int x, int y);
您根本不需要任何转换,使用实现所有接口(interface)方法的虚拟抽象类,您可能只需更改类扩展和方法名称。

关于java - 单击按钮时如何在Java中的运行时强制转换对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26955430/

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