在我看过的所有Java源代码示例中,监听器一直在内部类中声明.
为什么 - 这样编写类的原因是什么,而不是将监听器放在他们自己的单独的*.java文件\ class中?
为听众设置单独的课程会被视为糟糕的设计吗?
如果它不是一个糟糕的设计\麻醉的进攻可以有人请发一个简短的例子来证明如何实现这个?
感谢阅读.
编辑\更新 - 10.8.2010:感谢所有花时间回复的人.需要考虑很多有见识的要点.阅读完所有答案后,我认为除非有充分的理由否则,将听众声明为内部类更好更容易.
抱歉没有早点回到这个问题,但我并不总是有足够的时间进行编码,因为我喜欢:-(
快乐的编码.
只是想知道以下是否被认为是良好的编程习惯?我喜欢尽可能简洁和整洁地保存我的个人源文件,但我想知道更有经验的编码器会想到它.我特别喜欢Settings.java类的想法,将我的所有"魔数"保存在一个地方.有没有人建议我如何改进事物?
快乐的编码:-)
class ApplicationLauncher
{
public static void main(String[] args)
{
SwingApplication mySwingApplication = new SwingApplication();
}
}
//////////////
import javax.swing.*;
public class SwingApplication extends JFrame
{
public SwingApplication()
{
JFrame myJFrame = new JFrame();
myJFrame.setSize(Settings.frameWidth, Settings.frameHeight);
myJFrame.setVisible(true);
}
}
//////////////
class Settings
{
static int frameWidth = 100;
static int frameHeight = 200;
}
Run Code Online (Sandbox Code Playgroud) 在我的Java应用程序中,以下两个都将编译并运行,并产生所需的结果.
//"Rotate" the list items one place to the left.
myLinkedList.addLast(myLinkedList.removeFirst());
Run Code Online (Sandbox Code Playgroud)
并且在相反方向上"旋转"
//"Rotate" the list items one place to the right.
myLinkedList.addFirst(myLinkedList.removeLast());
Run Code Online (Sandbox Code Playgroud)
两个"旋转"每个只需要一行代码,但我想知道这是否是正确的方法呢?这种方法有什么缺陷吗?
是否有更好,更强大,更容易出错的方式,就像我上面所做的那样,需要多行代码才能实现,如果有,请解释原因.
当涉及到工厂类和方法,模式等的使用时,我是一个完全新手 - 实际上我在浏览Java相关问题时首先在Stackoverflow上学到了它们:-)
为了回应我之前的一个问题,建议我在开发GUI的过程中研究Builder模型的使用,因此我正在寻找易于理解的示例,演示应用程序的用户界面如何使用此模式和方法链等
谢谢阅读.
我想使用工厂类和方法来生成GUI组件,但我不知道应该如何以及在哪个类中声明各种侦听器并将其添加到组件中.
如果我有一个简单的工厂类,如下面列出的那样,我应该在它返回到调用类之前向该按钮添加一个ActionListener.如果答案为"是",那么如何添加监听器?
class GUIFactory
{
public static JButton getJButton()
{
JButton aButton = new JButton();
return aButton;
}
}
Run Code Online (Sandbox Code Playgroud)
假设我想使用getJButton()方法向GUI添加5个按钮,我将如何编写ActionListener以便知道单击了哪个按钮?
或者应该将监听器添加到调用类中?
JFrame gui = new JFrame();
gui.add(AppFactory.getJButton());
Run Code Online (Sandbox Code Playgroud)
我尝试了以下内容
gui.add(GUIFactory.getJButton().addActionListener(new guiButtonListener()));
Run Code Online (Sandbox Code Playgroud)
并得到一个错误:
这里不允许使用"void"类型.
我想在一个应用程序中使用CheckedListBox,其中ListBox中的每个项目都是我的硬盘驱动器上的文件夹的名称,并且为了从这些文件夹中读取和写入文本文件,我希望确保只有一个文件夹可以在CheckedListBox中的任何一个时间选择一个项目(文件夹)
如何通过C#中的代码实现这一目标?
谢谢阅读 :-)
编辑\更新 - 22/10/2010感谢所有花时间回复的人 - 尤其是Adrift,其更新后的代码完美无缺.
我很欣赏一些评论员对我以这种方式使用checkedlistbox的看法,但是我认为这完全符合我的目的,因为我希望毫无疑问地将文本文件从哪里读取和写入.
祝一切顺利.
我正在开发一个简单的基于JFrame的GUI,我已经添加了一个JMenuBar,而后者又添加了常用的JMenuItems - "File:","Edit:"等.
我希望能够在JMenuBar的最右侧添加另一个JMenuItem - "关于:".这可能没有太多的hackery - 如果可能的话,我想要一个简单,简单的方法来做到这一点?
这就是我想要实现的目标:
----------------------------------------------------------------------------------------
File: Edit: Tools: About:
----------------------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮忙:-)
编辑\更新 - 12-8-2010:编辑我的问题的标题来阅读JMenu而不是JMenuItem.
编译了一个简单的应用程序来测试下面接受的答案中给出的代码,它完美地工作!
当我循环遍历一个对象数组时,为什么使用原始数据类型在第二个"for-each"循环中工作.是否有一个回流到幕后发生的原始对象的原始对象?
import java.util.Arrays;
import java.util.Collections;
public class CodeTestingClass
{
public static void main(String[] args)
{
Integer[] array = {1,2,3,4,5};
Collections.rotate(Arrays.asList(array), 1);
System.out.println(Arrays.toString(array) + "\n" );
for(Integer i : array)
{
System.out.print(i);
}
System.out.print("\n");
for(int i : array)
{
System.out.print(i);
}
}
}
Run Code Online (Sandbox Code Playgroud) 在我的Winforms应用程序中,我有一个带有嵌套子项的ToolStripMenuItem,其结构如下所示.
文件
.+ ...添加为.... + .....文件
............................文件夹
.. ..........................根文件夹
在"添加为"下,我希望能够以编程方式启用和禁用"文件","文件夹"和"根文件夹".如何在代码中访问这些嵌套项?
我试过ToolStripMenuItem.DropDownItems [0] .Enabled = true\false; 但这会影响菜单hiearachy中的"Add As"及其下方的所有内容.
如果我在上面的代码中使用大于零的索引,我得到一个'索引超出范围'错误.我如何实现此功能?