在处理swing组件时,以及在运行时更改组件时,一个(通常)需要在组件上调用revalidate()方法以便刷新它们.
确定是否需要重新验证组件的规则是什么?当某个组件上的某些特性发生变化时,swing会自动调用revalidate()吗?
我们正在制作一个相当大的Swing应用程序,它必须实现MVC模式.该应用程序目前看起来像这样:
有很多观点.它们以分层方式创建,其中一个主视图包含(并创建)多个视图,这些视图都包含它们自己的子视图集等.每个视图通过调用模型从模型独立地从其他视图中检索信息必要时的静态方法.
还有不少控制器都完全相互分离.每个控制器都属于一个视图.每个视图都创建自己的控制器,并将控制器添加为用户输入的侦听器.控制器从视图接收事件,然后通过模型静态方法修改模型.当视图调度不影响模型但仅影响视图的事件时,视图会自行处理这些事件 - 而不通知控制器事件.也就是说,控制器完全不知道视图,控制器的目的只是处理模型的操作.| 编辑:控制器目前是他们观点的附件; 它们只包含事件处理的逻辑.也就是说,控制器本身不是组件,并且不包含组件.它们的实现方式与以下示例相同:MVC示例 |
应用程序中的模型非常被动,甚至没有侦听器(它代表数据库).它从控制器接收更新.
在此示例中,视图拥有控制器.如果控制器拥有并创建视图,并且如果让视图不知道控制器而不是相反的情况,那么在一般情况下会更好吗?在那种情况下,为什么?这将如何设计?如果没有,是否有更好的设计,控制器仍然没有意识到这些观点?或者,也许是他们中最好的设计?
编辑:
"视图负责建立这种相互通信......"似乎表明视图创建了控制器,或者至少具有对控制器的初始引用,反之亦然.
所以这至少是一种可行的方法(它是一种有效的MVC模式),但主要问题仍然存在; 哪个更好,最好的设计会是怎样的?特别是在处理与其各自视图密切相关的许多控制器时?
我想复制这里显示的示例:
使用MiGLayout.我尝试了一些组合,但是当容器缩小时,我很难将按钮自动换行到新行.
有人可以提供这样做的工作示例吗?
编辑: 这是程序的shell:
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import net.miginfocom.swing.MigLayout;
public class MiGTest extends JFrame{
private JPanel jPanel;
private JButton jButton;
public static void main(String[] args) {
new MiGTest().setVisible(true);
}
public MiGTest(){
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new MigLayout("debug"));
initComponents();
addComponents();
pack();
}
private void addComponents() {
add(jPanel);{
for (int i = 0; i < 10; i++) {
jPanel.add(new JButton("" + i));
}
}
}
private void initComponents() {
jPanel = new JPanel(new MigLayout("debug"));
jButton = new JButton("Test");
}
}
Run Code Online (Sandbox Code Playgroud) 我和这个家伙有同样的困难:
与linewrap = true一起使用时,MigLayout JTextArea不会缩小
我使用了其中一个答案中描述的解决方案; 明确设置最小大小.如果将包含JTextArea的JPanel直接放在JFrame中,然后调整窗口大小,这可以正常工作.
但是,将包含JTextArea的面板放在JScrollPane中时,会再次出现同样的问题.这是为什么,以及如何解决这个问题?
干杯
编辑:一个例子
public class MiGTest2 extends JFrame{
public MiGTest2(){
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel(new MigLayout("fillx, debug", "[fill]"));
JTextArea textArea = new JTextArea();
textArea.setLineWrap(true);
panel.add(textArea, "wmin 10");
//panel.add(new JTextField());
JScrollPane scrollPane = new JScrollPane(panel);
//add(panel);
add(scrollPane);
pack();
}
public static void main(String[] args){
new MiGTest2().setVisible(true);
}
}
Run Code Online (Sandbox Code Playgroud)
如果取消注释//add(panel);,并注释add(scrollPane);,缩小窗口大小也会缩小JTextArea.也就是说,它不适用于JScrollPane.还要注意布局管理器在首次放大后缩小窗口大小时如何翻转并开始"摇动"其所有内容
我正在学习先决条件以及何时使用它们。有人告诉我,前提条件是
@pre fileName must be the name of a valid file
Run Code Online (Sandbox Code Playgroud)
不适合以下代码:
/**
Creates a new FileReader, given the name of file to read from.
@param fileName- the name of file to read from
@throw FileNotFoundException - if the named file does not exist,
is a directory rather than a regular file, or for some other reason cannot
be opened for reading.
*/
public FileReader readFile(String fileName) throws FileNotFoundException {
. . .
}//readFile
Run Code Online (Sandbox Code Playgroud)
为什么是这样?
编辑:另一个例子
作为示例,我们假设以下内容是以“正确”的方式完成的。请注意 IllegalArgumentException 和前提条件。请注意如何明确定义行为,以及如何在设置前提条件的情况下进行 throws …
此问题的后续问题: Swing 字体名称不匹配?(制作字体选择器,并尝试在 JComboBox 中显示默认系统字体)
看来有逻辑字体和物理字体。逻辑字体有:Serif、SansSerif、Monospaced、Dialog 和 DialogInput。
这些字体是动态的,它们各自的物理字体(它们在程序执行期间表示的字体)是在程序加载时决定的。
我需要访问这些逻辑字体的物理字体。
我的第一个想法是尝试加载这些文件: http://download.oracle.com/javase/6/docs/technotes/guides/intl/fontconfig.html#loading
通过使用这样的东西: http ://www.rgagnon.com/javadetails/java-0434.html
public static Properties load(String propsName) throws Exception {
Properties props = new Properties();
URL url = ClassLoader.getSystemResource(propsName);
props.load(url.openStream());
return props;
}
Run Code Online (Sandbox Code Playgroud)
然后从这些属性文件中获取物理字体。
但是,当我尝试使用第一个文件中的名称加载属性时,我刚刚收到 NullPointerExceptions(未找到它们,但我已检查并实际上在我的系统上找到了它们)。我不知道为什么我会得到这个,但无论如何,我不禁想一定有一种更简单的方法来做到这一点?
如果我的应用程序中有一个庞大的Swing组件需要很长时间来初始化,并且想要同时在我的GUI中的不同位置显示该组件,我最好如何做到这一点?
GUI用户必须能够与组件的不同副本进行交互(例如,它们可以用作镜像).
假设有人可能想要动态显示该组件的副本,具体取决于GUI用户的输入(也就是说,我们不希望预先加载同一组件的许多副本).
宣告后
private static Preferences systemPrefs = Preferences.systemNodeForPackage (SomeClass.class);
Run Code Online (Sandbox Code Playgroud)
,这些代码行之一:
String someString = systemPrefs.put("someKey", "someValue");
String someString = systemPrefs.get("someKey", "someDefaultValue");
Run Code Online (Sandbox Code Playgroud)
导致此错误,在程序执行的其余部分中反复重复:
java.util.prefs.FileSystemPreferences syncWorld
VARNING: Couldn't flush system prefs: java.util.prefs.BackingStoreException: /etc/.java/.systemPrefs/edu create failed.
我怀疑某处存在某种安全问题.
可能是因为某种原因这个问题特定于这台电脑吗?还有其他原因吗?
java ×8
swing ×6
exception ×2
miglayout ×2
classloader ×1
components ×1
decoupling ×1
file ×1
fonts ×1
invalidation ×1
jscrollpane ×1
jtextarea ×1
layout ×1
load ×1
preferences ×1
reusability ×1
store ×1
validation ×1