Java桂开二windows
Java Gui opening two windows
首先,我是 Java GUI 的新手,所以请多多包涵。
我正在从模型-视图-控制器设置中创建一个非常简单的 GUI,它所做的只是显示一些标签、一些文本字段和一些按钮;没有什么花哨。我已经通过 GridBagLayout 获得了我想要的 GUI,但我遇到的问题是每当我调用 GUI 视图 class 时,我都会弹出两个 windows,而不是一个。第一个 window 打开的是带有我所有文本字段和按钮的 GridBagLayout,第二个只是一个很小的 window 东西,只有最小化、最大化和关闭按钮(附上一张照片)。
我的代码如下(模型和控制器还有另外两个classes)
public class classView extends JFrame {
private classModel model;
public classView(classModel model){
this.model = model;
JFrame mFrame = new JFrame("This is the view Frame");
mFrame.setBounds(400, 400, 300, 300);
setDefaultCloseOperation(EXIT_ON_CLOSE);
addComponentsToPane(mFrame.getContentPane());
mFrame.pack();
mFrame.setVisible(true);
}
private void addComponentsToPane(Container pane){
// This is where I add the buttons and other fun stuff
}
classView 在另一个 class 中是这样调用的,连同 classController 和 classModel。
public class classGUIBasics {
public static void main(String[] args) throws Exception {
classModel model = new classModel();
classView view = new classView(model);
new classController(model, view);
view.setVisible(true);
}
}
我知道这可能很简单,但我做错了什么?我如何抑制这一秒 window?
提前致谢!
classView extends JFrame.And在classView中你再创建一个JFrame,mFrame.The可见的两个JFrame是true.So你会看到两个window。尝试删除代码"view.setVisible(true);" 在类 GUIBasics 中。
根据您的代码,您的 classView 扩展了 JFrame,因此实际上 classView 是一个 JFrame,因此您的视图具有 JFrame 的所有属性。
因此您的代码可以更改为:
class classView extends JFrame {
private classModel model;
public classView ( classModel model ) {
this.model = model;
this.setBounds( 400, 400, 300, 300 );
setDefaultCloseOperation( EXIT_ON_CLOSE );
addComponentsToPane();
this.pack();
}
private void addComponentsToPane ( ) {
Container pane = this.getContentPane();
// This is where I add the buttons and other fun stuff
}
}
而您的 classGUIBasics 保持不变:
public static void main ( String[] args ) throws Exception {
classModel model = new classModel();
classView view = new classView( model );
new classController( model, view );
view.setVisible( true );
}
此外,我建议检查 Java 命名约定。
您的 class 几乎没有充分理由扩展 JFrame。您的 class 应该扩展 JPanel。然后在 main() 函数中创建一个 JFrame,创建 class 实例,将其添加到框架中,打包框架并将其设置为可见。这也应该全部在事件线程上完成,而不是主线程:
public class MyClass extends JPanel {
public MyClass() {
// create the contents of the panel
}
@Override
public void paintComponent( Graphics g ) {
super.paintComponent( g );
// other stuff here
}
public static void main( String[] args ) {
SwingUtilities.invokeLater( new Runnable() {
@Override
public void run() {
JFrame jf = new JFrame();
jf.addWindowListener( new WindowAdapter() {
@Override
public void windowClosing( WindowEvent arg0 ) {
System.exit( 0 );
}
} );
MyClass t = new MyClass();
jf.add( t, BorderLayout.CENTER );
jf.pack();
jf.setVisible( true );
}
} );
}
}
请注意,此主要方法可重复用于您的任何应用程序,只需更改创建 MyClass 实例的一行即可。
首先,我是 Java GUI 的新手,所以请多多包涵。
我正在从模型-视图-控制器设置中创建一个非常简单的 GUI,它所做的只是显示一些标签、一些文本字段和一些按钮;没有什么花哨。我已经通过 GridBagLayout 获得了我想要的 GUI,但我遇到的问题是每当我调用 GUI 视图 class 时,我都会弹出两个 windows,而不是一个。第一个 window 打开的是带有我所有文本字段和按钮的 GridBagLayout,第二个只是一个很小的 window 东西,只有最小化、最大化和关闭按钮(附上一张照片)。
我的代码如下(模型和控制器还有另外两个classes)
public class classView extends JFrame {
private classModel model;
public classView(classModel model){
this.model = model;
JFrame mFrame = new JFrame("This is the view Frame");
mFrame.setBounds(400, 400, 300, 300);
setDefaultCloseOperation(EXIT_ON_CLOSE);
addComponentsToPane(mFrame.getContentPane());
mFrame.pack();
mFrame.setVisible(true);
}
private void addComponentsToPane(Container pane){
// This is where I add the buttons and other fun stuff
}
classView 在另一个 class 中是这样调用的,连同 classController 和 classModel。
public class classGUIBasics {
public static void main(String[] args) throws Exception {
classModel model = new classModel();
classView view = new classView(model);
new classController(model, view);
view.setVisible(true);
}
}
我知道这可能很简单,但我做错了什么?我如何抑制这一秒 window?
提前致谢!
classView extends JFrame.And在classView中你再创建一个JFrame,mFrame.The可见的两个JFrame是true.So你会看到两个window。尝试删除代码"view.setVisible(true);" 在类 GUIBasics 中。
根据您的代码,您的 classView 扩展了 JFrame,因此实际上 classView 是一个 JFrame,因此您的视图具有 JFrame 的所有属性。
因此您的代码可以更改为:
class classView extends JFrame {
private classModel model;
public classView ( classModel model ) {
this.model = model;
this.setBounds( 400, 400, 300, 300 );
setDefaultCloseOperation( EXIT_ON_CLOSE );
addComponentsToPane();
this.pack();
}
private void addComponentsToPane ( ) {
Container pane = this.getContentPane();
// This is where I add the buttons and other fun stuff
}
}
而您的 classGUIBasics 保持不变:
public static void main ( String[] args ) throws Exception {
classModel model = new classModel();
classView view = new classView( model );
new classController( model, view );
view.setVisible( true );
}
此外,我建议检查 Java 命名约定。
您的 class 几乎没有充分理由扩展 JFrame。您的 class 应该扩展 JPanel。然后在 main() 函数中创建一个 JFrame,创建 class 实例,将其添加到框架中,打包框架并将其设置为可见。这也应该全部在事件线程上完成,而不是主线程:
public class MyClass extends JPanel {
public MyClass() {
// create the contents of the panel
}
@Override
public void paintComponent( Graphics g ) {
super.paintComponent( g );
// other stuff here
}
public static void main( String[] args ) {
SwingUtilities.invokeLater( new Runnable() {
@Override
public void run() {
JFrame jf = new JFrame();
jf.addWindowListener( new WindowAdapter() {
@Override
public void windowClosing( WindowEvent arg0 ) {
System.exit( 0 );
}
} );
MyClass t = new MyClass();
jf.add( t, BorderLayout.CENTER );
jf.pack();
jf.setVisible( true );
}
} );
}
}
请注意,此主要方法可重复用于您的任何应用程序,只需更改创建 MyClass 实例的一行即可。