Criação de aplicações desktop

12 respostas
D

Olá pessoal, gosto muito de desenvolver aplicações swing, mas agora estou querendo desenvolver algo com uma aparência
mais arrojada. Queria saber como se controi um frame sem a barra de título padrão do sistema operacional, não tenho ideia de
como funciona isto, mas não é com Look and Feel. Alguém poderia me dar uma dica?

12 Respostas

fabim

Customize componentes swing para agilizar o trabalho, nao customize layout.
Quer layout bonito? use um pronto.

Esse aqui é fantástico:

http://www.randelshofer.ch/quaqua/download.html

D

Valeu, vou dar uma olhada.

Muito obrigado!!!

D

Ok, este Look&Feel eu ja tinha usado, muito massa mesmo…

mas como vc disse, como eu customizo os componentes?

peerless

Apostaria no substance

fabim

danyelsanches:
Ok, este Look&Feel eu ja tinha usado, muito massa mesmo…

mas como vc disse, como eu customizo os componentes?

Com o básico de herança ja ajuda bastante.

Não é melhor em vez de ficar setando todos as propriedades dos JTextFields 1 a 1 :roll:, criar um SuaEmpresaTextField, que herda de JTextField, e adiciona essas características?

Entao nos seus JPanels e JInternalFrames vc usa SuaEmpresaTextField, e não JTextField.
E nao mexe em mais nada.

O mesmo vale para tabelas, painéis, dialogs, botoes, inputVerifiers e bláblabla.

G

Necessariamento vc nao precisa criar novos componentes para fazer uma personalização de seu sistema.
Vc pode trabalhar do mesmo modo que os Look & Feels fazem.
Por exemplo, vc pode criar um L&F para os JButton e deixar padrão para todo o sistema, extendendo uma classe de BasicButtonUI e fazendo as personalizações necessarias, e dai relacionar o UIManager que esta classe sera a padrão para JButton assim:

UIManager.put("ButtonUI","caminho.da.classe.ClasseUI")

A maioria dos L&F sao open-source, entao vc pode baixar um exemplo e ver como que eles personalizam cada componente.
Qualquer coisa estou as ordem

flw

D

valeu dimais… vou dar uma estudada nisso!!! Obrigado

D

So mais uma coisa, usar canvas é uma boa pra fazer esse tipo de personalização?

G

Necessariamente se vc quizer personalizar o componente, vc vai ter que “desenhar” td o q vc quizer fazer.

Abaixo vai um codigo de personalizacao de L&F do JButton em um estilo “parecido” com os botões do Office 2007

import java.awt.Color;
import java.awt.Cursor;
import java.awt.FontMetrics;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.AbstractButton;
import javax.swing.ButtonModel;
import javax.swing.JComponent;
import javax.swing.SwingUtilities;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.basic.BasicButtonUI;
import javax.swing.plaf.basic.BasicHTML;
import javax.swing.text.View;

import sun.swing.SwingUtilities2;

public class BotaoUI extends BasicButtonUI
{
	private static BotaoUI buttonUI = new BotaoUI();
	private MouseAdapter mouseadapter;

    private static Rectangle viewRect = new Rectangle();
    private static Rectangle textRect = new Rectangle();
    private static Rectangle iconRect = new Rectangle();
	
    public static ComponentUI createUI(JComponent c)
    {
    	return buttonUI;
    }

	@Override
	protected void installDefaults(AbstractButton b)
	{
		super.installDefaults(b);
		
		b.setBorderPainted(false);
		b.setOpaque(false);
		b.setCursor(new Cursor(Cursor.HAND_CURSOR));
	}
	
	@Override
    protected void installListeners(AbstractButton b)
	{
		super.installListeners(b);

		mouseadapter = new MouseAdapter()
		{
			public void mouseEntered(MouseEvent e)
			{
				AbstractButton b = (AbstractButton) e.getSource();
		        b.getModel().setArmed(true);
			}

			public void mouseExited(MouseEvent e)
			{
				AbstractButton b = (AbstractButton) e.getSource();
		        b.getModel().setArmed(false);
			}
		};

		b.addMouseListener(mouseadapter);
    }
	
	@Override
	protected void uninstallListeners(AbstractButton b)
	{
		super.uninstallListeners(b);

		b.removeMouseListener(mouseadapter);
		mouseadapter = null;
	}

	@Override
	public void paint(Graphics g, JComponent c)
	{
		int curva = 8;

        AbstractButton b = (AbstractButton) c;
        ButtonModel model = b.getModel();

		Graphics2D graph = (Graphics2D)g;
    	graph.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
    	        RenderingHints.VALUE_ANTIALIAS_ON);

    	Color corfundo;
    	Color corcontorno;
    	
        if (model.isArmed() && model.isPressed() || b.isSelected())
        	corfundo = new Color(243,139,42);
        else if (b.isFocusPainted() && b.isEnabled() && (model.isArmed() || b.isFocusOwner()))
        	corfundo = new Color(255,213,69);
        else
        	corfundo = b.getBackground();
        
        corcontorno = corfundo.darker();
        
		int height = (int)(b.getHeight()*0.48);

    	graph.setColor(corfundo);
		graph.fillRoundRect(0,0,b.getWidth()-1,b.getHeight()-1,curva,curva);

		graph.setPaint(new GradientPaint(50,0,new Color(255,255,255,(model.isPressed() || b.isSelected() ? 150 : 255)),
    			50,height,new Color(255,255,255,(model.isPressed() || b.isSelected() ? 50 : 100)),true));
		graph.fillRoundRect(0,0,b.getWidth(),height,curva,curva);

		height = b.getHeight() - (int)(b.getHeight()*0.4);
    	graph.setPaint(new GradientPaint(50,height,new Color(255,255,255,0),
    			50,b.getHeight()-height,new Color(255,255,255,100),true));
		graph.fillRoundRect(0,height,b.getWidth(),b.getHeight()-height,curva,curva);

		if (model.isArmed() && model.isPressed() || b.isSelected())
		{
        	graph.setPaint(new GradientPaint(50,0,new Color(120,120,100,255),
        			                         50,(int)(b.getHeight() * 0.05),new Color(120,120,120,0),true));
    		graph.fillRoundRect(0,0,b.getWidth()-1,(int)(b.getHeight() * 0.05),curva,curva);

    		graph.setPaint(new GradientPaint(50,0,new Color(50,50,50,255),
        			50,b.getHeight()-1,new Color(50,50,50,0),true));
			graph.drawRoundRect(0,0,b.getWidth()-1, b.getHeight()-1,curva,curva);
		}
		else
		{
			graph.setColor(corcontorno);
			graph.drawRoundRect(0,0,b.getWidth()-1, b.getHeight()-1,curva,curva);
		}

        String text = layout(b, SwingUtilities2.getFontMetrics(b, g),
                b.getWidth(), b.getHeight());

        clearTextShiftOffset();

        if(b.getIcon() != null) 
            paintIcon(g,c,iconRect);

        if (text != null && ! text.equals(""))
        {
        	View v = (View) c.getClientProperty(BasicHTML.propertyKey);

        	if (v != null)
        		v.paint(g, textRect);
    	    else
    	    	paintText(g, b, textRect, text);
        }

		graph = null;
	}
	
    private String layout(AbstractButton b, FontMetrics fm, int width, int height)
    {
    	Insets i = b.getInsets();
    	viewRect.x = i.left;
    	viewRect.y = i.top;
    	viewRect.width = width - (i.right + viewRect.x);
    	viewRect.height = height - (i.bottom + viewRect.y);

    	textRect.x = textRect.y = textRect.width = textRect.height = 0;
    	iconRect.x = iconRect.y = iconRect.width = iconRect.height = 0;

    	// layout the text and icon
    	return SwingUtilities.layoutCompoundLabel(
    				b, fm, b.getText(), b.getIcon(), 
    				b.getVerticalAlignment(), b.getHorizontalAlignment(),
    				b.getVerticalTextPosition(), b.getHorizontalTextPosition(),
    				viewRect, iconRect, textRect, 
    				b.getText() == null ? 0 : b.getIconTextGap());
    }
}

Dê uma analisada neste código que vc vai entender como que funciona o resto

flw

D

Obrigado, vai ajudar muito mesmo. vou analizar mesmo.

Valew

D

Fiz um teste aqui Gerson, funcionou beleza, era isso que eu queria… obrigado a todos!!!

:wink:

D

Gerson, mas uma dúvida… Sobre os componentes entendi blz, agora a questão é com o Frame principal, como faz pra customizar ele?

Criado 1 de fevereiro de 2008
Ultima resposta 1 de fev. de 2008
Respostas 12
Participantes 4