小编cap*_*ors的帖子

如果不断的界面反模式是这样的犯罪,为什么Swing会这样做呢?

我正在制作一个swing应用程序,并意识到我有一些需要访问同一组常量的类.我不能让自己宣布一个人是他们的主要持有人并将他们全部放在那里并让其他人参考它; 我想,嘿,我只是让它们都从一些常见的地方继承,但是Java不会做多重继承,但我可以把无限接口放在东西上.所以我想把它们全部转移到一个界面中(这是真的,我自然而然地没有进行任何研究).

我后来才知道这是异端邪说."事实上,它有一个名称,它有一个名称:恒定接口反模式" - 如此处所讨论的(以及替代解决方案(我选择使用)).

我一直很好,直到我查看的源代码JDialogJFrame,因此阅读:

public class JDialog extends Dialog implements WindowConstants,
                                               Accessible,
                                               RootPaneContainer,
                               TransferHandler.HasGetTransferHandler
{
...
Run Code Online (Sandbox Code Playgroud)

public class JFrame extends Frame implements WindowConstants,
                                             Accessible,
                                             RootPaneContainer,
                             TransferHandler.HasGetTransferHandler
{
...
Run Code Online (Sandbox Code Playgroud)

也许这只是我,但我确实在那里看到一个恒定的界面.更有趣的是JDialog中的作者声明之一,即James Gosling.语言的父亲在他的手表上允许这个所谓的错误?

(另一个值得注意的例子 - SwingConstans)

如果常量接口反模式是一个坏主意,那么为什么它在语言最着名的一个包(即swing)中被大量使用?

java swing anti-patterns interface constants

7
推荐指数
1
解决办法
1122
查看次数

如何使JDialog不总是位于父级之上

我有一个生成两个JDialogs的JFrame。这三个窗口中的每个窗口都必须是可聚焦的(这是我当前编写的方式),但是JFrame不会放在对话框的顶部。当您单击任一对话框时,它们会彼此弹出(就像一个人所期望的那样),但是JFrame只是拒绝出现在最前面。

我需要它们保留JDialogs(而不是JFrames本身),因为大多数当前行为都是可取的(即,当另一个窗口/应用程序阻止任何或所有窗口时,如果选择任何窗口,它们都位于最前面) (而三个JFrame只会导致选中的一个出现)。

我的JDialogs构造函数可以达到以下效果:

SubDialog(JFrame parent /*, a handful, ofOther arguments */){
    super(parent, ModalityType.MODELESS); //not even the modeless helped
    setAlwaysOnTop(false); //not even the not always on top helped
    setUndecorated(true); //maybe this has something to do with it (unlikely, just fyi)?

    //some simple variable assignments

}
Run Code Online (Sandbox Code Playgroud)

我什至试图setAlwaysOnTop(true)在我的JFrame中扔一个。没有骰子。我感到绝望,甚至尝试了以下数字之一:

MyJFrame(String title){
    super(title);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    addWindowFocusListener(new WindowAdapter(){
        public void windowGainedFocus(WindowEvent e){
            final Window w = e.getWindow();

            //PLEASE come to the front
            w.toFront();

            //even MOAR desperation
            SwingUtilities.invokeLater(new Runnable(){
                public void run(){
                    w.toFront(); //STILL no …
Run Code Online (Sandbox Code Playgroud)

java swing jdialog modality

4
推荐指数
1
解决办法
2206
查看次数

标签 统计

java ×2

swing ×2

anti-patterns ×1

constants ×1

interface ×1

jdialog ×1

modality ×1