Desenvolvedor e Analista de Sistemas | IFPA

segunda-feira, 11 de agosto de 2014

Tutorial SwingX - JXPanel

com 0 Comentário

Introdução

SwingX é uma extensão da API Swing pelas pessoas que trabalham na equipe de Swing.O código é liberado como open source em Sun SwingLabs  . Partes da API que são maduros devem aparecer em Java 7 É uma ótima maneira de obter um sneak peek em novos componentes e tecnologias que a equipe do balanço está trabalhando, mas não está pronto para um lançamento oficial, o que leva tempo , etc
Uma das maiores mudanças com a API SwingX é de uso de pintores. Normalmente, se você quisesse criar novos componentes em Swing, você teria que mexer com a aparência ea API. Pintores dar-lhe a capacidade de usar o código Java2D para definir rapidamente a aparência do seu componente.

JXPanel

SwingX vem com seu próprio gerente repaint costume (que substitui a implementação padrão usado pelo balanço, não só pode ser um ativo em determinado momento). Este gerente repaint costume respeita a transparência de uma SwingX recipiente de nível superior - por exemplo, JXPanel. Ao contrário de um JPanel, quando você coloca um JButton em uma JXPanel, e definir a transparência do botão, ele irá reter é a transparência, mesmo quando você clicar no botão. No caso do JPanel, quando o JButton aparece pela primeira vez, vai ser transparente, mas assim que você clicar nele, ele vai se tornar opaco. Você pode fazer coisas como alterar a transparência de todos os componentes em um JXPanel por exemplo, e muitos outros efeitos interessantes. Você pode amarrar isso no TimingFramework  e muito rapidamente criar animações muito legais em sua interface de usuário (como alterar a transparência de seus componentes, alterando a propriedade "alpha" de 0.0f para 1.0f a desvanecer-se em um painel).

Pintores

Os pintores API é agradável e simples. Todo o código Java2D que você deseja usar para pintar o componente, que de outra forma iriam em uma subclasse de um componente Swing que é paint () ou o método paintComponent () você substituído, é colocado em uma classe que implementa o pintor <T > de interface, que é definido da seguinte maneira:
1: public void paint(Graphics2D g, T object, int width, int height);
Há muitas implementações Pintor fornecidas por você, e você pode várias implementações pintor existentes ainda compostos para criar novos. Você está limitado apenas pela sua imaginação e proficiência com a API Java2D  . Todos os componentes são SwingX Painter habilitado - todos eles têm um método (Painter <T>) setBackgroundPainter.

Os pintores API

Fora da caixa, SwingX vem com um rico conjunto de implementações do pintor, alguns dos quais estão listados aqui:
  1. GlossPainter  - isso pinta um efeito de brilho em seu componente, você pode escolher o brilho da pintura  objeto ea posição gloss (superior / inferior). O efeito gloss é pintado como um arco cheio que destaca o componente com qualquer cor que você forneceu. A pintura  objeto que é usado para pintar o efeito de brilho pode ser uma cor simples, ou um gradiente ou uma textura. 
  2. ImagePainter  - isso pinta um BufferedImage  em seu componente. Você tem controle sobre como você deseja que a imagem pintada. Você pode optar por tê-lo escalado para o local da área que precisa ser pintado, ou você pode tê-lo lado a lado ou centralizado. Há muitas opções de layout que você pode escolher. 
  3. MattePainter  - este usa uma pintura  objeto para pintar seu componente. Isto pode ser utilizado para encher a área do componente com uma cor, o gradiente ou textura. 
  4. PinstripePainter  - este pinta riscas em seu componente, e você pode controlar o ângulo, largura, distância entre si, e cor ( pintura  objeto) dessas listras. Em vez de usar uma cor, você pode usar um gradiente ou textura, etc 
  5. CompoundPainter  - isso permite que você adicione várias implementações pintor a um componente. Os pintores serão processados ​​na ordem em que são adicionados ao CompoundPainter  . Ele pode ser usado para criar rapidamente efeitos legais. 
  6. RectanglePainter  - isso pinta um retângulo em seu componente. Você pode selecionar um preenchimento pintura objeto e fundo da pintura do objeto. Há muitas outras opções como tamanho da borda e cantos arredondados.
Existem outros pintores como ShapePainter, TextPainter, URLPainter, CheckerboardPainter e BusyPainter. Você pode estender AbstractPainter  para criar o seu próprio. Os exemplos de código a seguir irá começar a usar pintores; experiência com a API e criar seus próprios efeitos usando os pintores prestados, e combiná-las usando CompoundPainter.

Fonte exemplo de código 1

No exemplo a seguir, eu vou criar um JXLabel e definir um pintor fundo composto nele. Aqui está o que parece:
Aqui está o código que produziu este pintor:
 1: /**
 2:  * this compound painter composites a bunch of different painters.
 3:  */
 4: private Painter getPainter() {
 5:   // set the background painter
 6:   MattePainter mp = new MattePainter(Colors.LightBlue.alpha(0.5f));
 7:   GlossPainter gp = new GlossPainter(Colors.White.alpha(0.3f),
 8:                                      GlossPainter.GlossPosition.TOP);
 9:   PinstripePainter pp = new PinstripePainter(Colors.Gray.alpha(0.2f),
 10:                                              45d);
 11:   return (new CompoundPainter(mp, pp, gp));
 12: }
Neste exemplo, eu crio três pintores e combiná-las e aplicá-las ao JXLabel  (que é a classe rótulo SwingX):
  1. MattePainter - Eu encho o componente com uma cor azul clara translúcida (50% transparente).
  2. GlossPainter - I aplicar um verniz branco (30% transparente) para a parte superior da etiqueta.
  3. PinstripePainter - aplico um (50% transparente) cor cinza com o rótulo.
Esses pintores são aplicadas na ordem em que são adicionados ao CompoundPainter - primeiro MattePainter, então PinstripePainter e, finalmente GlossPainter. Se você olhar para a imagem, você vai ver que as riscas estão por trás do efeito Gloss. Além disso, observe que o texto "Exemplo Pintor 1" está na frente dos pintores, uma vez que são todos os pintores de fundo. Se você deseja adicionar texto atrás de um pintor, então use o TextPainter e certifique-se de adicioná-lo na ordem correta em sua CompositePainter.
Aqui está o código fonte completo listando para este exemplo:
 1: import org.jdesktop.swingx.*;
 2: import org.jdesktop.swingx.painter.*;
 3:
 4: import javax.swing.*;
 5: import java.awt.*;
 6:
 7: /**
 8:  * PainterExample1
 9:  *
 10:  * @author Nazmul Idris
 11:  * @version 1.0
 12:  * @since Dec 25, 2007, 3:54:13 PM
 13:  */
 14: public class PainterExample1 {
 15:
 16: /**
 17:  * simple main driver for this class
 18:  */
 19: public static void main(String[] args) {
 20:   SwingUtilities.invokeLater(new Runnable() {
 21:     public void run() {
 22:       new PainterExample1();
 23:     }
 24:   });
 25: }
 26:
 27: /**
 28:  * creates a JFrame and calls {@link #doInit} to create a JXPanel and adds the panel to this frame.
 29:  */
 30: public PainterExample1(){
 31:   JFrame frame = new JFrame("Painter Example 1");
 32:
 33:   // add the panel to this frame
 34:   frame.add(doInit());
 35:
 36:   // when you close the frame, the app exits
 37:   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 38:
 39:   // center the frame and show it
 40:   frame.setLocationRelativeTo(null);
 41:   frame.pack();
 42:   frame.setVisible(true);
 43: }
 44:
 45: /**
 46:  * creates a JXLabel and attaches a painter to it.
 47:  */
 48: private Component doInit() {
 49:   JXPanel panel = new JXPanel();
 50:   panel.setLayout(new BorderLayout());
 51:
 52:   JXLabel label = new JXLabel();
 53:   label.setFont(new Font("Segoe UI", Font.BOLD, 14));
 54:   label.setText("Painter Example 1");
 55:   label.setHorizontalAlignment(JXLabel.CENTER);
 56:   label.setBackgroundPainter(getPainter());
 57:
 58:   panel.add(label, BorderLayout.CENTER);
 59:
 60:   panel.setPreferredSize(new Dimension(250,100));
 61:
 62:   return panel;
 63: }
 64:
 65: /**
 66:  * this compound painter composites a bunch of different painters.
 67:  */
 68: private Painter getPainter() {
 69:   // set the background painter
 70:   MattePainter mp = new MattePainter(Colors.LightBlue.alpha(0.5f));
 71:   GlossPainter gp = new GlossPainter(Colors.White.alpha(0.3f),
 72:                                      GlossPainter.GlossPosition.TOP);
 73:   PinstripePainter pp = new PinstripePainter(Colors.Gray.alpha(0.2f),
 74:                                              45d);
 75:   return (new CompoundPainter(mp, pp, gp));
 76: }
 77: }//end class PainterExample1
A outra classe interessante é a enumeração cores, que torna mais fácil para trabalhar com as cores. Vou escrever um tutorial sobre enumerações java5 e como torná-la realmente fácil de criar constantes de tipo seguro, e muito mais. Ele permite que você trabalhe facilmente com cores personalizadas que você criou, e você pode obter cores translúcidas convenientemente, e você pode obter HEX codificado cordas para usar em HTML. Aqui está uma lista do enum Cor:
 1: import java.awt.*;
 2:
 3: /**
 4:  * Colors is an enumeration class that makes it easier to work with colors. Methods are provided for
 5:  * conversion to hex strings, and for getting alpha channel colors.
 6:  *
 7:  * @author Nazmul Idris
 8:  * @version 1.0
 9:  * @since Apr 21, 2007, 12:55:24 PM
 10:  */
 11: public enum Colors {
 12:
 13: //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
 14: // various colors in the pallete
 15: //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
 16:   Pink(255, 175, 175),
 17:   Green(159, 205, 20),
 18:   Orange(213, 113, 13),
 19:   Yellow(Color.yellow),
 20:   Red(189, 67, 67),
 21:   LightBlue(208, 223, 245),
 22:   Blue(Color.blue),
 23:   Black(0, 0, 0),
 24:   White(255, 255, 255),
 25:   Gray(Color.gray.getRed(), Color.gray.getGreen(), Color.gray.getBlue());
 26:
 27: //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
 28: // constructors
 29: //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
 30:
 31: Colors(Color c) {
 32:   _myColor = c;
 33: }
 34:
 35: Colors(int r, int g, int b) {
 36:   _myColor = new Color(r, g, b);
 37: }
 38:
 39: Colors(int r, int g, int b, int alpha) {
 40:   _myColor = new Color(r, g, b, alpha);
 41: }
 42:
 43: Colors(float r, float g, float b, float alpha) {
 44:   _myColor = new Color(r, g, b, alpha);
 45: }
 46:
 47: //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
 48: // data
 49: //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
 50:
 51: private Color _myColor;
 52:
 53: //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
 54: // methods
 55: //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
 56:
 57: public Color alpha(float t) {
 58:   return new Color(_myColor.getRed(), _myColor.getGreen(), _myColor.getBlue(), (int) (t * 255f));
 59: }
 60:
 61: public static Color alpha(Color c, float t) {
 62:   return new Color(c.getRed(), c.getGreen(), c.getBlue(), (int) (t * 255f));
 63: }
 64:
 65: public Color color() { return _myColor; }
 66:
 67: public Color color(float f) {
 68:   return alpha(f);
 69: }
 70:
 71: public String toString() {
 72:   StringBuilder sb = new StringBuilder();
 73:   sb.append("r=")
 74:       .append(_myColor.getRed())
 75:       .append(", g=")
 76:       .append(_myColor.getGreen())
 77:       .append(", b=")
 78:       .append(_myColor.getBlue())
 79:       .append("\n");
 80:   return sb.toString();
 81: }
 82:
 83: public String toHexString() {
 84:   Color c = _myColor;
 85:   StringBuilder sb = new StringBuilder();
 86:   sb.append("#");
 87:   sb.append(Integer.toHexString(_myColor.getRed()));
 88:   sb.append(Integer.toHexString(_myColor.getGreen()));
 89:   sb.append(Integer.toHexString(_myColor.getBlue()));
 90:   return sb.toString();
 91: }
 92:
 93: }//end enum Colors

Fonte exemplo de código 2

Neste segundo exemplo, vou mostrar-lhe como usar um pintor diferente para desenhar um preenchimento gradiente em um componente, e alterá-lo de transparência usando JXLabel. Aqui está uma imagem:
imagem
Aqui está o código para o pintor:
 1: /** this painter draws a gradient fill */
 2: public Painter getPainter() {
 3:   int width = 100;
 4:   int height = 100;
 5:   Color color1 = Colors.White.color(0.5f);
 6:   Color color2 = Colors.Gray.color(0.5f);
 7:
 8:   LinearGradientPaint gradientPaint =
 9:       new LinearGradientPaint(0.0f, 0.0f, width, height,
 10:                               new float[]{0.0f, 1.0f},
 11:                               new Color[]{color1, color2});
 12:   MattePainter mattePainter = new MattePainter(gradientPaint);
 13:   return mattePainter;
 14: }
O MattePainter usa um objeto Paint, que atrai um preenchimento de gradiente (usando a classe LinearGradientPaint).
A seguinte linha de código faz com que o JXPanel e tudo dentro dele 50% transparente:
 1: // set the transparency of the JXPanel to 50% transparent
 2: panel.setAlpha(0.5f);
Aqui está a listagem de código completo para este exemplo:
 1: import org.jdesktop.swingx.*;
 2: import org.jdesktop.swingx.painter.*;
 3:
 4: import javax.swing.*;
 5: import java.awt.*;
 6:
 7: /**
 8:  * PainterExample2
 9:  *
 10:  * @author Nazmul Idris
 11:  * @version 1.0
 12:  * @since Dec 25, 2007, 3:54:13 PM
 13:  */
 14: public class PainterExample2 {
 15:
 16: /** simple main driver for this class */
 17: public static void main(String[] args) {
 18:   SwingUtilities.invokeLater(new Runnable() {
 19:     public void run() {
 20:       new PainterExample2();
 21:     }
 22:  });
 23: }
 24:
 25: /** creates a JFrame and calls {@link #doInit} to create a JXPanel and adds the panel to this frame. */
 26: public PainterExample2() {
 27:   JFrame frame = new JFrame("Painter Example 2");
 28:
 29:   // add the panel to this frame
 30:   frame.add(doInit());
 31:
 32:   // when you close the frame, the app exits
 33:   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 34:
 35:   // center the frame and show it
 36:   frame.setLocationRelativeTo(null);
 37:   frame.pack();
 38:   frame.setVisible(true);
 39: }
 40:
 41: /** creates a JXLabel and attaches a painter to it. */
 42: private Component doInit() {
 43:   JXPanel panel = new JXPanel();
 44:   panel.setLayout(new BorderLayout());
 45:
 46:   JXLabel label = new JXLabel();
 47:   label.setFont(new Font("Segoe UI", Font.BOLD, 14));
 48:   label.setText("Painter Example 2");
 49:   label.setHorizontalAlignment(JXLabel.CENTER);
 50:   label.setBackgroundPainter(getPainter());
 51:
 52:   // set the transparency of the JXPanel to 50% transparent
 53:   panel.setAlpha(0.5f);
 54:
 55:   panel.add(label, BorderLayout.CENTER);
 56:   panel.setPreferredSize(new Dimension(250, 100));
 57:
 58:   return panel;
 59: }
 60:
 61: /** this painter draws a gradient fill */
 62: public Painter getPainter() {
 63:   int width = 100;
 64:   int height = 100;
 65:   Color color1 = Colors.White.color(0.5f);
 66:   Color color2 = Colors.Gray.color(0.5f);
 67:
 68:   LinearGradientPaint gradientPaint =
 69:      new LinearGradientPaint(0.0f, 0.0f, width, height,
 70:                              new float[]{0.0f, 1.0f},
 71:                              new Color[]{color1, color2});
 72:   MattePainter mattePainter = new MattePainter(gradientPaint);
 73:   return mattePainter;
 74: }
 75:
 76: }//end class PainterExample2

Faça o download do código

Você pode baixar a versão 0.9.1 do SwingX aqui  :
  1. Binários - https://swingx.dev.java.net/files/documents/2981/76227/swingx-0.9.1.zip 
  2. Fontes - https://swingx.dev.java.net/files/documents/2981/76229/swingx-0.9.1-src.zip 
  3. JavaDocs - https://swingx.dev.java.net/files/documents/2981/76228/swingx-0.9.1-javadoc.zip 
Você pode baixar o código-fonte deste tutorial, que inclui as bibliotecas SwingX, juntamente com projetos de idéia para o código aqui .

+1

0 comentários :

Postar um comentário

Total de visualizações