Applet resize on window resize. Изменение размера апплета вместе с окном

Автор: · Ваш отзыв 

Столкнулся с такой вот задачкой.
Нужно было, чтобы апплет был во все окно и при увеличении окна тоже увеличивался.
Вроди бы просто, если не учитывать особенности браузеров. Но благо есть jquery

<html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

    <title>Insert title here</title>
    <style type="text/css">
      body {
         font: 12px arial,verdana,sans-serif;
         padding:0px;
         margin:0px;
         background: #E7E7E7; 
      }
   </style>
   <script language="JavaScript" src="jquery-1.3.2.min.js"></script>
   <script>
      $(function(){
         resizeApplet();
      });
      $(window).resize(function() {
          resizeApplet();
      });
       function resizeApplet() {
          $("#MainJApplet").width($(document).width()-20);
          $("#MainJApplet").height($(document).height()-20);
       }
     </script>
    </head>
  <body>
    <center>
     <applet width='800' height='600' id='MainJApplet'  code='MainJApplet'  archive='MainJApplet.jar'></applet>
    </center>
  </body>
</html>

«-20″ это из-за скролов в ИЕ. Иначе при изменении размера апплет залазит на полосы прокрутки. Там и 15-ть хватит, но я решил не жадничать. :)

В принципе это можно применить к любым элементам, а не только к апплетам…

работа со «слоями» и обращение через вызывающий класс

Автор: · Ваш отзыв 

Сразу небольшое уточнение!

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 то не недельная а двухдневная.
Может кому прикгодиться