尽管有一些提示,但我仍然错了。我最终得到一个基本窗口和另一个具有额外功能的窗口,但没有上一个窗口中的基本窗口。相反,我想要一个结合了基本功能和新功能的新窗口。这是我得到的代码:(你会建议哪种方法?)
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);
}
}
很抱歉代码很多,谢谢你的帮助!
答案 0 :(得分:3)
我不太确定您的问题是什么,但您的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
构造函数
答案 1 :(得分:2)
首先,虽然您扩展了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
,每个构造函数中有一个。
我建议在摆动组件的情况下避免太深的层次结构,因为当添加更多组件时,您将面临许多意外的布局问题,对一个有效,对另一个无效。
答案 2 :(得分:1)
我认为在您的第二个示例中,在WindowTemplate
中,当您认为正在初始化this
JFrame时,您正在创建另一个JFrame。
而不是
JFrame myFrame = new JFrame("My first window");
你可能想要
super("My first window");
然后用this
答案 3 :(得分:0)
如果我正确阅读了您的代码,WindowTemplate就是一个JFrame。在WindowTemplate的构造函数中,您实例化另一个JFrame?这没有多大意义。您应该配置myFrame
this
public WindowTemplate () {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
...
}
正如您在子类中所做的那样,您正在调用this.add(area)