Java继承或GUI出错

Java继承或GUI出错,java,swing,user-interface,inheritance,Java,Swing,User Interface,Inheritance,尽管有一些建议,但我还是错了。我最终得到一个基本窗口和另一个具有额外功能的窗口,但没有上一个窗口中的基本窗口。相反,我想要一个结合了基本功能和新功能的新窗口。以下是我得到的代码:(您建议采用哪种方法? 现在要“扩展”的是: 主要问题是: package windows; public class Launcher { public static void main(String[] args) { // Schedule a job for the event-dispatching th

尽管有一些建议,但我还是错了。我最终得到一个基本窗口和另一个具有额外功能的窗口,但没有上一个窗口中的基本窗口。相反,我想要一个结合了基本功能和新功能的新窗口。以下是我得到的代码:(您建议采用哪种方法?

现在要“扩展”的是:

主要问题是:

package windows;

public class Launcher {

public static void main(String[] args) {

// Schedule a job for the event-dispatching thread:
// creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
    public void run() {

        // WindowTemplate.createWindow();
        // a_Welcome.createWindow();

         a_Welcome window = new a_Welcome();
         window.setVisible(true);
    }
});

}

}


--或者--


很抱歉输入了大量代码,感谢您的帮助

如果我正确阅读了您的代码,WindowTemplate就是JFrame。在WindowTemplate的构造函数中实例化另一个JFrame?这没有多大意义。您不应该创建和配置
myFrame
,而应该配置
this

public WindowTemplate () {

    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    ...
}

当您在子类中执行此操作时,在子类中调用this.add(area)

如果我正确阅读了您的代码,WindowTemplate就是一个JFrame。在WindowTemplate的构造函数中实例化另一个JFrame?这没有多大意义。您不应该创建和配置
myFrame
,而应该配置
this

public WindowTemplate () {

    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    ...
}

当您在子类中执行此操作时,首先调用
this.add(area)

,尽管您扩展了JFrame,但是您创建了一个新的JFrame并在每个构造函数中使用它。应该是这样的:

public WindowTemplate () {

    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setLocationRelativeTo(null);
    this.setPreferredSize(new Dimension(550, 450));
    this.pack();
    this.setVisible(true);
现在,如果这样做,可以在每个构造函数/init方法中添加
JComponent
s。相反,创建两个独立的
JFrame
s,每个构造函数中一个


我建议在swing组件的情况下避免太深的层次结构,因为当添加更多组件时,您将面临许多意外的布局问题,其中一个对您有效,而另一个对您无效

首先,虽然您扩展了JFrame,但是您创建了一个新的JFrame并在每个构造函数中使用它。应该是这样的:

public WindowTemplate () {

    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setLocationRelativeTo(null);
    this.setPreferredSize(new Dimension(550, 450));
    this.pack();
    this.setVisible(true);
现在,如果这样做,可以在每个构造函数/init方法中添加
JComponent
s。相反,创建两个独立的
JFrame
s,每个构造函数中一个


我建议在swing组件的情况下避免太深的层次结构,因为当添加更多组件时,您将面临许多意外的布局问题,其中一个对您有效,而另一个对您无效

我不太确定您的问题是什么,但是您的
WindowTemplate
基本上是一个
JFrame
,因此您不想在构造函数中创建新的JFrame,而是将这些方法“应用”到
这个
而不是
myFrame
。 试着这样做:

public WindowTemplate()
{
    super("My first window");
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // "this" is optional
    setVisible(true);
    setSize(550, 450);
    setLocationRelativeTo(null);
}


当你创建一个新的
a_Welcome
时,它的构造函数会调用超级构造函数,它是
WindowTemplate
,它会依次调用
JFrame
构造函数,我不太确定你的问题是什么,但是你的
WindowTemplate
基本上就是一个
JFrame
,因此,您不想在构造函数中创建新的JFrame,而是将这些方法“应用”到
this
,而不是
myFrame
。 试着这样做:

public WindowTemplate()
{
    super("My first window");
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // "this" is optional
    setVisible(true);
    setSize(550, 450);
    setLocationRelativeTo(null);
}


当您创建一个新的
a_Welcome
时,它的构造函数将调用超级构造函数,即
WindowTemplate
,它将依次调用
JFrame
构造函数,当您认为正在初始化
this
JFrame时,您正在创建另一个JFrame

而不是

JFrame myFrame = new JFrame("My first window");
你可能想要

super("My first window");

然后用
this
替换任何myFrame引用,我认为在第二个示例中,在
WindowTemplate
中,当您认为正在初始化
this
JFrame时,您正在创建另一个JFrame

public WindowTemplate () {

    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    ...
}
而不是

JFrame myFrame = new JFrame("My first window");
你可能想要

super("My first window");


然后用
替换任何myFrame引用。这个
欢迎
不是惯用的Java,是一个可怕的类名,不管使用哪种语言。是的,我知道。但它让我的生活更轻松,因为它是第一个窗口,而“a_u2;”位确保它保持在顶部。确保这不是写“窗口”的方式。显然,我会正确地更改它。@Jarrod Roberson:在Eclipse的包资源管理器窗口中。@Jonas:是的,一个快速的重构,它将被命名为Welcome。别担心,伙计们;)
a_Welcome
不是惯用的Java,无论使用何种语言,它都是一个糟糕的类名。是的,我知道这一点。但它让我的生活更轻松,因为它是第一个窗口,而“a_u2;”位确保它保持在顶部。确保这不是写“窗口”的方式。显然,我会正确地更改它。@Jarrod Roberson:在Eclipse的包资源管理器窗口中。@Jonas:是的,一个快速的重构,它将被命名为Welcome。别担心,伙计们;)关于你的建议-我将有一些类似类型的窗口,我计划使用CardLayout。组件将是文本字段和区域、按钮、单选按钮等(非常基本的东西)。在这种情况下,推荐什么设计?对于卡片布局,您可以扩展JPanel,而不是JFrame,并且除了真正的基本配置之外,我不会创建层次结构,除非每次创建完整的面板确实是一个大问题。如果可能的话,我会在主JFrame中添加一些常用组件,并将所有面板放在其他面板中,但这实际上取决于您的需要。我可以从头开始为每个窗口创建整个窗口,因为它只有几行,但我听说重复代码并不好。我不太明白“所有面板都在另一个面板中”的想法。这确实不是最好的做法,但我认为在某些地方需要分离,但这又取决于你的需要。“另一个面板中的所有面板”的概念是,面板是一个容器,您可以用更多面板填充它。框架是一个全新的窗口(或多或少)好的,谢谢。如果你能看看我在哪里,我将不胜感激
public WindowTemplate () {

    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    ...
}