gre*_*alu 2 java model-view-controller swing focus listener
我正在尝试使用MVC架构模式构建一个简单的Java Swing应用程序.我所做的是在我的视图中创建用户界面组件(作为私有),并具有返回组件的公共方法.然后由控制器调用这些方法,通过它我可以为事件/动作侦听器编写方法.以下是一个示例示例:
视图:
private JButton btnAdd;
public JButton getBtnAdd(){
return btnAdd;
}
Run Code Online (Sandbox Code Playgroud)
控制:
myGuiFrame gui = new myGuiFrame();
//on add button clicked
gui.getBtnAdd().addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//calls to model
}
});
Run Code Online (Sandbox Code Playgroud)
这个实现是否正确?
如果是这样,那么我遇到了FocusListeners的问题.当我在视图中创建FocusListener时,会在视图中创建focusLost和focusGained方法.
private FocusListener l;
someComponent.addFocusListener(l);
l = new FocusListener() {
@Override
public void focusLost(FocusEvent e) {
// TODO Auto-generated method stub
}
@Override
public void focusGained(FocusEvent e) {
// TODO Auto-generated method stub
}
};
Run Code Online (Sandbox Code Playgroud)
我希望所有的事件处理程序都在我的控制器中.我的问题是......有没有办法可以从我的控制器调用/声明focusLost和focusGained方法?我试图将FocusListener定义为public,以便我可以在我的控制器中定义它:
视图:
public FocusListener l;
public someComponentType someComponent;
Run Code Online (Sandbox Code Playgroud)
控制器:
gui.l = new FocusListener() {
@Override
public void focusLost(FocusEvent e) {
// TODO Auto-generated method stub
}
@Override
public void focusGained(FocusEvent e) {
// TODO Auto-generated method stub
gui.someComponent.addFocusListener(gui.l);
}
Run Code Online (Sandbox Code Playgroud)
};
然而,这不起作用.
是否可以从控制器处理FocusEvents?
编辑:
天哪,我的坏.不太明白罗宾是怎么回事.我过于注重在某处明确定义FocusListener.一个简单的:
gui.getTextFieldEmployeeCode().addFocusListener(new FocusListener() {
@Override
public void focusLost(FocusEvent e) {
// TODO Auto-generated method stub
}
@Override
public void focusGained(FocusEvent e) {
// TODO Auto-generated method stub
System.out.println("YES!!!");
}
});
Run Code Online (Sandbox Code Playgroud)
在控制器中我会按计划的方式工作得很好,不过我非常喜欢nIcE cOw如何去做.出于好奇,是否有标准或广泛接受的方式在Swing Apps上实施MVC?
据我所知,你这样做的方式就是这样.更好的是,我更喜欢匿名类,他们尊重封装的概念.在这里尝试一下这个代码,看看你能掌握的内容:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class View
{
private JButton focusButton;
private JButton spareButton;
private void createAndDisplayGUI()
{
JFrame frame = new JFrame("VIEW");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
JPanel contentPane = new JPanel();
contentPane.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));
focusButton = new JButton("GAINED/LOST");
focusButton.addFocusListener(new ButtonController(this));
spareButton = new JButton("SPARE");
spareButton.setOpaque(true);
spareButton.addActionListener(new ButtonController(this));
spareButton.addFocusListener(new ButtonController(this));
contentPane.add(focusButton);
contentPane.add(spareButton);
frame.setContentPane(contentPane);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public JButton getFocusButton()
{
return focusButton;
}
public JButton getSpareButton()
{
return spareButton;
}
public static void main(String... args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
new View().createAndDisplayGUI();
}
});
}
}
class ButtonController implements FocusListener, ActionListener
{
private View view;
private JButton focusButton;
private JButton spareButton;
public ButtonController(View v)
{
view = v;
focusButton = view.getFocusButton();
spareButton = view.getSpareButton();
}
public void actionPerformed(ActionEvent ae)
{
JButton button = (JButton) ae.getSource();
if (button == spareButton)
{
spareButton.setBackground(Color.BLUE);
focusButton.setEnabled(true);
}
}
public void focusGained(FocusEvent fe)
{
JButton button = (JButton) fe.getSource();
if (button == focusButton)
{
focusButton.setEnabled(true);
}
else if (button == spareButton)
{
spareButton.setBackground(Color.WHITE);
}
}
public void focusLost(FocusEvent fe)
{
JButton button = (JButton) fe.getSource();
if (button == focusButton)
{
focusButton.setEnabled(false);
}
else if (button == spareButton)
{
spareButton.setBackground(Color.DARK_GRAY.darker());
}
}
}
Run Code Online (Sandbox Code Playgroud)
另一种方法,如果您感到烦恼getters/setters并发送引用,则定义一个内部类,如下所示(前一个示例的简单解决方法):
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class View
{
private JButton focusButton;
private JButton spareButton;
private void createAndDisplayGUI()
{
JFrame frame = new JFrame("VIEW");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
JPanel contentPane = new JPanel();
contentPane.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));
focusButton = new JButton("GAINED/LOST");
focusButton.addFocusListener(new ButtonController());
spareButton = new JButton("SPARE");
spareButton.setOpaque(true);
spareButton.addActionListener(new ButtonController());
spareButton.addFocusListener(new ButtonController());
contentPane.add(focusButton);
contentPane.add(spareButton);
frame.setContentPane(contentPane);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
private class ButtonController implements FocusListener, ActionListener
{
public void actionPerformed(ActionEvent ae)
{
JButton button = (JButton) ae.getSource();
if (button == spareButton)
{
spareButton.setBackground(Color.BLUE);
focusButton.setEnabled(true);
}
}
public void focusGained(FocusEvent fe)
{
JButton button = (JButton) fe.getSource();
if (button == focusButton)
focusButton.setEnabled(true);
else if (button == spareButton)
spareButton.setBackground(Color.WHITE);
}
public void focusLost(FocusEvent fe)
{
JButton button = (JButton) fe.getSource();
if (button == focusButton)
focusButton.setEnabled(false);
else if (button == spareButton)
spareButton.setBackground(Color.DARK_GRAY.darker());
}
}
public static void main(String... args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
new View().createAndDisplayGUI();
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1419 次 |
| 最近记录: |