- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 MVC 架构模式构建一个简单的 Java Swing 应用程序。我所做的是在我的 View 中创建用户界面组件(作为私有(private)的),并具有返回组件的公共(public)方法。然后 Controller 调用这些方法,通过它们我可以为事件/ Action 监听器编写方法。下面是一个示例:
查看:
private JButton btnAdd;
public JButton getBtnAdd(){
return btnAdd;
}
控制:
myGuiFrame gui = new myGuiFrame();
//on add button clicked
gui.getBtnAdd().addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//calls to model
}
});
这个实现是否正确?
如果是这样,那么我遇到了 FocusListeners 的问题。当我在 View 中创建 FocusListener 时,会在 View 中创建 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
}
};
我希望所有事件处理程序都在我的 Controller 中。我的问题是......有没有一种方法可以从我的 Controller 调用/声明 focusLost 和 focusGained 方法?我试图将 FocusListener 定义为公共(public)的,以便我可以在我的 Controller 中定义它:
查看:
public FocusListener l;
public someComponentType someComponent;
Controller :
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);
}
};
但这不起作用。
是否可以从 Controller 处理 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!!!");
}
});
在 Controller 中可以按照我计划的方式正常工作,尽管我非常喜欢 nIcE cOw 的处理方式。出于好奇,是否存在在 Swing 应用程序上实现 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());
}
}
}
如果您对 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();
}
});
}
}
关于java - Java Swing FocusListener的MVC实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10246511/
我目前正在研究我们小组第一学期考试项目的 GUI 部分,我遇到了一个关于回调和事件处理的奇怪问题。 有点偏离主题:我已经用谷歌搜索了这个问题,但确实找不到任何在 Java 中使用回调的具体示例,所以从
我正在尝试将 focusListener 添加到 JDateChooser,以便当用户选择 dateOfBirth 时,当焦点丢失时,它会在文本字段上显示年龄。但它不起作用这是我尝试过的方法, 导入j
我有一个 JFrame,我想在用户单击它时将其关闭。我有两个 JTextFields 和一个 JButton(用户名、密码、提交)。当我为他们提供所有 FocusListener 时,只要用户从一个字
我必须扩展一些代码来实现一个 ActionListener,该监听器使用 ActionCommands 来获取有关触发 ActionEvent 的组件所属对象的更多信息。 同一段代码现在还应该实现 F
我在 JFrame 中有 2 个文本字段,当焦点从 textfield1 丢失时,我想验证 textfield1 中的数据。因此,我在 FocusLost() 方法中使用了 FocusListener
我一直在研究有关 JInternalFrames 的各种问题,并尝试按照建议实现代码,但我似乎做错了一些事情。我在这里包含的代码将演示我的问题。三个框架已创建,但当您单击并移动它们时,它们不会按预期到
有一个 SWT 文本框。我正在为其设置默认文本。 设置焦点监听器,以便当焦点位于文本框上时,删除默认文本。 设置验证监听器以确保仅输入字母。 但是,当焦点设置在文本框上时,文本不会设置为空。是什么导致
在我的代码中,当我尝试将 FocusListener 添加到 JTextField 时,它说 ChatClient.java:30: error: incompatible types: ChatCl
我有一个文本字段,我必须在其中验证电子邮件。我的问题是,我只想在电子邮件有效时将焦点从文本字段移开。我现在使用 FocusAdapter。有人可以给我一些其他的想法吗? 最佳答案 参见javax.sw
我有 JTextField。我需要保存更改,如果用户在其中写了一些东西然后失去了焦点(比如点击其他地方) mMaxLabelLength = new JTextField(); mMaxLabelLe
import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.*; import java.ne
我创建了一个使用 FocusListener 来确保文本字段的值始终为正的应用程序。当用户输入负值,然后单击“tab”键将焦点从文本字段移开时,该值将乘以-1,从而得到正值。但是,当我运行该应用程序时
一些背景:我是一个相当有经验的 C++ 程序员,但我目前正在自学 Java。 我有一个包含多个 JTextField 的应用程序,我希望在单击某个字段时突出显示该字段的内容。我知道我可以为每个人编写一
我有以下代码: Display display = new Display(); Shell shell = new Shell(display); s
首先:抱歉,我无法提供 SSCCE。我试图在一个小项目上重现这个问题,但没有成功,或者我应该说成功了,因为它在那里工作! 所以这是我的问题:我有一个可编辑的 JCombobox,它应该通过单击编辑器组
此问题出现在my last question here之后。我想将每个按钮聚焦和失去焦点背景设置为主菜单(ContentPane 即 JPanel)下方的背景颜色,因此按钮看起来像选项卡。它在不同的环
我有一个文本框,我想在文本框获得焦点时显示一个对话框。所以我写了以下代码。但是当对话框被处理后,对话框会再次出现。我尝试使用换行符进行调试和检查。那次它不会执行多次,但在正常模式下它会执行多次,因此对
因此,当我单击 JTextfield 中的一个时,我想setText一个名为value的字符串。我读到有关将 FocusListener 添加到 JTextField 的内容,但找不到有关将其添加到
我有两个实现 KeyListener 和 FocusListener 接口(interface)的类。两者都不起作用,但如果我不通过注释或删除以下内容来添加 JButton:add(whiteJBut
我的 Java 应用程序中有数百个 JTextFields,我想在所有这些上添加 FocusListener 以设置文本的水平对齐并在每个文本字段上添加 FocusListener。所以,我做了这个方
我是一名优秀的程序员,十分优秀!