我正在创建几个类来简化创建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;
}
}
Run Code Online (Sandbox Code Playgroud)
所以它基本上所做的只是在一个方法中设置多个属性(不需要为每个对象编写10-15行代码).这些工作很好,但我想进一步抽象它,方法可以使用JApplets,JPanels和其他容器以及JFrames.这样我就可以将类从JFrameBuilder推广到更直接的"AppBuilder","GUIBuilder"等,并能够在其他项目中使用它.
但要做到这一点,我需要传递一个未知类型的对象作为方法中的参数.所以我尝试将"JFrame"替换为"Object",然后使用String来标识其类型,并尝试根据它进行更改.但是,我使用像"add"这样的方法遇到了一些麻烦.我在想它是因为Object没有add方法(即使JPanel是对象类型而JPanel也是如此).
为了澄清一点,基本上我需要它做的是弄清楚应该添加按钮/标签/任何东西的容器("父?").到目前为止,我知道这样做的唯一方法是将其作为方法中的参数传递; 如果有另一种方式,我想学习它,但如果没有,那么理想情况下传递一个未知类型的变量似乎是最好的方法.这样,方法内部会有一些东西可以识别类型并将其下一步操作基于该类型(例如,如果可以显示其他对象,则添加到其中,如果没有,则捕获异常).
所以我在这个网站上检查了类似的问题(这实际上是我从中得到了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);
}
}
Run Code Online (Sandbox Code Playgroud)
另外,您可能想说服自己空布局是邪恶的,并根据您的目的使用适当的布局管理器
归档时间: |
|
查看次数: |
5443 次 |
最近记录: |