我正在创建几个类来简化创建 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/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
我正在尝试设置一个puppet节点,但rubygems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由rubygems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案