Java继承或GUI出错



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

package windows;
import java.awt.*;
import javax.swing.*;
public abstract class WindowTemplate extends JFrame {
/**
 * Create the GUI and show it. For thread safety, this method should be
 * invoked from the event-dispatching thread.
 */
public WindowTemplate () {
JFrame myFrame = new JFrame("My first window");
myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
myFrame.setVisible(true);
myFrame.setSize(550, 450);
myFrame.setLocationRelativeTo(null);
// JLabel emptyLabel = new JLabel("");
// emptyLabel.setPreferredSize(new Dimension(550, 450));
// myFrame.getContentPane().setLayout(new CardLayout());
// myFrame.getContentPane().add(emptyLabel, BorderLayout.CENTER);
// myFrame.pack();
}
}

现在是要"扩展"的那个:

package windows;
import java.awt.*;
import javax.swing.*;
public class a_Welcome extends WindowTemplate {
public a_Welcome() {
JPanel area = new JPanel();
JLabel text = new JLabel("One line another line and another line"); // , JLabel.CENTER);
// text.setBounds(80, 400, 400, 50);
add(area);
// area.setLayout(null);
area.add(text, new CardLayout());
// area.add(text); // , BorderLayout.CENTER);
Font font = new Font("SansSerif", Font.BOLD, 30);
text.setFont(font);
text.setForeground(Color.green);
area.setBackground(Color.darkGray);
area.setSize(550, 450);
}
}
// timer-after 5 seconds-go to the next window (countdown in the bottom right corner)

和主:

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);
    }
});
}
}



——或者——

public class WindowTemplate extends JFrame {
// Constructor
public WindowTemplate() {
    init();
}
public void init() {
    // add basic components
    JFrame myFrame = new JFrame("My first window");
    myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    myFrame.setVisible(true);
    myFrame.setSize(550, 450);
    myFrame.setLocationRelativeTo(null);
}
}

public class a_Welcome extends WindowTemplate {
public a_Welcome() {
    super();
}
@Override
public void init() {
    super.init(); // important so you get the base stuff
    // add other components
    JPanel area = new JPanel();
    JLabel text = new JLabel("One line another line and another line");
    add(area);
    area.add(text, new CardLayout());
    Font font = new Font("SansSerif", Font.BOLD, 30);
    text.setFont(font);
    text.setForeground(Color.green);
    area.setBackground(Color.darkGray);
    area.setSize(550, 450);
}
}

很抱歉有这么多代码,谢谢你的帮助!

我不太确定你的问题是什么,但是你的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);
}

public a_Welcome()
{
    super(); // this is implicit, because a_Welcome extends WindowTemplate, which has got a constructor without parameters
    //[add more stuff here]
}

当你创建一个新的a_Welcome时,它的构造函数将调用超级构造函数,也就是WindowTemplate,而超级构造函数又会调用JFrame的构造函数

首先,虽然您扩展了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。相反,您可以在每个构造函数中创建两个单独的JFrame

我建议在swing组件的情况下避免太深的层次结构,因为当添加更多组件时,您将面临许多意想不到的布局问题,对一个有效的东西,对另一个不起作用。

我认为在你的第二个例子中,在WindowTemplate中,当你认为你正在初始化this JFrame时,你正在创建另一个JFrame。

代替

JFrame myFrame = new JFrame("My first window");

你可能想要

super("My first window");

,然后用this

替换myFrame引用。

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

public WindowTemplate () {
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    ...
}

就像你在子类中做的那样,在那里你调用this.add(area)

相关内容

  • 没有找到相关文章

最新更新