Spec-Zone .ru
спецификации, руководства, описания, API
|
JLayer
class является гибким и мощным декоратором для компонентов Swing. Это позволяет Вам привлечь компоненты и ответить на компонентные события, не изменяя базовый компонент непосредственно.
JLayer
class в Java SE 7 подобен в духе проекту проекта JxLayer в JLayer
class был первоначально основан на JXLayer
проект, но его API развился отдельно.
Этот документ описывает примеры, которые показывают питание JLayer
class. Полный исходный код доступен.
JLayer
КлассLayerUI
КлассДля краткого введения в материал на этой странице смотрите следующий видеофильм.
Поддерживающий JavaScript веб-браузер и Интернет-соединение требуются для видео. Если невозможно посмотреть видео, попытайтесь
JLayer
Класс javax.swing.JLayer
class является половиной команды. Другая половина javax.swing.plaf.LayerUI
class. Предположите, что Вы хотите сделать некоторый пользовательский рисунок на a JButton
объект (украшают JButton
объект). Компонент, который Вы хотите украсить, является целью.
LayerUI
подкласс, чтобы сделать рисунок.JLayer
возразите, что обертывает цель и LayerUI
объект.JLayer
возразите в своем пользовательском интерфейсе так же, как Вы использовали бы целевой компонент.Например, чтобы добавить экземпляр a JPanel
разделите на подклассы к a JFrame
объект, Вы сделали бы что-то подобное этому:
JFrame f = new JFrame(); JPanel panel = createPanel(); f.add (panel);
Украсить JPanel
возразите, сделайте что-то подобное этому вместо этого:
JFrame f = new JFrame(); JPanel panel = createPanel(); LayerUI<JPanel> layerUI = new MyLayerUISubclass(); JLayer<JPanel> jlayer = new JLayer<JPanel>(panel, layerUI); f.add (jlayer);
Используйте обобщения, чтобы гарантировать что JPanel
возразите и LayerUI
объект для совместимых типов. В предыдущем примере, оба JLayer
возразите и LayerUI
объект используется с JPanel
class.
JLayer
class обычно generified с точным типом его компонента представления, в то время как LayerUI
class разрабатывается, чтобы использоваться с JLayer
классы его универсального параметра или любой из его предков.
Например, a LayerUI<JComponent>
объект может использоваться с a JLayer<AbstractButton>
объект.
A LayerUI
объект ответственен за пользовательское художественное оформление и обработку событий для a JLayer
объект. Когда Вы создаете экземпляр a LayerUI
подкласс, Ваше пользовательское поведение может быть применимым к каждому JLayer
объект с соответствующим универсальным типом. Именно поэтому JLayer
class final
; все пользовательское поведение инкапсулируется в Вашем LayerUI
подкласс, таким образом нет никакой потребности сделать a JLayer
подкласс.
LayerUI
Класс LayerUI
class наследовал большую часть своего поведения от ComponentUI
class. Вот обычно переопределенные методы:
paint(Graphics g, JComponent c)
метод вызывают, когда целевой компонент должен быть оттянут. Чтобы представить компонент таким же образом, что Swing представляет это, вызовите super.paint(g, c)
метод.installUI(JComponent c)
метод вызывают когда экземпляр Вашего LayerUI
подкласс связывается с компонентом. Выполните любые необходимые инициализации здесь. Компонент, который передают в, является соответствием JLayer
объект. Получите целевой компонент с JLayer
class' getView()
метод.uninstallUI(JComponent c)
метод вызывают когда экземпляр Вашего LayerUI
подкласс больше не связывается с данным компонентом. Очистите здесь в случае необходимости.Использовать JLayer
class, Вы нуждаетесь в пользе LayerUI
подкласс. Самые простые виды LayerUI
классы изменяются, как оттягиваются компоненты. Вот один, например, который красит прозрачный цветной градиент на компоненте.
class WallpaperLayerUI extends LayerUI<JComponent> { @Override public void paint(Graphics g, JComponent c) { super.paint(g, c); Graphics2D g2 = (Graphics2D) g.create(); int w = c.getWidth(); int h = c.getHeight(); g2.setComposite(AlphaComposite.getInstance( AlphaComposite.SRC_OVER, .5f)); g2.setPaint(new GradientPaint(0, 0, Color.yellow, 0, h, Color.red)); g2.fillRect(0, 0, w, h); g2.dispose(); } }
paint()
метод - то, где пользовательский рисунок имеет место. Звонок super.paint()
метод тянет содержание JPanel
объект. После установки 50%-ого прозрачного составного объекта оттягивается цветной градиент.
После LayerUI
подкласс определяется, используя его прост. Вот некоторый исходный код, который использует WallpaperLayerUI
class:
import java.awt.*; import javax.swing.*; import javax.swing.plaf.LayerUI; public class Wallpaper { public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createUI(); } }); } public static void createUI() { JFrame f = new JFrame("Wallpaper"); JPanel panel = createPanel(); LayerUI<JComponent> layerUI = new WallpaperLayerUI(); JLayer<JComponent> jlayer = new JLayer<JComponent>(panel, layerUI); f.add (jlayer); f.setSize(300, 200); f.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); f.setLocationRelativeTo (null); f.setVisible (true); } private static JPanel createPanel() { JPanel p = new JPanel(); ButtonGroup entreeGroup = new ButtonGroup(); JRadioButton radioButton; p.add(radioButton = new JRadioButton("Beef", true)); entreeGroup.add(radioButton); p.add(radioButton = new JRadioButton("Chicken")); entreeGroup.add(radioButton); p.add(radioButton = new JRadioButton("Vegetable")); entreeGroup.add(radioButton); p.add(new JCheckBox("Ketchup")); p.add(new JCheckBox("Mustard")); p.add(new JCheckBox("Pickles")); p.add(new JLabel("Special requests:")); p.add(new JTextField(20)); JButton orderButton = new JButton("Place Order"); p.add(orderButton); return p; } }
Вот результат:
Исходный код:
Выполненный с Сетью Java Запустите:
LayerUI
class' paint()
метод дает Вам полный контроль над тем, как оттягивается компонент. Вот другой LayerUI
подкласс, который показывает, как все содержание панели может быть изменено, используя Java 2-D обработка изображений:
class BlurLayerUI extends LayerUI<JComponent> { private BufferedImage mOffscreenImage; private BufferedImageOp mOperation; public BlurLayerUI() { float ninth = 1.0f / 9.0f; float[] blurKernel = { ninth, ninth, ninth, ninth, ninth, ninth, ninth, ninth, ninth }; mOperation = new ConvolveOp( new Kernel(3, 3, blurKernel), ConvolveOp.EDGE_NO_OP, null); } @Override public void paint (Graphics g, JComponent c) { int w = c.getWidth(); int h = c.getHeight(); if (w == 0 || h == 0) { return; } // Only create the offscreen image if the one we have // is the wrong size. if (mOffscreenImage == null || mOffscreenImage.getWidth() != w || mOffscreenImage.getHeight() != h) { mOffscreenImage = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); } Graphics2D ig2 = mOffscreenImage.createGraphics(); ig2.setClip(g.getClip()); super.paint(ig2, c); ig2.dispose(); Graphics2D g2 = (Graphics2D)g; g2.drawImage(mOffscreenImage, mOperation, 0, 0); } }
В paint()
метод, панель представляется во внеэкранном изображении. Внеэкранное изображение обрабатывается с оператором свертки, тогда привлеченным на экран.
Весь пользовательский интерфейс, все еще живут, только расплывчатые:
Исходный код:
Выполненный с Сетью Java Запустите:
Ваш LayerUI
подкласс может также получить все события его соответствующего компонента. Однако, JLayer
экземпляр должен зарегистрировать свой интерес к определенным типам событий. Это происходит с JLayer
class' setLayerEventMask()
метод. Как правило, однако этот вызов выполняется от инициализации, выполняемой в LayerUI
class' installUI()
метод.
Например, следующая выборка показывает часть a LayerUI
подкласс, который регистрируется, чтобы получить мышь и события движения мыши.
public void installUI(JComponent c) { super.installUI(c); JLayer jlayer = (JLayer)c; jlayer.setLayerEventMask( AWTEvent.MOUSE_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK ); }
Все события, идущие в Ваш JLayer
подкласс направляется к методу обработчика событий, имя которого соответствует тип события. Например, можно ответить на мышь и события движения мыши, переопределяя соответствующие методы:
protected void processMouseEvent(MouseEvent e, JLayer l) { // ... } protected void processMouseMotionEvent(MouseEvent e, JLayer l) { // ... }
Следующее является a LayerUI
подкласс, который тянет полупрозрачный круг везде, куда мышь перемещается в панели.
class SpotlightLayerUI extends LayerUI<JPanel> { private boolean mActive; private int mX, mY; @Override public void installUI(JComponent c) { super.installUI(c); JLayer jlayer = (JLayer)c; jlayer.setLayerEventMask( AWTEvent.MOUSE_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK ); } @Override public void uninstallUI(JComponent c) { JLayer jlayer = (JLayer)c; jlayer.setLayerEventMask(0); super.uninstallUI(c); } @Override public void paint (Graphics g, JComponent c) { Graphics2D g2 = (Graphics2D)g.create(); // Paint the view. super.paint (g2, c); if (mActive) { // Create a radial gradient, transparent in the middle. java.awt.geom.Point2D center = new java.awt.geom.Point2D.Float(mX, mY); float radius = 72; float[] dist = {0.0f, 1.0f}; Color[] colors = {new Color(0.0f, 0.0f, 0.0f, 0.0f), Color.BLACK}; RadialGradientPaint p = new RadialGradientPaint(center, radius, dist, colors); g2.setPaint(p); g2.setComposite(AlphaComposite.getInstance( AlphaComposite.SRC_OVER, .6f)); g2.fillRect(0, 0, c.getWidth(), c.getHeight()); } g2.dispose(); } @Override protected void processMouseEvent(MouseEvent e, JLayer l) { if (e.getID() == MouseEvent.MOUSE_ENTERED) mActive = true; if (e.getID() == MouseEvent.MOUSE_EXITED) mActive = false; l.repaint(); } @Override protected void processMouseMotionEvent(MouseEvent e, JLayer l) { Point p = SwingUtilities.convertPoint(e.getComponent(), e.getPoint(), l); mX = p.x; mY = p.y; l.repaint(); } }
mActive
переменная указывает, является ли мышь в координатах панели. В installUI()
метод, setLayerEventMask()
метод вызывают, чтобы указать LayerUI
интерес подкласса к получению мыши и событий движения мыши.
В processMouseEvent()
метод, mActive
флаг устанавливается в зависимости от позиции мыши. В processMouseMotionEvent()
метод, координаты перемещения мыши сохранены в mX
и mY
задействованные переменные так, чтобы они могли использоваться позже в paint()
метод.
paint()
метод показывает появление значения по умолчанию панели, затем накладывает радиальный градиент для эффекта центра внимания:
Исходный код:
Выполненный с Сетью Java Запустите:
Этим примером является анимированный занятый индикатор. Это демонстрирует анимацию в a LayerUI
разделите на подклассы и обладает постепенным появлением и постепенным исчезновением. Это более усложняется, что предыдущие примеры, но это основано на том же самом принципе определения a paint()
метод для пользовательского рисунка.
Нажмите кнопку Place Order, чтобы видеть занятый индикатор в течение 4 секунд. Заметьте, как панель отображается серым и вращения индикатора. У элементов индикатора есть переменные уровни прозрачности.
LayerUI
подкласс, WaitLayerUI
class, шоу, как запустить события изменения свойства, чтобы обновить компонент. WaitLayerUI
class использует a Timer
возразите, чтобы обновить его состояние 24 раза в секунду. Это происходит в целевом методе таймера, actionPerformed()
метод.
actionPerformed()
метод использует firePropertyChange()
метод, чтобы указать, что внутреннее состояние было обновлено. Это инициировало звонок applyPropertyChange()
метод, который перекрашивает JLayer
объект:
Исходный код:
Выполненный с Сетью Java Запустите:
Заключительный пример в этом документе показывает как JLayer
class может использоваться, чтобы украсить текстовые поля, чтобы показать, содержат ли они допустимые данные. В то время как другие примеры используют JLayer
class, чтобы обернуть панели или общие компоненты, этот пример показывает, как обернуть a JFormattedTextField
компонент определенно. Это также демонстрирует что сингл LayerUI
реализация подкласса может использоваться для многократного JLayer
экземпляры.
JLayer
class используется, чтобы обеспечить визуальную индикацию для полей, у которых есть недопустимые данные. Когда ValidationLayerUI
class красит текстовое поле, он тянет красноту X, если полевое содержание не может быть проанализировано. Вот пример:
Исходный код:
Выполненный с Сетью Java Запустите: