Базовые и расширенные окна в Java с использованием наследования - PullRequest
1 голос
/ 20 июля 2011


У меня есть один класс с именем WindowTemplate, который является основой для других (более сложных) окон.Это абстрактный класс, и затем я пытаюсь использовать трюк «продление», чтобы добавить больше материала в новое окно, сохраняя оригинальный «скелет».
Это моя проблема, хотя, потому что, если я запускаю WindowTemplate.createWindow (); или a_Welcome.createWindow (); (они должны указывать на одно и то же), яполучить мое "базовое" окно.Но когда я запускаю a_Welcome window = new a_Welcome (); (что должно быть базовым + новый материал), я получаю только те дополнительные биты, которые я добавил без оригинальных функций.
Вот мой код:

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 static void createWindow() {

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

}

}


Спасибо за помощь!

Ответы [ 3 ]

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

Статический метод createWindow() всегда создает новый JFrame, который не является суперклассом WindowTemplate. Конструктор a_Window добавляет компоненты к WindowTemplate, который не был инициализирован, так как статический createWindow() создает независимый фрейм.

Я бы предложил вам изменить статический createWindow() на WindowTemplate конструктор и попробовать запустить main еще раз.

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

}

}
0 голосов
/ 20 июля 2011

Другой подход, который вы могли бы рассмотреть, - это иметь JFrame, который является просто оберткой, и создать окно, добавив панель.Допустим, вам нужна панель инструментов вверху каждого окна, которое вы создаете.Каждое окно будет иметь разные кнопки на панели инструментов и различный набор компонентов внизу.Таким образом, вы делаете композицию вместо наследования, потому что наследование может стать уродливым позже.(Для обсуждения по этому вопросу см. это , это и это для начинающих)

Это будет выглядеть примерно так:

public interface AppPanel {
  List<JButton> getToolbarButtons();
  boolean okToClose();
  JPanel getGui();
}

public MyPanel extends JPanel implements AppPanel {
  //standard swing components stuff set up here

  public List<JButton> getToolbarButtons() {
    //set up buttons and their actions
    return buttonList;
  }

  public boolean okToClose() {
    //ask user if they want to save, etc.
    return true;
  }

  public JPanel getGui() {
    return this;
  }
}

public AppFrame extends JFrame {
  private AppPanel panel;

  public static AppFrame createFrame(AppPanel panel) {
    AppFrame frame = new AppFrame(panel);
    return frame;
  }

  public AppFrame(AppPanel panel) {
    super();
    this.panel = panel;
    add(panel.getGui(), someLayoutConstraints);

    panel.getToolbarButtons(); //do stuff with the buttons

    //...
    this.addWindowListener(new WindowAdapter() {
      public void WindowClosing(WindowEvent e) {
        if (panel.isOkToClose()) {
          setVisible(false);
        }
      }
    });
  }


}
0 голосов
/ 20 июля 2011

У вас есть другой JFrame, определенный в статическом методе createWindow ().Это означает, что вы добавляете компоненты в этот фрейм, который ограничен только методом createWindow (), а в конструкторе, который вы добавляете в экземпляр a_Welcome.

Вы должны сделать что-то вроде этого

public class BaseWindow() {

  //Constructor
  public BaseWindow() {
    init();
  }

  public void init() {
    //add basic components
  }
}


public class SubClassWindow() {
  public SubClassWindow() {
    super();
  }

  @Override
  public void init() {
    super.init(); //important so you get the base stuff
    //add other components
  }
}

Код не проверен.

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