Неправильное наследование Java или графический интерфейс - PullRequest
0 голосов
/ 21 июля 2011

несмотря на некоторые советы, я все еще ошибаюсь. Я получаю одно основное окно, а другое - дополнительные функции, но без основных из предыдущего окна. Вместо этого я хотел бы одно новое окно, сочетающее основные и новые функции. Вот код, который я получил: (также, какой подход вы бы посоветовали?)

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

}
}

Извините за большое количество кода и спасибо за вашу помощь!

Ответы [ 4 ]

3 голосов
/ 21 июля 2011

Я не совсем уверен, в чем ваша проблема, но ваша WindowTemplate в основном равна a JFrame, так что вы не хотите создавать новый JFrame в своем конструкторе, а скорее "apply" "эти методы для 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 конструктор

2 голосов
/ 21 июля 2011

Во-первых, хотя вы расширяете JFrame, вы создаете новый JFrame и используете его в каждом конструкторе.Это должно выглядеть примерно так:

public WindowTemplate () {

    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setLocationRelativeTo(null);
    this.setPreferredSize(new Dimension(550, 450));
    this.pack();
    this.setVisible(true);

Теперь, если вы сделаете это так, вы можете добавить JComponent s в каждый метод конструктора / init.Вместо этого вы создаете два отдельных JFrame s, по одному в каждом конструкторе.

Я бы порекомендовал избегать слишком глубокой иерархии в случае компонентов колебания, поскольку вы столкнетесь со многими неожиданными проблемами компоновки, что работает для одного,не работает для других, когда добавлено больше компонентов.

1 голос
/ 21 июля 2011

Я думаю, что во втором примере, в WindowTemplate, вы создаете еще один JFrame, когда думаете, что инициализируете this JFrame.

Вместо

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

Вы, вероятно, хотите

super("My first window");

, а затем замените любые ссылки myFrame после этого на this

0 голосов
/ 21 июля 2011

Если я правильно прочитал ваш код, WindowTemplate - это JFrame.А в конструкторе WindowTemplate вы создаете другой JFrame?Это не имеет особого смысла.Вместо того, чтобы создавать и настраивать myFrame, вы должны настроить this

public WindowTemplate () {

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

, как вы делаете это в подклассе, куда вы звоните this.add(area)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...