Desenvolvedor e Analista de Sistemas | IFPA

terça-feira, 12 de agosto de 2014

Tutorial SwingX - Task Pane (JXTaskPane, Container)

com 0 Comentário
Introdução
 SwingX introduz uma série de novos componentes para balanço, e este tutorial irá cobrir o painel de tarefas. Você já viu os painéis de tarefas antes de se você já usou o Windows, eles são amplamente utilizados no painel explorador e controle. Estão aqui estão exemplos:

O que é um painel de tarefas?
A implementação SwingX do painel de tarefas é mais parecido com o Windows XP ao invés do Windows Vista, mas a idéia é a mesma. Em um painel de tarefas , você pode adicionar várias ações e componentes que são exibidos em uma lista, que pode ser em colapso. Você é livre para adicionar mais de um painel de tarefas para um recipiente painel de tarefas . Você também pode definir um ícone e título para o seu painel de tarefas. Você também pode definir opções de formatação para alterar as cores usadas pelo painel de tarefas e o recipiente painel de tarefas.

Você não tem que usar um recipiente de painel de tarefas para realizar um painel de tarefas, você pode adicionar o painel de tarefas para qualquer recipiente swing. No entanto, se você colocar o painel de tarefas no contêiner painel de tarefas, que vai tornar melhor (SwingX muda as cores padrão do painel de tarefas e recipiente para coincidir com o sistema operacional que está sendo executado). Você pode substituir esses esquemas de cores padrão, adicionando pares de valores-chave nos padrões de interface do usuário de si mesmo. Este tutorial irá cobrir toda essa funcionalidade.

Exemplo de código fonte

No exemplo a seguir, eu vou criar um JXTaskPane, com alguns componentes, em que, em seguida, colocar em uma JXTaskPaneContainer. Aqui está o que parece:
O JXTaskPane chamado "Minhas Tarefas" tem um ícone e um título. Ele também contém uma JXLabel com um pintor de fundo, e um objeto de Ação (que tem um nome, ícone, ea dica). Quando você clica sobre a ação, ele simplesmente muda o texto do JXLabel. Note que você pode recolher todo o JXTaskPane clicando em qualquer lugar do título, ou com a tecla "espaço" com o teclado, quando está em foco. Você pode mudar o foco do teclado entre a ação eo título JXTaskPane pressionando a tecla "Tab" no seu teclado.
O primeiro passo na codificação se este exemplo é a criação de JXTaskPane e JXTaskPaneContainers. O JXTaskPane também precisa ser preenchida com uma ação e JXLabel. Aqui está o código para fazer isso:
// create a label
final JXLabel label = new JXLabel();
label.setFont(new Font("Segoe UI", Font.BOLD, 14));
label.setText("task pane item 1 : a label");
label.setIcon(Images.NetworkDisconnected.getIcon(32, 32));
label.setHorizontalAlignment(JXLabel.LEFT);
label.setBackgroundPainter(getPainter());

// tweak with the UI defaults for the taskpane and taskpanecontainer
changeUIdefaults();

// create a taskpanecontainer
JXTaskPaneContainer taskpanecontainer = new JXTaskPaneContainer();

// create a taskpane, and set it's title and icon
JXTaskPane taskpane = new JXTaskPane();
taskpane.setTitle("My Tasks");
taskpane.setIcon(Images.Quit.getIcon(24, 24));

// add various actions and components to the taskpane
taskpane.add(label);
taskpane.add(new AbstractAction() {
  {
    putValue(Action.NAME, "task pane item 2 : an action");
    putValue(Action.SHORT_DESCRIPTION, "perform an action");
    putValue(Action.SMALL_ICON, Images.NetworkConnected.getIcon(32, 32));
  }
  public void actionPerformed(ActionEvent e) {
    label.setText("an action performed");
  }
});

// add the task pane to the taskpanecontainer
taskpanecontainer.add(taskpane);
Há um par de coisas a serem observadas aqui:


1. Há uma enumeração chamada Images, que é usado para carregar algumas imagens que vêm com este exemplo. Eu adicionei 3 imagens PNG para o arquivo icons.zip que estão incluídos como parte do projeto de download (que está na pasta lib do arquivo zip). A enumeração tem código nele que me permite carregar rapidamente as imagens de formato PNG, e em seguida, redimensioná-las para a largura / altura o que é necessário para este exemplo. Eu uso oGraphicsUtilities classe que é fornecido com SwingX, que tem muitos recursos úteis que você pode usar para redimensionar imagens, etc Eu também usam o ImageIO classe para realmente ler no arquivo PNG e convertê-lo em um BufferedImage.
public enum Images {

//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
// images
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  NetworkConnected("NetworkConnected.png"),
  NetworkDisconnected("NetworkDisconnected.png"),
  Quit("quit.png");

//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
// data
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
String imagefilename;

//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
// constructor
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Images(String name) {
  imagefilename = name;
}

//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
// methods
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
BufferedImage getImage() {
  try {
    return ImageIO.read(ClassLoader.getSystemResourceAsStream(imagefilename));
  }
  catch (IOException e) {
    return null;
  }
}

Icon getIcon() {
  return new ImageIcon(getImage());
}

BufferedImage getImage(int width, int height) {
  return GraphicsUtilities.createThumbnail(getImage(), width, height);
}

Icon getIcon(int width, int height) {
  return new ImageIcon(getImage(width, height));
}

}//end enum Images
2. Há uma chamada para getPainter (), que define o pintor de fundo para o JXLabel. Para saber mais sobre pintores, ea enumeração Cores, clique aqui . Aqui está o código para getPainter ():
/** this painter draws a gradient fill */
public Painter getPainter() {
  int width = 100;
  int height = 100;
  Color color1 = Colors.White.color(0.5f);
  Color color2 = Colors.Gray.color(0.5f);

  LinearGradientPaint gradientPaint =
      new LinearGradientPaint(0.0f, 0.0f, width, height,
                              new float[]{0.0f, 1.0f},
                              new Color[]{color1, color2});
  MattePainter mattePainter = new MattePainter(gradientPaint);
  return mattePainter;
}
3. Há uma chamada para changeUIDefaults (), que será explicado a seguir.
4. Você pode adicionar qualquer componente para o JXTaskPane. Você também pode adicionar ações. Ao usar ações, apenas certifique-se de que a chave de nome tem um valor. Se você tem um valor short_description, então ele vai aparecer como uma dica. Se você tem um valor SMALL_ICON ou LARGE_ICON, então ele vai aparecer como um ícone na entrada JXTaskPane.
Se você quiser mudar o visual do recipiente JXTaskPane e JXTaskPane, então você tem que mudar alguns padrões de interface do usuário que eles usam para descobrir como eles devem tornar-se. Há um monte de opções que podem ser definidas. Aqui está a implementação de changeUIDefaults ():
private void changeUIdefaults() {
  // JXTaskPaneContainer settings (developer defaults)
  /* These are all the properties that can be set (may change with new version of SwingX)
    "TaskPaneContainer.useGradient",
    "TaskPaneContainer.background",
    "TaskPaneContainer.backgroundGradientStart",
    "TaskPaneContainer.backgroundGradientEnd",
    etc.
  */

  // setting taskpanecontainer defaults
  UIManager.put("TaskPaneContainer.useGradient", Boolean.FALSE);
  UIManager.put("TaskPaneContainer.background", Colors.LightGray.color(0.5f));

  // setting taskpane defaults
  UIManager.put("TaskPane.font", new FontUIResource(new Font("Verdana", Font.BOLD, 16)));
  UIManager.put("TaskPane.titleBackgroundGradientStart", Colors.White.color());
  UIManager.put("TaskPane.titleBackgroundGradientEnd", Colors.LightBlue.color());
}
Como você pode ver a partir deste código, você pode definir duas cores do gradiente para o JXTaskPane / JXTaskPaneContainer para pintar o fundo. Você tem que definir o valor "useGradient" para "Boolean.TRUE". e você tem que especificar o "backgroundGradientStart" e valores "backgroundGradientEnd", que são as duas cores. Como alternativa, você pode definir "useGradient" para falsa, e só usar um "fundo" de cor. O exemplo de código mostra ambas as combinações de:
  1. O JXTaskPaneContainer não usar um preenchimento de gradiente, ele usa uma única cor de fundo (LightGray 50% transparente).
  2. O JXTaskPane usa um preenchimento de gradiente (preenchimento vertical), e é a 2 paragens são: Branco para LightBlue.
Aqui está a lista completa para o TaskPanelExample1.java:
import org.jdesktop.swingx.*;
import org.jdesktop.swingx.painter.*;

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

/**
 * TaskPaneExample1
 *
 * @author Nazmul Idris
 * @version 1.0
 * @since Jan 28, 2008, 12:49:01 PM
 */
public class TaskPaneExample1 {

/** simple main driver for this class */
public static void main(String[] args) {
  SwingUtilities.invokeLater(new Runnable() {
    public void run() {
      new TaskPaneExample1();
    }
  });
}

/** creates a JFrame and calls {@link #doInit} to create a JXPanel and adds the panel to this frame. */
public TaskPaneExample1() {
  JFrame frame = new JFrame("TaskPane Example 1");

  // add the panel to this frame
  frame.add(doInit());

  // when you close the frame, the app exits
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

  // center the frame and show it
  frame.setLocationRelativeTo(null);
  frame.pack();
  frame.setVisible(true);
}

/** creates a JXLabel and attaches a painter to it. */
private Component doInit() {
  JXPanel panel = new JXPanel();
  panel.setLayout(new BorderLayout());

  // create a label
  final JXLabel label = new JXLabel();
  label.setFont(new Font("Segoe UI", Font.BOLD, 14));
  label.setText("task pane item 1 : a label");
  label.setIcon(Images.NetworkDisconnected.getIcon(32, 32));
  label.setHorizontalAlignment(JXLabel.LEFT);
  label.setBackgroundPainter(getPainter());

  // tweak with the UI defaults for the taskpane and taskpanecontainer
  changeUIdefaults();

  // create a taskpanecontainer
  JXTaskPaneContainer taskpanecontainer = new JXTaskPaneContainer();

  // create a taskpane, and set it's title and icon
  JXTaskPane taskpane = new JXTaskPane();
  taskpane.setTitle("My Tasks");
  taskpane.setIcon(Images.Quit.getIcon(24, 24));

  // add various actions and components to the taskpane
  taskpane.add(label);
  taskpane.add(new AbstractAction() {
    {
      putValue(Action.NAME, "task pane item 2 : an action");
      putValue(Action.SHORT_DESCRIPTION, "perform an action");
      putValue(Action.SMALL_ICON, Images.NetworkConnected.getIcon(32, 32));
    }
    public void actionPerformed(ActionEvent e) {
      label.setText("an action performed");
    }
  });

  // add the task pane to the taskpanecontainer
  taskpanecontainer.add(taskpane);

  // set the transparency of the JXPanel to 50% transparent
  panel.setAlpha(0.7f);

  panel.add(taskpanecontainer, BorderLayout.CENTER);
  panel.setPreferredSize(new Dimension(250, 200));

  return panel;
}
private void changeUIdefaults() {
  // JXTaskPaneContainer settings (developer defaults)
  /* These are all the properties that can be set (may change with new version of SwingX)
    "TaskPaneContainer.useGradient",
    "TaskPaneContainer.background",
    "TaskPaneContainer.backgroundGradientStart",
    "TaskPaneContainer.backgroundGradientEnd",
    etc.
  */

  // setting taskpanecontainer defaults
  UIManager.put("TaskPaneContainer.useGradient", Boolean.FALSE);
  UIManager.put("TaskPaneContainer.background", Colors.LightGray.color(0.5f));

  // setting taskpane defaults
  UIManager.put("TaskPane.font", new FontUIResource(new Font("Verdana", Font.BOLD, 16)));
  UIManager.put("TaskPane.titleBackgroundGradientStart", Colors.White.color());
  UIManager.put("TaskPane.titleBackgroundGradientEnd", Colors.LightBlue.color());
}

/** this painter draws a gradient fill */
public Painter getPainter() {
  int width = 100;
  int height = 100;
  Color color1 = Colors.White.color(0.5f);
  Color color2 = Colors.Gray.color(0.5f);

  LinearGradientPaint gradientPaint =
      new LinearGradientPaint(0.0f, 0.0f, width, height,
                              new float[]{0.0f, 1.0f},
                              new Color[]{color1, color2});
  MattePainter mattePainter = new MattePainter(gradientPaint);
  return mattePainter;
}

}//end class TaskPaneExample1
Por favor note que eu montei o JXTaskPaneContainer em um JXPanel e eu definir a sua opacidade para 70%, tornando-se 30% transparente. Este é outro recurso interessante de usar SwingX JXPanel, e é a transparência. Aprenda mais sobre ele aqui .

Baixar projeto

Para fazer o download dos projetos ideia para exemplo de código fonte deste tutorial, clique aqui .

+1

0 comentários :

Postar um comentário

Total de visualizações