从Java教程:
最后,还有一种特殊的文字称为类文字,通过采用类型名称并附加"
.class"来形成; 例如,String.class.这指的Class是表示类型本身的对象(类型).
这个文字可以分配给哪种类型的变量?
如果可能,请举一个小例子.
我们正在制作一个相当大的Swing应用程序,它必须实现MVC模式.该应用程序目前看起来像这样:
有很多观点.它们以分层方式创建,其中一个主视图包含(并创建)多个视图,这些视图都包含它们自己的子视图集等.每个视图通过调用模型从模型独立地从其他视图中检索信息必要时的静态方法.
还有不少控制器都完全相互分离.每个控制器都属于一个视图.每个视图都创建自己的控制器,并将控制器添加为用户输入的侦听器.控制器从视图接收事件,然后通过模型静态方法修改模型.当视图调度不影响模型但仅影响视图的事件时,视图会自行处理这些事件 - 而不通知控制器事件.也就是说,控制器完全不知道视图,控制器的目的只是处理模型的操作.| 编辑:控制器目前是他们观点的附件; 它们只包含事件处理的逻辑.也就是说,控制器本身不是组件,并且不包含组件.它们的实现方式与以下示例相同:MVC示例 |
应用程序中的模型非常被动,甚至没有侦听器(它代表数据库).它从控制器接收更新.
在此示例中,视图拥有控制器.如果控制器拥有并创建视图,并且如果让视图不知道控制器而不是相反的情况,那么在一般情况下会更好吗?在那种情况下,为什么?这将如何设计?如果没有,是否有更好的设计,控制器仍然没有意识到这些观点?或者,也许是他们中最好的设计?
编辑:
"视图负责建立这种相互通信......"似乎表明视图创建了控制器,或者至少具有对控制器的初始引用,反之亦然.
所以这至少是一种可行的方法(它是一种有效的MVC模式),但主要问题仍然存在; 哪个更好,最好的设计会是怎样的?特别是在处理与其各自视图密切相关的许多控制器时?
我刚开始用Swing学习GUI,并不完全理解该actionPerformed方法的工作原理.请考虑以下代码:
//code to create a button and change its text when clicked
public class simplegui implements ActionListener {
JButton button;
public static void main(String[] args) {
simplegui gui=new simplegui();
gui.go();
}
public void go() {
JFrame frame=new Frame();
button=new JButton("click Me");
button.addActionListener(this);
frame.getContentPane().add(button);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300,300);
frame.setVisible(true);
}
public void actionPerformed(ActionEvent event) {
button.setText("I've been clicked!");
}
}
Run Code Online (Sandbox Code Playgroud)
在引发方法之前,不应该为类创建对象(静态方法除外)?
单击该按钮时会actionPerformed调用该方法,但如何?电话在哪里?我已经实现了接口ActionListener,但是代码知道当一个动作发生时,'ActionEvent'对象应该被发送到'actionPerformed'方法?它出现在Button类中吗?该addActionListener方法是否存在于Button类中?
单击按钮时,系统调用操作如何执行以及执行的代码在gui.actionPerformed()哪里?
我一直遵循旧的OO,静态等Java概念,但这整个事件驱动编程令人困惑.
我有一个主窗口:
public class MainPanel extends JFrame implements MouseListener {
public MainPanel() {
setLayout(new FlowLayout());
setDefaultCloseOperation(EXIT_ON_CLOSE);
addMouseListener(this);
ChildPanel child = new ChildPanel();
add(child);
JPanel spacer = new JPanel();
spacer.setPreferredSize(new Dimension(50, 50));
add(spacer);
pack();
setLocationRelativeTo(null);
}
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("Mouse click event on MainPanel");
}
}
Run Code Online (Sandbox Code Playgroud)
和一个孩子JPanel:
public class ChildPanel extends JPanel implements MouseListener {
public ChildPanel() {
setBackground(Color.RED);
setPreferredSize(new Dimension(200, 200));
//addMouseListener(this);
}
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("Mouse click event on ChildPanel");
}
}
Run Code Online (Sandbox Code Playgroud)
通过addMouseListener …
我正在尝试在Java Swing中构建一个MVC应用程序.我有一个包含四个JComboBox的JPanel,这个JPanel嵌入到父JPanel中.除了子JPanel之外,父JPanel还有其他控件.
每当我更改JComboBoxes的值时,JPanel的模型都会正确更新(它基本上是一个日期选择器,每个日期,月份,月份和一小时都有一个组合框).我无法弄清楚的是,无论何时更改其中一个JComboBox,我都可以触发父JPanel的模型更新自身以匹配存储在子JPanel模型中的值.
下面是我所掌握的结构的简化SSCCE.谢谢.
import java.awt.event.*;
import javax.swing.*;
public class Example extends JFrame {
public Example() {
super();
OuterView theGUI = new OuterView();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
add(theGUI);
pack();
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new Example();
}
});
}
}
class OuterView extends JPanel {
public OuterView() {
super();
InnerView innerPanel = new InnerView();
JButton button = new JButton("display OuterView's model");
button.addActionListener(new ButtonListener());
add(innerPanel);
add(button);
}
private class ButtonListener implements ActionListener { …Run Code Online (Sandbox Code Playgroud) 我不明白这段代码的基本原理,取自javax.swing.event.EventListenerList docs:
protected void fireFooXXX() {
// Guaranteed to return a non-null array
Object[] listeners = listenerList.getListenerList();
// Process the listeners last to first, notifying
// those that are interested in this event
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i]==FooListener.class) {
// Lazily create the event:
if (fooEvent == null)
fooEvent = new FooEvent(this);
((FooListener)listeners[i+1]).fooXXX(fooEvent);
}
}
}
Run Code Online (Sandbox Code Playgroud)
事件触发在javax.swing.tree.DefaultTreeModel等中以这种方式实现,所以显然我只是没有得到什么.
我编写了自己的表格单元格编辑器,用于扩展AbstractCellEditor和实现a TableCellEditor,an ItemListener和a MouseListener.有没有办法让mouseClicked方法在itemStateChanged方法之前先执行?我正在尝试执行以下操作:
private int rowClicked;
private JTable table;
public void itemStateChanged(ItemEvent e) {
if (rowClicked == 5) {
// Do something to row 5.
}
}
public void mouseClicked(MouseEvent e) {
Point p = e.getPoint();
rowClicked = table.rowAtPoint(p);
}
Run Code Online (Sandbox Code Playgroud) 我有一个JFrame和,里面JFrame有两个JPanels.当我按下一个键时,他们都必须听这个关键事件并采取行动.我想拍摄所有的键盘事件,并将它们传递给两个JPanel.你知道怎么做吗?
编辑:因为他们必须做不同的事情,我需要两个不同的听众,抱歉没有具体.
Edit2:我制作了一个简单的代码来向您展示问题.当我按下向上键时,JPanel显示的两个必须改变它们的字符串; 在这段代码中,其中只有一个实际上有所反应
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
/**
*
* @author antonioruffolo
*/
public class TwoPanelsTest extends JFrame {
public TwoPanelsTest() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
setResizable(false);
setSize(800, 600);
PanelTest panelTest1= new PanelTest();
PanelTest panelTest2= new PanelTest();
GridBagLayout layout= new GridBagLayout();
this.setLayout(layout);
GridBagConstraints c = new GridBagConstraints();
c.ipadx …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个包含JPanel的JFrame,其中只包含选择RGB颜色所需的内容.我一直在搞乱JColorChooser,AbstractColorChooserPanel和ColorModel,阅读Oracle教程,但我没有理解如何开发我想要的东西.我甚至下载了OpenJDK源来获取这些类的源代码,但仍然没有.我想得到的是:

Alpha的东西应该消失,颜色代码字段应该设置为不可见但继续工作,这样我可以在单击"是"按钮时检索代码(我想在actionPerformed方法中).同样,它是覆盖paintComponent方法的一个很好的补充.
提前致谢.
编辑:这就是我现在拥有的东西(上面的照片,没有'油漆'编辑):
for (final AbstractColorChooserPanel accp : panels) {
if (accp.getDisplayName().equals("RGB")) {
JOptionPane.showOptionDialog(Main.frame, accp,
"Color selection tool", JOptionPane.OK_OPTION,
JOptionPane.QUESTION_MESSAGE, null, null, 0);
}
}
Run Code Online (Sandbox Code Playgroud)
编辑2:到目前为止,我已经能够删除alpha的东西,但我还不能"找到"显示颜色代码的标签和字段,所以他们继续显示,另外,因为我可以没有访问该字段,我无法访问颜色代码:

这是这个代码:
package edu.utils;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import javax.swing.JColorChooser;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JSpinner;
import javax.swing.WindowConstants;
import javax.swing.colorchooser.AbstractColorChooserPanel; …Run Code Online (Sandbox Code Playgroud) 我一直在仔细阅读JMapViewer的开源代码.如果有其他人希望查看它,请检查SVN.
简而言之,主要类是JMapViewer,它是一个扩展JPanel.还有一种叫非常重要的一类DefaultMapController充当MouseListener主类.
我注意到的第一个奇怪的事情是观众没有对控制器的引用.该JMapViewer构造器实例的一个匿名实例DefaultMapController,就像这样:
public JMapViewer() {
// other stuff
new DefaultMapController(this);
}
Run Code Online (Sandbox Code Playgroud)
在我看来这是一个糟糕的设计选择,因为控制器有很多方法(选项,切换等 - 下面显示的例子),现在根本无法访问,那么它们有什么用呢?
public void setMovementMouseButton(int movementMouseButton) {
// changes which mouse button is used to move the map
}
Run Code Online (Sandbox Code Playgroud)
控制器确实有一个对查看器的引用,如上面的第一个片段所示,这是它能够控制的方式.
然而,那时我想到的东西更怪异!如果这个监听器的匿名实例没有引用,为什么它甚至可以存活?GC不应该迅速摧毁它吗?或者GC是否足够聪明,知道引用live的侦听器类也JComponent必须保持活动才能正常工作,即使它因某些奇怪的原因没有名称?
那么,有两个真正的问题:
我想为这个开源库做贡献,我改变的第一个想法是改变JMapViewer类以使一个字段引用其控制器,并更改构造函数以将当前的匿名控制器分配给这个新字段.但是,我想确保我不会无知地遗漏某些东西.我在整个代码库中搜索了文本DefaultMapController,它只出现在它自己的类定义中,以及JMapViewer构造函数中的匿名实例化中.
编辑:
确实有一种方法可以通过使用该java.awt.Component方法来访问匿名侦听器getMouseListeners().从技术上讲,在我的应用程序中,我可以搜索此集合的实例DefaultMapController,并使用它来访问我需要用来更改控制器选项的方法.
但是,为了扮演魔鬼的拥护者,如果我按照原始想法并给地图作为其控制器的参考,现在我有一种循环参考(地图知道控制器和控制器知道地图).这是一个坏主意吗?
如何以编程方式触发更改侦听器JSlider?
java ×11
swing ×10
events ×2
jpanel ×2
color-picker ×1
decoupling ×1
jcombobox ×1
jmapviewer ×1
jslider ×1
listener ×1
listeners ×1
literals ×1
methods ×1