如何在自己的私有 void 中正确使用 JFrame
Posted
技术标签:
【中文标题】如何在自己的私有 void 中正确使用 JFrame【英文标题】:How to properly use JFrame in its own private void 【发布时间】:2012-12-31 23:45:58 【问题描述】:所以基本上我在这里有点困惑,我使用的是用于 Eclipse 的 WindowsPro Builder 插件,它使所有 JFrame 组件都在一个自定义的 initialize() 类中。这给我带来了一个问题,通常我会在开始时定义我的组件,以便我可以通过我的程序公开访问它们。不,我有第二节课,但我无法访问我的组件。例如,我不知道如何为整个初始化类制作统一的 ActionListener。
我也想从 textarea 获取输入,但我该怎么做呢?当一切都在范围之外?如您所见,我调用了 SaveToFile 类,在该类中我想从 textarea 获取输入,但我该怎么做呢?
import javax.swing.*;
public class FunctionsGUI
private JFrame frame;
/**
* Launch the application.
*/
public static void main(String[] args)
EventQueue.invokeLater(new Runnable()
public void run()
try
FunctionsGUI window = new FunctionsGUI();
window.frame.setVisible(true);
catch (Exception e)
e.printStackTrace();
);
/**
* Create the application.
*/
public FunctionsGUI()
initialize();
/**
* Initialize the contents of the frame.
*/
private void initialize ()
try
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
catch(Exception e)
System.out.println("Error setting native LAF: " + e);
frame = new JFrame();
frame.setBounds(100, 100, 571, 531);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
SpringLayout springLayout = new SpringLayout();
frame.getContentPane().setLayout(springLayout);
JTextPane textPane = new JTextPane();
springLayout.putConstraint(SpringLayout.NORTH, textPane, 10, SpringLayout.NORTH, frame.getContentPane());
springLayout.putConstraint(SpringLayout.WEST, textPane, 10, SpringLayout.WEST, frame.getContentPane());
springLayout.putConstraint(SpringLayout.SOUTH, textPane, 462, SpringLayout.NORTH, frame.getContentPane());
springLayout.putConstraint(SpringLayout.EAST, textPane, 545, SpringLayout.WEST, frame.getContentPane());
frame.getContentPane().add(textPane);
frame.setLocationRelativeTo(null);
frame.setTitle("Calcolo");
JMenuBar menuBar = new JMenuBar();
frame.setJMenuBar(menuBar);
JMenu mnFile = new JMenu("File");
menuBar.add(mnFile);
final JMenuItem mntmSave = new JMenuItem("Save");
mntmSave.addActionListener(new ActionListener()
public void actionPerformed(ActionEvent e)
SaveToFile sv = new SaveToFile();
);
mnFile.add(mntmSave);
JMenu mnOptions = new JMenu("Options");
menuBar.add(mnOptions);
JMenu mnHelp = new JMenu("Help");
menuBar.add(mnHelp);
final JMenuItem AboutMenu = new JMenuItem("About");
AboutMenu.addActionListener(new ActionListener()
public void actionPerformed(ActionEvent e)
if (e.getSource().equals(AboutMenu))
JDialog dialog = new JDialog();
dialog.setTitle("Search Dialog");
dialog.getContentPane().add(new JLabel("Just a test"));
dialog.setSize(300,300);
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
dialog.setLocationRelativeTo(frame);
dialog.setVisible(true);
if (e.getSource().equals(mntmSave));
SaveToFile sv = new SaveToFile ();
);
mnHelp.add(AboutMenu);
【问题讨论】:
【参考方案1】:Eclipse的WindowsPro Builder插件,它使所有的JFrame 自定义初始化 () 类中的组件。
initialize()
只是一个方法而不是一个类。这里的班级是FunctionsGUI
。
这给我带来了一个问题,通常我在 开始,以便我可以通过我的程序公开访问它们。
这取决于你在做什么,但这可能是一个糟糕的设计。
不,我有第二节课,但我无法访问我的组件。
实现一个 getter 以返回您需要的组件(甚至是所有组件)。
如你所见,我调用了 SaveToFile 类,在该类中我想获得 来自 textarea 的输入,但我该怎么做呢?
例如,您可以将JTextField
的引用传递给构造函数中的SaveToFile
类。
【讨论】:
谢谢,当然这是一种方法.. 我的错.. 我现在明白了,但是我将如何处理动作监听器?我是否必须像现在这样为每个按钮实现一个?或者我可以为整个方法初始化一个 ActionListener 吗?例如,如果我只是有没有方法的 FunctionGUI,我通常会在这里实现一个 ActionListener .. 我现在怎么能这样做,因为它在初始化函数中? :)【参考方案2】:我想告诉你一个方法。在 SaveToFile 类中有一个可以接受 String 的构造函数,如下所示。将文本窗格中的文本作为字符串传递给此构造函数或方法。甚至一种方法也很好。但是有这两个中的任何一个。
public class SaveToFile
public SaveToFile(String textinput)
System.out.println(textinput);
// if you prefer to have a differrent method do like below.
public void doSomething(String textinput)
System.out.println(textinput);
现在将您的听众更改为如下所示,
final JMenuItem mntmSave = new JMenuItem("Save");
mntmSave.addActionListener(new ActionListener()
public void actionPerformed(ActionEvent e)
SaveToFile sv = new SaveToFile(textPane.getText());
);
如果你不想要构造函数,那么,
final JMenuItem mntmSave = new JMenuItem("Save");
mntmSave.addActionListener(new ActionListener()
public void actionPerformed(ActionEvent e)
SaveToFile sv = new SaveToFile();
sv.doSomething(textPane.getText());
);
我正在做的是将文本从文本面板发送到 SaveToFile 类。在那里你可以使用这个字符串。确保将 JTextPane 声明为 final,如下所示
final JTextPane textPane = new JTextPane();
现在您从文本窗格中获得了一个文本,该文本位于 SaveToFile 类的另一个类中。正如我所说,它只是“一种方式而不是方式”。
【讨论】:
以上是关于如何在自己的私有 void 中正确使用 JFrame的主要内容,如果未能解决你的问题,请参考以下文章
如何使用Powermockito以便跳过私有void方法[重复]
如何使用 Powermockito 以便跳过私有 void 方法[重复]