当前位置: 代码迷 >> java >> 使用Java Swing创建窗口
  详细解决方案

使用Java Swing创建窗口

热度:70   发布时间:2023-07-31 11:46:38.0

所以,我是Java语言的新手,我开始研究JFrame类。 在很多教程中,我看到了这种创建新JFrame窗口的方法:

class Something extends JFrame{ 
  public static void main(String[] args) {
     new Something();
   }
  Something() {
   ... //Code here, the elements of the default JFrame window.
  }
}

所以我的问题是:我总是要在我的类的构造函数中给出JFrame窗口的规范? 不是有另一种方式吗? 或者这种方式只是我不熟悉? 另外,如果我想稍后在main()方法中更改创建的JFrame,看起来我的代码有点无政府主义。 感谢您的回答!

您可以像配置任何对象一样配置JFrame。 如果您有对JFrame的引用,则可以在其上调用其setter和所有非私有方法。

您的问题涉及配置对象的最佳实践方法。 我会寻找适合你的框架。 一般来说,我认为任何重要的设置都应该在属性文件或系统属性(即非代码)中进行外部配置,并且配置应该由与配置对象不同的对象完成。 您希望您的配置集中,以便所有窗口看起来类似等。

作为语言的初学者,你可以为你做一些小事来做这件事:

public interface WindowConfigurer {
    void configure(JFrame window);
}

public class DefaultWindowConfigurer implements WindowConfigurer {

    private Font font = // Default font

    public void configure(JFrame window) {
        window.setFont(font);
    }

    public void setFont(Font font) {
        this.font = font;
    }
}

public class EntryPoint {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                Something something = new Something();
                WindowConfigurer windowConfigurer = new DefaultWindowConfigurer();
                windowConfigurer.configure(something);
                something.setVisible(true);
            }
        });
    }
}

public class Something extends JFrame {
    public Something() {
        // .. add buttons, controls, etc.
    }
}

WindowConfigurer接口设置一个实现将“配置”给定JFrame的契约。 您可以像我一样创建默认实现。 抽象该配置的重要部分是您可能需要不同的配置,甚至可能希望在运行时更改配置。 例如,如果您的用户是老年人怎么办? 您可能希望将字体更改为更大或使用高对比度颜色。 所以,你可能做的实现WindowConfigurer称为WindowConfigurerHighContrast ,做必要到JFrame任何东西可以很容易地阅读。 这与HTML和CSS的关注点分离是一样的。 你应该阅读MVC模式。

对于应用程序中的每个JFrame,您只需运行configure()即可获得与其他窗口相同样式的JFrame。

我发现子类化JPanel更方便,并在main中创建JFrame:

public class MyClass extends JPanel {
  private JFrame frame;  // just so I have access to the main frame

  public MyClass( JFrame f ) {
     frame = f;
     // other things here
  }

  public void close() {
  // do things for closing
     int status = <something>;
     System.exit( status );
  }
   public static void main( final String[] args ) {
      SwingUtilities.invokeLater( new Runnable() {
         @Override
         public void run() {
            // Create and set up the window.
            final JFrame jf = new JFrame();
            jf.setName( "MyClass" );
            final MyClass item = new MyClass( jf);
            jf.add( item);
            jf.pack();
            jf.setVisible( true );
            jf.addWindowListener( new WindowAdapter() {
               @Override
               public void windowClosing( final WindowEvent arg0 ) {
                 item.close();
               }
            } );
         }
      } );
   }
}
  相关解决方案