Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > Как использовать совместно AWT и Swing?


Автор: Гость_serge 18.4.2005, 10:08
Как использовать совместно AWT и Swing?
Имеется апплет использующий AWT, но в Linux AWT-компоненты не умеют отображать русские буквы. Поностью переписывать апплет не хочется. После частичной замены AWT на Swing
возникаю следующие проблемы с JScrollPane (содежит Canvas, который периодически перерысовываеется используя двойную буферизацию):
- неправильно отрисовывает полосы прокрутки, если нужны обе, при этом вложенный объект при прокрутки может вылезать влево и вверх за пределы JScrollPane;
- неправильно определяет макимальные значения прокрутки при измнении размеров вложенного объекта при их изменении

Автор: batigoal 18.4.2005, 11:23
Касаемо совместного использования - по-моему, AWT и Swing можно комбинировать как угодно, тут проблем не должно быть. А насчет проблем - не знаю, может, код кинешь?

Автор: Гость_serge 18.4.2005, 16:29
Код

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Test extends WindowAdapter {
  Test () {
  }
  public void windowClosing (WindowEvent e) {
    Window w = e.getWindow();
    w.hide ();
    w.dispose ();
    System.exit (0);
  }
  public static void main (String[] args) {
    Test t = new Test();
    Frame f = new Frame ("test");
    f.addWindowListener (t);
    f.setSize (100,100);
    f.setLayout (new BorderLayout ());
    Panel north = new Panel ();
    f.add (north, BorderLayout.NORTH);
    JLabel l = new JLabel ("north");
    north.add (l);
    JScrollPane s = new JScrollPane ();
    f.add (s, BorderLayout.CENTER);
    Panel p2 = new Panel ();
    p2.setLayout (new GridLayout (10,10) );
    for (int i=0; i < 100; i++) {
      JLabel lab = new JLabel (" "+i);
      p2.add (lab);
    }
    s.getViewport().add (p2);
    f.pack ();
    f.setVisible (true);
  }
}

Для проверки нужна мышь с колесом.
Изменить размеры окна, чтобы нужны были обе полосы прокрутки - их не видно.
Прокрутить колесом вниз - появится горизонтальная полоса прокрутки, при этом панель north
будет невидима; прокрутить горизонтально - появится вторая полоса прокутки (если бы была панель left, она тоже бы затерлась)

Автор: batigoal 18.4.2005, 16:47
Да уж, более чем странно. Надо попробовать покопать...

Автор: Domestic Cat 18.4.2005, 17:42
Вообще-то не советуется использовать вместе компоненты AWT и Свинга. Попробуй переписать все на чем-нибудь одном.

Автор: batigoal 18.4.2005, 17:45
Так ведь почти во всех случаях встречается:
Код

import javax.swing.*;
import java.awt.*;

Или ты имеешь в виду именно визуальные компоненты?

Автор: Domestic Cat 18.4.2005, 17:52
Ага, речь о визуальных компонентах.

Автор: batigoal 18.4.2005, 18:17
Вот так, кажись, работает:
Код

import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class Test extends WindowAdapter {
  Test () {
  }
  public void windowClosing (WindowEvent e) {
    Window w = e.getWindow();
    w.hide ();
    w.dispose ();
    System.exit (0);
  }
  public static void main (String[] args) {
    Test t = new Test();
    JFrame f = new JFrame ("test");
    JPanel mainPanel = new JPanel();
    f.setContentPane(mainPanel);
    f.addWindowListener (t);
    mainPanel.setSize (100,100);
    mainPanel.setLayout(new BorderLayout ());
    JPanel north = new JPanel ();
    mainPanel.add (north, BorderLayout.NORTH);
    JLabel l = new JLabel ("north");
    north.add (l);

    JPanel p2 = new JPanel();
    p2.setPreferredSize(new Dimension(200,200));
    p2.setLayout (new GridLayout (10,10) );
    for (int i=0; i < 100; i++) {
      JLabel lab = new JLabel (" "+i);
      p2.add (lab);
    }
    JScrollPane s = new JScrollPane (p2);
    mainPanel.add(s, BorderLayout.CENTER);

    f.pack ();
    f.setVisible (true);

  }
}

Автор: Гость_serge 19.4.2005, 10:50
Конечно, если использовать только Swing компоненты, все будет работать. Этот пример - упрощение. У меня объявлен интефейс UIFactory, который создает либо AWT,
либо Swing компоненты. При старте апплет проверяет версию виртульной машины и выбирает нужную реализацию UIFactory. Но сам апплет остается java.applet.Applet, а не javax.swing.JApplet.
Какой аналог Canvas в Swing? JLabel c изображением?

Автор: Гость_serge 19.4.2005, 17:15
Для того чтобы вставить Swing компонент в AWT-контейнер нужно использовать JRootPane. Обратного переходника видимо нет.
Код

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Test extends WindowAdapter {
  Test () {
  }
  public void windowClosing (WindowEvent e) {
    Window w = e.getWindow();
    w.hide ();
    w.dispose ();
    System.exit (0);
  }
  public static void main (String[] args) {
    test t = new test();
    Frame f = new Frame ("test");
    JRootPane r = new JRootPane ();
    f.addWindowListener (t);
    f.setSize (300,300);
    f.setLayout (new BorderLayout ());
    f.add (r, BorderLayout.CENTER);
    r.setLayout (new BorderLayout ());
    JPanel n = new JPanel ();
    r.add (n, BorderLayout.NORTH);
    JPanel w = new JPanel ();
    r.add (w, BorderLayout.WEST);
    JLabel l = new JLabel ("north");
    n.add (l);
    JScrollPane s = new JScrollPane ();
    r.add (s, BorderLayout.CENTER);
    JPanel p = new JPanel ();
    p.setLayout (new GridLayout (10,10) );
    for (int i=0; i < 100; i++) {
      JLabel lab = new JLabel (" "+i);
      p.add (lab);
    }
    s.getViewport().add (p);
    f.pack ();
    f.setVisible (true);
  }
}


Автор: Domestic Cat 19.4.2005, 17:42
Цитата
Какой аналог Canvas в Swing? JLabel c изображением?

JPanel

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)