我只想了解秋千的一些知识1)如何在秋千中使用MVC模型?2)说我有一个主窗口,我需要将菜单作为单独的类,将所有组件作为单独的类,这将是集成它的最佳方法
好的,这被称为过度矫正地回答,对此感到抱歉,但这是我快速举过的一个简单示例,尝试使用简单的MVC模式完成一些琐碎的事情:按下按钮并更改JTextField中的文本。这太过分了,因为您可以只用几行代码就可以完成相同的操作,但是它确实在单独的文件中说明了某些MVC以及模型如何控制状态。请问任何令人困惑的问题!
汇集所有内容并开始工作的主要课程:
import javax.swing.*;
public class SwingMvcTest {
private static void createAndShowUI() {
// create the model/view/control and connect them together
MvcModel model = new MvcModel();
MvcView view = new MvcView(model);
MvcControl control = new MvcControl(model);
view.setGuiControl(control);
// EDIT: added menu capability
McvMenu menu = new McvMenu(control);
// create the GUI to display the view
JFrame frame = new JFrame("MVC");
frame.getContentPane().add(view.getMainPanel()); // add view here
frame.setJMenuBar(menu.getMenuBar()); // edit: added menu capability
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
// call Swing code in a thread-safe manner per the tutorials
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
createAndShowUI();
}
});
}
}
视图类:
import java.awt.*;
import java.awt.event.*;
import java.beans.*;
import javax.swing.*;
public class MvcView {
private MvcControl control;
private JTextField stateField = new JTextField(10);
private JPanel mainPanel = new JPanel(); // holds the main GUI and its components
public MvcView(MvcModel model) {
// add a property change listener to the model to listen and
// respond to changes in the model's state
model.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
// if the state change is the one we're interested in...
if (evt.getPropertyName().equals(MvcModel.STATE_PROP_NAME)) {
stateField.setText(evt.getNewValue().toString()); // show it in the GUI
}
}
});
JButton startButton = new JButton("Start");
startButton.addActionListener(new ActionListener() {
// all the buttons do is call methods of the control
public void actionPerformed(ActionEvent e) {
if (control != null) {
control.startButtonActionPerformed(e); // e.g., here
}
}
});
JButton endButton = new JButton("End");
endButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (control != null) {
control.endButtonActionPerformed(e); // e.g., and here
}
}
});
// make our GUI pretty
int gap = 10;
JPanel buttonPanel = new JPanel(new GridLayout(1, 0, gap, 0));
buttonPanel.add(startButton);
buttonPanel.add(endButton);
JPanel statePanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 0));
statePanel.add(new JLabel("State:"));
statePanel.add(Box.createHorizontalStrut(gap));
statePanel.add(stateField);
mainPanel.setBorder(BorderFactory.createEmptyBorder(gap, gap, gap, gap));
mainPanel.setLayout(new BorderLayout(gap, gap));
mainPanel.add(buttonPanel, BorderLayout.CENTER);
mainPanel.add(statePanel, BorderLayout.PAGE_END);
}
// set the control for this view
public void setGuiControl(MvcControl control) {
this.control = control;
}
// get the main gui and its components for display
public JComponent getMainPanel() {
return mainPanel;
}
}
控件:
import java.awt.event.ActionEvent;
public class MvcControl {
private MvcModel model;
public MvcControl(MvcModel model) {
this.model = model;
}
// all this simplistic control does is change the state of the model, that's it
public void startButtonActionPerformed(ActionEvent ae) {
model.setState(State.START);
}
public void endButtonActionPerformed(ActionEvent ae) {
model.setState(State.END);
}
}
该模型使用PropertyChangeSupport对象来允许其他对象(在这种情况下为View)侦听状态变化。因此,模型实际上是我们的“可观察”模型,而视图是“观察者”模型
import java.beans.*;
public class MvcModel {
public static final String STATE_PROP_NAME = "State";
private PropertyChangeSupport pcSupport = new PropertyChangeSupport(this);
private State state = State.NO_STATE;
public void setState(State state) {
State oldState = this.state;
this.state = state;
// notify all listeners that the state property has changed
pcSupport.firePropertyChange(STATE_PROP_NAME, oldState, state);
}
public State getState() {
return state;
}
public String getStateText() {
return state.getText();
}
// allow addition of listeners or observers
public void addPropertyChangeListener(PropertyChangeListener listener) {
pcSupport.addPropertyChangeListener(listener);
}
}
一个简单的枚举State来封装state的概念:
public enum State {
NO_STATE("No State"), START("Start"), END("End");
private String text;
private State(String text) {
this.text = text;
}
@Override
public String toString() {
return text;
}
public String getText() {
return text;
}
}
编辑:我看到您也提到了菜单,所以我添加了菜单支持,并添加了此类以及在SwingMcvTest类中添加了几行。请注意,由于代码分离,因此对GUI进行更改很简单,因为所有菜单所需要做的就是调用控制方法。它不需要了解模型或视图:
import java.awt.event.ActionEvent;
import javax.swing.*;
public class McvMenu {
private JMenuBar menuBar = new JMenuBar();
private MvcControl control;
@SuppressWarnings("serial")
public McvMenu(MvcControl cntrl) {
this.control = cntrl;
JMenu menu = new JMenu("Change State");
menu.add(new JMenuItem(new AbstractAction("Start") {
public void actionPerformed(ActionEvent ae) {
if (control != null) {
control.startButtonActionPerformed(ae);
}
}
}));
menu.add(new JMenuItem(new AbstractAction("End") {
public void actionPerformed(ActionEvent ae) {
if (control != null) {
control.endButtonActionPerformed(ae);
}
}
}));
menuBar.add(menu);
}
public JMenuBar getMenuBar() {
return menuBar;
}
}
上帝,这是很多琐碎的代码!我提名自己和我的代码来获得本周的stackoverflow Rube Goldberg奖。
方法和由于某种原因没有被计算。 如何返回结果, 谢谢你!
问题内容: 在python中,我可以使用装饰器向类添加方法。是否有类似的装饰器将属性添加到类?我可以更好地表明我在说什么。 我上面使用的语法是否可能还是需要更多的语法? 我想要类属性的原因是可以延迟加载类属性,这似乎很合理。 问题答案: 这是我的处理方式: 在我们打电话时,设置员没有工作 ,因为我们正在打电话 ,而不是。 添加元类定义可以解决此问题: 现在一切都会好起来的。
我已经学会了我可以使用参考文献来实现这一点。但是,当我将一个ref与几个TextInputs一起使用时,我只与最后一个TextInputs一起使用
问题内容: 我目前正在将H2O用于分类问题数据集。我正在python 3.6环境中对其进行测试。我注意到预测方法的结果是给出0到1之间的值(我假设这是概率)。 在我的数据集中,目标属性是数字,即值是1且值是0。我确保将类型转换为目标属性的类别,但仍得到相同的结果。 然后我修改了代码,仍然使用H2OFrame上的方法将目标列转换为因数,结果没有任何变化。 但是,当我分别将target属性中的值分别更
问题内容: 我正在使用Java版本的Google App Engine。 我想创建一个可以接收许多类型的对象作为参数的函数。我想打印出对象的成员变量。每个对象可能不同,并且该功能必须适用于所有对象。我必须使用反射吗?如果是这样,我需要编写哪种代码? 我将如何编写函数getObject? 问题答案: 是的,您确实需要反思。它会像这样: 有关更多信息,请参见反射教程。
问题内容: 如果我将Class声明为字段: Eclipse给我警告: 类是原始类型。对泛型类型Class的引用应参数化 在实践中这意味着什么?我为什么要这样做呢?如果我要求Eclipse提供“快速修复”,它将给我: 这似乎并没有增加太多价值,但不再发出警告。 编辑:为什么类通用?您能否举一个参数化的例子,即可以有效使用除以外的东西吗? 编辑:哇!我还没有意识到这一点。我也看过Java拼图游戏,这肯