Мы используем наблюдатель / Наблюдаемые механизма обнаружения, если файл данных были Modifed поскольку в последний раз.

Мы используем те же файлы данных и DataFileTableModel как предыдущие инструкции. Некоторые незначительные изменения, которые необходимы для DataFileTable класс. Этот класс сейчас реализует интерфейс наблюдателя (см. Update () метод, который будет вызываться при наблюдаемом объекте отправить уведомление).


[DataFileTable.java]

import javax.swing.*;

import java.awt.event.*;

import java.awt.*;

import java.io.*;

import java.util.*;



public class DataFileTable extends JPanel

        implements Observer {

    

    protected JTable table;

    protected DataFileTableModel model;

    

    public DataFileTable(String dataFilePath) {

        DataFileWatchdog  wd;

        Font f;

        

        f = new Font("SanSerif",Font.PLAIN,24);

        setFont(f);

        setLayout(new BorderLayout());

        

        model = new DataFileTableModel(dataFilePath);

        

        table = new JTable();

        table.setModel(model);

        table.createDefaultColumnsFromModel();

        

        JScrollPane scrollpane = new JScrollPane(table);

        add(scrollpane);

        

        // this watchdog (an Observable object)

        //   is monitoring any file change

        wd = new DataFileWatchdog(dataFilePath);

        wd.addObserver(this);

    }

    

    public void update(Observable o, Object arg) {

        // reload data because data file have changed

        model.initVectors();

        table.repaint();

    }

    

    public Dimension getPreferredSize(){

        return new Dimension(400300);

    }

    

    public static void main(String s[]) {

        JFrame frame = new JFrame("Data File Table");

        DataFileTable panel;

        

        panel = new DataFileTable("customers.dat");

        frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

        frame.setForeground(Color.black);

        frame.setBackground(Color.lightGray);

        frame.getContentPane().add(panel,"Center");

        

        frame.setSize(panel.getPreferredSize());

        frame.setVisible(true);

        frame.addWindowListener(new WindowCloser());

    }

}



class WindowCloser extends WindowAdapter {

    public void windowClosing(WindowEvent e) {

        Window win = e.getWindow();

        win.setVisible(false);

        System.exit(0);

    }

}

DataFileWatchdog, наблюдаемый объект, проста. Мы используем Свинг таймер, чтобы проверить каждую секунду, если заданный файл изменились. Если метка отличается, то последний, то все зарегистрированные наблюдатели уведомляются об этом.


[DataFileWatchdog.java]

import javax.swing.Timer;

import java.awt.event.*;

import java.io.*;

import java.util.*;



public class DataFileWatchdog extends Observable

        implements ActionListener {

    

    Timer t = new Timer(1000,this)// check every second

    long lastModified;

    String file;

    

    DataFileWatchdog(String s) {

        file = s;

        File f = new File(file);

        lastModified = f.lastModified()// original timestamp

        t.start();

    }

    

    public void actionPerformed(ActionEvent e) {

        File f = new File(file);

        long actualLastModified = f.lastModified() ;

        if (lastModified != actualLastModified) {

            // the file have changed

            lastModified = actualLastModified;

            setChanged();

            notifyObservers();

        }

    }

}

Этот совет Java Swing иллюстрирует метод анимации серии изображений, расположенный на месте. Разработчики могут использовать этот совет для создания анимации в их applicationa рисунок с файлами. Эта подсказка может быть использована для анимированных логотипов применения.


import java.awt.*;

import java.awt.event.*;

import javax.swing.*;



public class LogoAnimator extends JPanel

                          implements ActionListener {

   protected ImageIcon images[];

   protected int totalImages = 30,

                 currentImage = 0,

                 animationDelay = 50// 50 millisecond delay

   protected Timer animationTimer;



   public LogoAnimator()

   {

      setSizegetPreferredSize() );



      images = new ImageIcontotalImages ];



      for int i = 0; i < images.length; ++i 

         images=

            new ImageIcon"images/java" + i + ".gif" );



      startAnimation();

   }



   public void paintComponentGraphics g )

   {

      super.paintComponent);



      if imagescurrentImage ].getImageLoadStatus() ==

           MediaTracker.COMPLETE ) {

         imagescurrentImage ].paintIconthis, g, 0);

         currentImage = currentImage + % totalImages;

      }

   }



   public void actionPerformedActionEvent e )

   {

      repaint();

   }



   public void startAnimation()

   {

      if animationTimer == null ) {

         currentImage = 0;  

         animationTimer = new TimeranimationDelay, this );

         animationTimer.start();

      }

      else  // continue from last image displayed

         if ! animationTimer.isRunning() )

            animationTimer.restart();

   }



   public void stopAnimation()

   {

      animationTimer.stop();

   }



   public Dimension getMinimumSize()

   

      return getPreferredSize()

   }



   public Dimension getPreferredSize()

   {

      return new Dimension16080 );

   }



   public static void mainString args[] )

   {

      LogoAnimator anim = new LogoAnimator();



      JFrame app = new JFrame"Animator test" );

      app.getContentPane().addanim, BorderLayout.CENTER );



      app.addWindowListener(

         new WindowAdapter() {

            public void windowClosingWindowEvent e )

            {

               System.exit);

            }

         }

      );



      // The constants 10 and 30 are used below to size the

      // window 10 pixels wider than the animation and

      // 30 pixels taller than the animation. 

      app.setSizeanim.getPreferredSize().width + 10,

                   anim.getPreferredSize().height + 30 );

   }

}

Font Metrics

Этот совет Java Swing иллюстрирует способ получения FontMetrics различные шрифты. FontMetrics, как правило, используется для получения информации о ширине и высоте символов и строк при составлении текста на поверхность. FontMetrics ссылки на объект шрифта и поверхность, так как шрифты могут иметь различные метрики на различных поверхностях.


import java.awt.*;

import java.awt.event.*;

import javax.swing.*;



public class Metrics extends JFrame {

    

    public Metrics() {

        super"Demonstrating FontMetrics" );

        

        setSize510210 );

        show();

    }

    

    public void paintGraphics g ) {

        

        g.setFontnew Font"SansSerif", Font.BOLD, 12 ) );

        FontMetrics fm = g.getFontMetrics();

        g.drawString"Current font: " + g.getFont()1040 );

        g.drawString"Ascent: " + fm.getAscent()1055 );

        g.drawString"Descent: " + fm.getDescent()1070 );

        g.drawString"Height: " + fm.getHeight()1085 );

        g.drawString"Leading: " + fm.getLeading()10100 );

        

        Font font = new Font"Serif", Font.ITALIC, 14 );

        fm = g.getFontMetricsfont );

        g.setFontfont );

        g.drawString"Current font: " + font, 10130 );

        g.drawString"Ascent: " + fm.getAscent()10145 );

        g.drawString"Descent: " + fm.getDescent()10160 );

        g.drawString"Height: " + fm.getHeight()10175 );

        g.drawString"Leading: " + fm.getLeading()10190 );

    }

    

    public static void mainString args[] ) {

        Metrics app = new Metrics();

        

        app.addWindowListener(

                new WindowAdapter() {

            public void windowClosingWindowEvent e ) {

                System.exit);

            }

        }

        );

    }

}

the appearance of a component

Этот совет Java Swing иллюстрирует метод динамического обновления появления компонента. Подсказка использует раз подтверждают () для динамического обновления появления компонента. Этот пример изменения размера шрифта кнопки на лету.


import javax.swing.*;

import java.awt.*;

import java.awt.event.*;



public class RevalidateExample extends JFrame {

    

    public RevalidateExample() {

        

        super("Revalidation Demo");

        setSize(300,150);

        setDefaultCloseOperation(EXIT_ON_CLOSE);

        

        // Create a single button

        Font font = new Font("Dialog", Font.PLAIN, 10);

        final JButton b = new JButton("Add");

        b.setFont(font);

        

        Container c = getContentPane();

        c.setLayout(new FlowLayout());

        c.add(b);

        

        // Increase the size of the button's font each time it's clicked

        b.addActionListener(new ActionListener() {

            int size = 10;

            

            public void actionPerformed(ActionEvent ev) {

                b.setFont(new Font("Dialog", Font.PLAIN, ++size));

    

    // invalidates the button & validates its root pane

                b.revalidate();   

            }

        });

    }

    

    public static void main(String[] args) {

        RevalidateExample re = new RevalidateExample();

        re.setVisible(true);

    }

}

Этот совет Java Swing иллюстрирует метод обнаружения перетащить начало жест в вашем приложении. Подсказка показывает простое испытание DragGesture классы ли можно признать простым движением сопротивления. Разработчики могут использовать этот жест, чтобы выполнять различные функции.



javax.swing



import java.awt.*;

import java.awt.dnd.*;

import java.awt.datatransfer.*;

import java.awt.event.*;

import java.io.*;

import java.util.*;

import javax.swing.*;



public class GestureTest extends JFrame implements DragGestureListener {



  DragSource ds;

  JList jl;

  String[] items = {"Java""C""C++""Lisp""Perl""Python"};



  public GestureTest() {

    super("Gesture Test");

    setSize(200,150);

    addWindowListener(new WindowAdapter() {

      public void windowClosing(WindowEvent we) {

        System.exit(0);

      }

    });

    jl = new JList(items);

    jl.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

    getContentPane().add(new JScrollPane(jl), BorderLayout.CENTER);



    ds = new DragSource();

    DragGestureRecognizer dgr = ds.createDefaultDragGestureRecognizer(

        jl, DnDConstants.ACTION_COPY, this);

    setVisible(true);

  }



  public void dragGestureRecognized(DragGestureEvent dge) {

    System.out.println("Drag Gesture Recognized!");

  }



  public static void main(String args[]) {

    new GestureTest();

  }

Date Selection

Этот совет Java Swing иллюстрирует метод реализации Месяц паук утилита, позволяющая спиннинг дат. Этот совет использует JSpinner со специальным редактором, который позволяет пользователю через спину Дата мм / гг формат.


import javax.swing.*;

import javax.swing.event.*;

import java.awt.*;

import java.util.*;



public class MonthSpinner extends JFrame {



  public MonthSpinner() {

    super("Month Spinner");

    setSize(200,100);

    setDefaultCloseOperation(EXIT_ON_CLOSE);



    Container c = getContentPane();

    c.setLayout(new FlowLayout(FlowLayout.LEFT, 4,4));



    c.add(new JLabel("Expiration Date:"));

    Date today = new Date();

    // Start the spinner today, but don't set a min or max date

    // The increment should be a month

    JSpinner s = new JSpinner(new SpinnerDateModel(today, 

                 null, null, Calendar.MONTH));

    JSpinner.DateEditor de = new JSpinner.DateEditor(s, "MM/yy");

    s.setEditor(de);

    c.add(s);



    setVisible(true);

  }



  public static void main(String args[]) {

    new MonthSpinner();

  }

}

Этот совет Java Swing иллюстрирует способ создания пользовательских редактор ComboBox для использования с классом EditableComboBox. Список использует визуализации для отображения каждого пункта в меню. Редактируемое поле со списком, с другой стороны, использует редактор для отображения выбранного элемента.


import java.awt.*;

import java.awt.event.*;

import java.util.*;

import javax.swing.*;

import javax.swing.border.*;



public class ComboBoxEditorExample implements ComboBoxEditor {

    Map map;

    ImagePanel panel;

    ImageIcon questionIcon;

    

    public ComboBoxEditorExample(Map m, BookEntry defaultChoice) {

        map = m;

        panel = new ImagePanel(defaultChoice);

        questionIcon = new ImageIcon("question.gif");

    }

    

    public void setItem(Object anObject) {

        if (anObject != null) {

            panel.setText(anObject.toString());

            BookEntry entry = (BookEntry)map.get(anObject.toString());

            if (entry != null)

                panel.setIcon(entry.getImage());

            else

                panel.setIcon(questionIcon);

        }

    }

    

    public Component getEditorComponent() { return panel; }

    public Object getItem() { return panel.getText()}

    public void selectAll() { panel.selectAll()}

    

    public void addActionListener(ActionListener l) {

        panel.addActionListener(l);

    }

    

    public void removeActionListener(ActionListener l) {

        panel.removeActionListener(l);

    }

    

    //  We create our own inner class to handle setting and

    //  repainting the image and the text.

    class ImagePanel extends JPanel {

        

        JLabel imageIconLabel;

        JTextField textField;

        

        public ImagePanel(BookEntry initialEntry) {

            setLayout(new BorderLayout());

            

            imageIconLabel = new JLabel(initialEntry.getImage());

            imageIconLabel.setBorder(new BevelBorder(BevelBorder.RAISED));

            

            textField = new JTextField(initialEntry.getTitle());

            textField.setColumns(45);

            textField.setBorder(new BevelBorder(BevelBorder.LOWERED));

            

            add(imageIconLabel, BorderLayout.WEST);

            add(textField, BorderLayout.EAST);

        }

        

        public void setText(String s) { textField.setText(s)}

        public String getText() { return (textField.getText())}

        

        public void setIcon(Icon i) {

            imageIconLabel.setIcon(i);

            repaint();

        }

        

        public void selectAll() { textField.selectAll()}

        

        public void addActionListener(ActionListener l) {

            textField.addActionListener(l);

        }

        public void removeActionListener(ActionListener l) {

            textField.removeActionListener(l);

        }

    }

}

Согласно Википедии, заставки компьютера термин для изображения, которое появляется в то время как программа или операционная система загружается. Она предоставляет пользователю визуальным индикатором, что программа инициализации. До Java SE 6, (кодовое имя Mustang) вы могли бы предложить лишь поведение заставки путем создания окна в самом начале вашего основного метода и размещении изображений в нем. Хотя это работало, он требует выполнения Java в полной инициализации перед появившемся окне. Эта инициализация включен AWT и Swing обычно, так что задержка первоначального графического дисплея. С Mustang, новый параметр командной строки делает эту функцию гораздо проще. Он также отображает изображения быстрее, чтобы пользователь, то есть еще до того, Java Runtime началась. Окончательного включения этой функции подлежит утверждению JCP.

Command Line Option

Если вы запускаете программу из командной строки, вы можете создать заставку через-всплеск параметр командной строки. Эта функция очень полезна, когда вы используете сценарий, пакетный файл или ярлык для запуска программы. Параметр командной строки следуют Название изображения:

java -splash:Hello.png HelloWorld

Да, это двоеточие между-всплеск и имя изображения. Это сразу же выводит изображение перед Runtime Environment полностью инициализирован. Изображения отображаются в центре экрана. Изображения заставку можно иметь GIF, PNG или JPEG форматы. Как и в случае с обычным классом изображения, заставки изображения поддержку анимации, транспарентности и прозрачности (прозрачность поддержка ограничивается Microsoft Windows 2000 или XP). Заставка исчезает при первом окне создается приложение.

JAR File Manifests

Обычно большинство пользователей не захотят поставить-всплеск на их въезд командной строки. Так, может быть более эффективным способом отображения заставки для создания файла манифеста в приложение, а затем объединить приложения с манифестом и изображения в JAR файл. Когда пользователь запускает приложение с JAR файла, появляется заставка. В этом случае пользователю не нужно указывать опцию командной строки.

Проявляться конфигурационный файл называется SplashScreen-Image. Варианта следует файла образа. Полный путь к файлу должен быть указан, если файл находится не на самом высоком уровне ЕАО файла.

Вот простой пример, который демонстрирует эти новые возможности заставки. Во-первых, создайте следующую программу:


   import javax.swing.*;

   import java.awt.*;

   

   public class HelloSplash {

     public static void main(String args[]) {

       Runnable runner = new Runnable() {

         public void run() {

           try {

               Thread.sleep(1500);

           catch (InterruptedException e) {

           }

           JFrame frame = new JFrame("Splash Me");

           frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

           JLabel label = new JLabel(

                "Hello, Splash", JLabel.CENTER);

           frame.add(label, BorderLayout.CENTER);

           frame.setSize(30095);

           frame.setVisible(true);

        }

       };

       EventQueue.invokeLater(runner);

     }

    

Далее, компиляции программы:

javac HelloSplash.java

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

java -splash:MyImage.png HelloSplash

Вы увидите MyImage в центре экрана немедленно, с последующим применением экране после того, окружающая среда Java Runtime инициализирует.



javax.swing
javax.swing

Теперь давайте попробуем подход JAR файле. Сначала создайте manifest.mf файла манифеста. Содержимое файла должна выглядеть следующим образом:

Manifest-Version: 1.0
Main-Class: HelloSplash
SplashScreen-Image: MyImage.png

Затем пакет JAR файл:

jar -mcvf manifest.mf Splash.jar HelloSplash*.class MyImage.png

Затем запустите JAR без указания-всплеск параметр командной строки:

java -jar Splash.jar

Как и прежде, вы должны увидеть заставку с последующим применением экрана.

Если ваш JAR файл изображения заставки, указанный в своем манифесте, и пользователь задает плеск изображений с помощью командной строки, изображение командной строки дается приоритет и значок.

Beyond the Basics

Хотя в командной строке-всплеск и явной SplashScreen-Параметры изображения достаточно для большинства задач, существует больше для заставки в Мустанге. Java.awt Предложений SplashScreen класс для более продвинутых функций за рамки просто показывая изображение заставки.

При условии, изображение было создано ни-всплеск опцией командной строки или заставки-Image опцию в манифесте, getSplashScreen () метод возвращает SplashScreen класс генерируемых экраном. Если не был создан образ, getSplashScreen () возвращает NULL.

Использование других SplashScreen методы, вы можете обнаружить различные вещи, связанные с заставки:

  • getBounds() returns the bounds of the splash screen rectangle.
  • getImageURL() returns the URL of the splash screen image.
  • getSize() returns the size of the splash screen window.
  • isVisible() indicates whether the splash screen is visible

Вы можете изменять изображение, показанное после заставки загружен, но до запуска приложения. У вас есть два способа сделать это. SetImageURL () позволяет вам обеспечить URL для нового изображения на дисплее. Второй подход, который, вероятно, более типичным, является вызов getGraphics () для получения графического контекста (java.awt.Graphics) в окно. Затем обновите изображение с любой нормальный графический и Java 2D API. Это потому, что это экземпляр Graphics2D, а не просто java.awt.Graphics. После того как вы привлечь к контексту графику, вы вызываете Update () Метод SplashScreen обратить обновленный образ.

Вот пример последнего поведение, которое циклы через букет цветов на заставки. Представьте себе, это отображение прогресс бар или другое состояние данных с указанием прогресса применения инициализации.


   import javax.swing.*;

   import java.awt.*;

   import java.awt.geom.*;

   import java.util.*;



   public class ExtendedSplash {

     public static void main(String args[]) {

       Runnable runner = new Runnable() {

         public void run() {

           Random random = new Random();

           SplashScreen splash = SplashScreen.getSplashScreen();

           Graphics2D g = (Graphics2D)splash.getGraphics();

           Dimension dim = splash.getSize();

           Color colors[] {Color.RED, Color.ORANGE, 

             Color.YELLOW, Color.GREEN, Color.BLUE, 

             Color.MAGENTA};

           for (int i=0; i<100; i++) {

             g.setColor(colors[i % colors.length]);

             g.fillRect(5050, dim.width-100, dim.height-100);

             splash.update();

             try {

               Thread.sleep(250);

             catch (InterruptedException ignored) {

             }

           }

           JFrame frame = new JFrame("Splash Me2");

           frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

           JLabel label = 

             new JLabel("Hello, Splash", JLabel.CENTER);

           frame.add(label, BorderLayout.CENTER);

           frame.setSize(30095);

           frame.setVisible(true);

         }

       };

       EventQueue.invokeLater(runner);

     }

   }



javax.swing

Обратите внимание, что рисунок делается на изображении заставки.

После цвета Велоспорт завершена, этот пример показывает кадр. Это типично для запуска процесса: после завершения инициализации показать рамку, которая скрывает заставка.

SplashScreen окончательного варианта говоря уже использует Close () метода. Вы можете вызывать этот метод, если вы хотите закрывать окна и освободить связанные с ними ресурсы. Это не нужно явно вызвать этот метод, поскольку оно вызывается автоматически при первом окно становится видимым.

За дополнительной информацией об использовании экраны, см. в статье технического Новый Splash-Screen Функциональность в Mustang. Также см. Javadoc для.

Copyright (C) 2004-2005 Sun Microsystems, Inc
Все права защищены.

Этот совет Java Swing иллюстрирует метод реализации слайдер с делениями и наклейки. JSlider использоваться в оконечности использоваться аналогичным образом для прокрутки: нулевой аргумент конструктор создает горизонтальный слайдер с диапазоном от 0 до 100 и начальное значение 50. Можно также указать ориентацию (через JSlider.HORIZONTAL или JSlider.VERTICAL) и диапазон и начальное значение в конструктор. Разработчик может обрабатывать события путем присоединения ChangeListener. Ее stateChanged метод обычно призывает ие посмотреть текущее значение JSlider.


import java.awt.*;

import javax.swing.*;



public class JSliders extends JFrame {

    public static void main(String[] args) {

        new JSliders();

    }

    

    public JSliders() {

        super("Using JSlider");

        // Comment out next line for Java LAF

        WindowUtilities.setNativeLookAndFeel();

        addWindowListener(new ExitListener());

        Container content = getContentPane();

        content.setBackground(Color.white);

        

        JSlider slider1 = new JSlider();

        slider1.setBorder(BorderFactory.createTitledBorder(

                "JSlider without Tick Marks"));

        

        content.add(slider1, BorderLayout.NORTH);

        

        JSlider slider2 = new JSlider();

        slider2.setBorder(BorderFactory.createTitledBorder(

                "JSlider with Tick Marks"));

        

        slider2.setMajorTickSpacing(20);

        slider2.setMinorTickSpacing(5);

        slider2.setPaintTicks(true);

        content.add(slider2, BorderLayout.CENTER);

        

        JSlider slider3 = new JSlider();

        slider3.setBorder(BorderFactory.createTitledBorder(

                "JSlider with Tick Marks & Labels"));

        

        slider3.setMajorTickSpacing(20);

        slider3.setMinorTickSpacing(5);

        slider3.setPaintTicks(true);

        slider3.setPaintLabels(true);

        content.add(slider3, BorderLayout.SOUTH);

        

        pack();

        setVisible(true);

    }

}

Этот совет Java Swing иллюстрирует метод загрузки и играть аудиоклипа. Этот совет включает также предоставляют графический интерфейс для пользователей с различными опциями, как играть на клип в петлю, выемки и т.д. Разработчики оно может настроить это и сделать свой собственный плеер аудио.


import java.applet.*;

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;



public class LoadAudioAndPlay extends JApplet {

   private AudioClip sound1, sound2, currentSound;  

   private JButton playSound, loopSound, stopSound;

   private JComboBox chooseSound;



   // load the image when the applet begins executing

   public void init()

   {

      Container c = getContentPane();

      c.setLayoutnew FlowLayout() );



      String choices[] "Welcome""Hi" };

      chooseSound = new JComboBoxchoices );

      chooseSound.addItemListener(

         new ItemListener() {

            public void itemStateChangedItemEvent e )

            {

               currentSound.stop();



               currentSound =

                  chooseSound.getSelectedIndex() == ?

                     sound1 : sound2;

            }

         }

      );

      c.addchooseSound );



      ButtonHandler handler = new ButtonHandler();

      playSound = new JButton"Play" );

      playSound.addActionListenerhandler );

      c.addplaySound );

      loopSound = new JButton"Loop" );

      loopSound.addActionListenerhandler );

      c.addloopSound );

      stopSound = new JButton"Stop" );

      stopSound.addActionListenerhandler );

      c.addstopSound );



      sound1 = getAudioClip(

                 getDocumentBase()"welcome.wav" );

      sound2 = getAudioClip(

                 getDocumentBase()"hi.au" );

      currentSound = sound1;

   }



   // stop the sound when the user switches Web pages

   // (i.e., be polite to the user)

   public void stop()

   {

      currentSound.stop();

   }



   private class ButtonHandler implements ActionListener {

      public void actionPerformedActionEvent e )

      {

         if e.getSource() == playSound c

            currentSound.play();

         else if e.getSource() == loopSound 

            currentSound.loop();

         else if e.getSource() == stopSound 

            currentSound.stop();

      }

   }

}