Сразу небольшое уточнение!
Java я занялся меньше 10-ти дней назад, по этому все, что тут будет написано не претендует вообще ни на, что. Это просто запись в моем блоге, на моей личной страничке, которая может быть кого-то на, что-то натолкнет.
И так была у меня следующая задача-апплет. При запуске появляется логинка, при удачной авторизации логинка пропадает и появляется новая панель с таблицами и прочим. Соответственно логинка и вторая панель были нарисованы быстро. Был разработан код, подключен XML возвращаемый на POST-запрос к серверу и обработка ответа. Ну в яве я неделю, а вообще в IT лет-т 10-ть
И вот тут встала задача что бы при удачной авторизации логинка пропала и появились таблицы. Апплет тогда состоял из 4-х файлов(классов)
MainJApplet.java -запускалка
MainJPanel.java - панель с основным интерфейсом(таблицы, чекбоксы и прочее)
LoginJPanel.java - панель с формой ля входа(два поля и кнопка)
Functions.java - класс в котором были собраны основные функции программы
Промаявшись сутки с поиском удобного мне решения, я нашел такую фишку как CardLayout. Именно этот контейнер позволил мне на одну панель апплета поместить опе панели MainJPanel и LoginJPanel именно так как карты лежат в колоде именно слоями. (тут стоить сделать небольшое отступление, работал я в netbeans. Кинул в апплет первую панель, а затем в тоже место вторую. и вторая стала принадлежать первой. Я е просто слева в инспекторе перетащил мышкой в апплет).
и так у меня получилось в MainJApplet.java
public class MainJApplet extends javax.swing.JApplet {
/** Initializes the applet MainJApplet */
MainJPanel mainP = new MainJPanel();
LoginJPanel loginP = new LoginJPanel();
public MainJApplet () {
super();
}
public void init() {
initComponents();
this.setSize(300, 200);
cardPanel1.add(mainP);
cardPanel2.add(loginP);
cardPanel1.setVisible(true);
cardPanel2.setVisible(true);
loginP.setVisible(true);
mainP.setVisible(false);
}
//
private void initComponents() {
cardPanel1 = new javax.swing.JPanel();
cardPanel2 = new javax.swing.JPanel();
getContentPane().setLayout(new java.awt.CardLayout());
cardPanel1.setLayout(new java.awt.GridLayout());
getContentPane().add(cardPanel1, "card2");
cardPanel2.setLayout(new java.awt.GridLayout());
getContentPane().add(cardPanel2, "card3");
}//
// Variables declaration - do not modify
private javax.swing.JPanel cardPanel1;
private javax.swing.JPanel cardPanel2;
// End of variables declaration
}
тепер надо заставить все это шевелиться. Вот тут мне долго пришлось искать как из MainJPanel обратиться в MainJApplet
и поменять видимости панелей после авторизации. Снова погуглив и почитав пару способов я решил передать ссылку на вызывающий класс в вызываемый. Но как имено передать ее и забрать в Java я не знал. Для меня ясно было только, что нужно использовать this.
LoginJPanel loginP = new LoginJPanel(this);
еще немного пошерстив я нашел и как правильно ее забрать в вызываемом классе и тут все очнь прекрасно состыковалось. Я даже не рассчитывал на такой выхлоп. Забираю я ее так:
public class LoginJPanel extends javax.swing.JPanel {
MainJApplet applet;
public LoginJPanel(MainJApplet a) {
initComponents();
applet=a;
.....
на сколько все просто и логично. В Qt есть слоты и сигналы, во флеше target.parent.perent…
Как мне сказал один флешер на соответствующем форуме «но ведь тогда солдат управляет генералом» (имея ввиду что вызываемый класс должен возвращать что-то, но не вызывать в вызывающем метод). Ну на это мне трудно было возразить, все что я мог сказать это то что «мы не на войне, тут нет солдатов и генералов». И управляем мы не вызывающей функцией, а как вы видете всего лишь через вызывающую функцию. Так, что военных просьба не беспокоиться-субординация соблюдена
.
И так что я в итоге имею.
MainJApplet.java:
public class MainJApplet extends javax.swing.JApplet {
/** Initializes the applet MainJApplet */
MainJPanel mainP = new MainJPanel(this);
LoginJPanel loginP = new LoginJPanel(this);
Functions functions = new Functions(); //подключаю свои функции.
public MainJApplet () {
super();
}
@Override
public void init() {
initComponents();
this.setSize(300, 200);
cardPanel1.add(mainP);
cardPanel2.add(loginP);
cardPanel1.setVisible(true);
cardPanel2.setVisible(true);
loginP.setVisible(true);
mainP.setVisible(false);
}
@SuppressWarnings("unchecked")
//
private void initComponents() {
cardPanel1 = new javax.swing.JPanel();
cardPanel2 = new javax.swing.JPanel();
getContentPane().setLayout(new java.awt.CardLayout());
cardPanel1.setLayout(new java.awt.GridLayout());
getContentPane().add(cardPanel1, "card2");
cardPanel2.setLayout(new java.awt.GridLayout());
getContentPane().add(cardPanel2, "card3");
}//
// Variables declaration - do not modify
private javax.swing.JPanel cardPanel1;
private javax.swing.JPanel cardPanel2;
// End of variables declaration
}
и к примеру кусок LoginJPanel.java:
public class LoginJPanel extends javax.swing.JPanel {
Functions functions = new Functions();
MainJApplet applet;
public LoginJPanel(MainJApplet a) {
initComponents();
applet=a;
}
...... тут все сильно поскипано но суть ясна...
private void enterButtonMousePressed(java.awt.event.MouseEvent evt) { //тоже поскипано
this.setVisible(false);
applet.mainP.setVisible(true);
}
и я получаю отличную прозрачность. через applet я могу получить доступ в любой другой класс а главное к функциям и переменным в Functions.
Вот такая вот недельная работка, ну если не учитывать время на рисование интерфейсов и подключение XML то не недельная а двухдневная.
Может кому прикгодиться