gpt4 book ai didi

java - 在 Java 方法中将未知类型的对象作为参数传递

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:21:51 26 4
gpt4 key购买 nike

我正在创建几个类来简化创建 GUI、应用辅助功能设置、绘制图形等过程,我已经取得了很大的进步;但我有一个想法,如果可行,那就太好了,我想知道这是否可能。

现在,我有一个“JFrameBuilder”类,其方法如下:

/**
* The "addButton" method adds a button to a JFrame
* @param app The parent window (a JFrame)
* @param text The button text
* @param x The x-coordinate where the button should appear
* @param y The y-coordinate where the button should appear
* @param width The width of the button
* @param height The height of the button
* @return A JButton object (it returns an object so programs can manipulate it later)
*/
public JButton addButton(JFrame app, String text, int x, int y, int width, int height) {
try {
JButton button = new JButton();
button.setText(text);
button.setBounds(x, y, width, height);
app.add(button);
System.out.println("\"" + text + "\" button created.");
return button;
}catch(Exception e) {
System.out.println("Something went wrong when creating the \"" + text + "\" button.");
System.out.println(e.getStackTrace());
return null;
}
}

所以基本上它真正做的就是在一个方法中设置多个属性(消除了为每个对象编写 10-15 行代码的需要)。这些工作很好,但我想进一步抽象它,使这些方法可以与 JApplets、JPanels 和其他容器以及 JFrames 一起工作。这样我就可以将类从 JFrameBuilder 概括为更直接的“AppBuilder”、“GUIBuilder”等,并能够在其他项目中使用它。

但要做到这一点,我需要将未知类型的对象作为参数传递给方法。所以我尝试用“Object”替换“JFrame”,然后使用 String 来识别它的类型,并尝试基于它进行更改。但是,我在使用“添加”等方法时遇到了一些麻烦;我认为这是因为 Object 没有 add 方法(即使 JPanel 是对象类型而 JPanel 有)。

澄清一下,基本上我需要它做的是弄清楚应该添加按钮/标签/任何东西的容器(“ parent ?”)。到目前为止,我知道的唯一方法是将它作为参数传递给方法;如果有另一种方法,我想学习它,但如果没有,那么理想情况下传递一个未知类型的变量似乎是最好的方法。这样,方法内部就会有一些东西来识别类型并以此为基础执行下一步操作(例如,如果可以显示其他对象,则添加到它,如果不能,则捕获异常)。

所以我在这个网站上查看了类似的问题(这实际上是我从中得到 Object 想法的地方)并且还用谷歌搜索了一下,但没有运气。因此,一如既往,我非常感谢任何建议或其他想法。

谢谢。 :)

最佳答案

使用 Generics ,创建用于将 JButton 添加到 T 组件的抽象。

可运行代码

import java.awt.BorderLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

import java.awt.BorderLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class AdderExample {
public static void main(String[] args){
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame frame = new JFrame("Demo");
frame.getContentPane().setLayout(new BorderLayout());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

/* Use JFrameAdder if you want to add to a JFrame
* ---------------------------------------------- */
JPanel panel = new JPanel();
addButton(panel, new JPanelAdder(), "blah", 10, 10, 100, 10);
frame.getContentPane().add(panel);

frame.pack();
frame.setVisible(true);
}
});
}
public static <T> JButton addButton(T app, Adder<T> adder, String text, int x, int y, int width, int height) {
try {
JButton button = new JButton();
button.setText(text);
button.setBounds(x, y, width, height);
adder.add(button, app);
System.out.println("\"" + text + "\" button created.");
return button;
}catch(Exception e) {
System.out.println("Something went wrong when creating the \"" + text + "\" button.");
System.out.println(e.getStackTrace());
return null;
}
}
}
interface Adder<E>{
void add(JButton btn, E e);
}

class JFrameAdder implements Adder<JFrame>{
@Override
public void add(JButton btn, JFrame e) {
e.getContentPane().add(btn);
}
}
class JPanelAdder implements Adder<JPanel>{
@Override
public void add(JButton btn, JPanel e) {
e.add(btn);
}
}

此外,您可能想说服自己 Null Layout is Evil并使用适当的 layout manager为了你的目的

关于java - 在 Java 方法中将未知类型的对象作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17561634/

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