# Button



## Gast2 (22. Jan 2008)

Gibt es eine einfach Möglichkeit einen JButton rund zu machen????


----------



## The_S (22. Jan 2008)

selber zeichnen


----------



## Gast2 (22. Jan 2008)

was nehm ich dazu ein einfaches JComponent und überschreibe die paintMethode???


----------



## The_S (22. Jan 2008)

paintComponent überschreiben. Kannst aber auch einen JButton, ein JLabel oder sonst was nehmen.


----------



## Gast2 (22. Jan 2008)

ja aber wenn ich von eine JButton die paintMethode überschreibe hab ich doch immer noch das Standadraussehen oder????also wenn ich runde buttons möchte dann z.B. hab ich die ecken noch oder?


----------



## The_S (22. Jan 2008)

kommt immer darauf an wie du es überschreibst


----------



## Gast2 (22. Jan 2008)

```
@Override
		protected void paintComponent(Graphics g) {	
			super.paintComponent(g);
		}
```

www.java-forum.org/de/viewtopic.php?p=278628
hab grad dass hier gefunden un les des mir mal durch vielleicht gibt es ja schon eine Shape oder sowas dafür...Der anfang war auf jeden fall mal interessant 

EDIT: kennst du ein tutorial, in dem einen gezeigt wird wie man z.B farbverläufe hinbekommt oder wie in den Standardbuttons so einen leichten weißen schein dass, bischen 3D mäßig aussieht oder wenn der button gedrückt wird ...also solche effekte....


----------



## Ariol (22. Jan 2008)

@SirWayne: Ich mach grad sowas in der Art - habs mit gif und png-Dateien gelöst:


```
package gui.elements.draft;

import global.Skin;
import gui.ActionInterface;

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseWheelEvent;

import javax.swing.JButton;

public abstract class PPButton extends JButton implements ActionInterface, FocusListener
{
	private String			text								= "";

	private boolean			mouseover							= false;

	private boolean			focused								= false;

	private Image	buttonFocusedImage					= Skin.getButtonFocusedImage();

	private Image	buttonFocusedMouseoverImage			= Skin.getButtonFocusedMouseoverImage();

	private Image	buttonUnfocusedImage				= Skin.getButtonUnfocusedImage();

	private Image	buttonUnfocusedMouseoverImage		= Skin.getButtonUnfocusedMouseoverImage();

	private Image	buttonDisabledImage					= Skin.getButtonDisabledImage();

	private Font		buttonFocusedFont					= Skin.getButtonFocusedFont();

	private Font		buttonFocusedMouseoverFont			= Skin.getButtonFocusedMouseoverFont();

	private Font		buttonUnfocusedFont					= Skin.getButtonUnfocusedFont();

	private Font		buttonUnfocusedMouseoverFont		= Skin.getButtonUnfocusedMouseoverFont();

	private Font		buttonDisabledFont					= Skin.getButtonDisabledFont();

	private Color	buttonFocusedFontColor				= Skin.getButtonFocusedFontColor();

	private Color	buttonFocusedMouseoverFontColor		= Skin.getButtonFocusedMouseoverFontColor();

	private Color	buttonUnfocusedFontColor			= Skin.getButtonUnfocusedFontColor();

	private Color	buttonUnfocusedMouseoverFontColor	= Skin.getButtonFocusedMouseoverFontColor();

	private Color	buttonDisabledFontColor				= Skin.getButtonDisabledFontColor();

	public PPButton(String text)
	{
		this.text = text;

		addFocusListener(this);
		setOpaque(false);
		setFocusPainted(false);
		setBorderPainted(false);
	}

	public void setFocused(boolean focused)
	{
		this.focused = focused;
		repaint();
	}

	public void setMouseover(boolean mouseover)
	{
		this.mouseover = mouseover;
		repaint();
	}

	public void focusGained(FocusEvent e)
	{
		setFocused(true);
	}

	public void focusLost(FocusEvent e)
	{
		setFocused(false);
	}
	
	@Override
	public void setEnabled(boolean b)
	{
		setFocusable(b);
		super.setEnabled(b);
	}
	
	protected void paintComponent(Graphics g)
	{
		if (isEnabled())
		{
			if (focused)
			{
				if (mouseover)
				{
					g.drawImage(buttonFocusedMouseoverImage, 0, 0, getWidth(), getHeight(), this);
					g.setColor(buttonFocusedMouseoverFontColor);
					g.setFont(buttonFocusedMouseoverFont);
				}
				else
				{
					g.drawImage(buttonFocusedImage, 0, 0, getWidth(), getHeight(), this);
					g.setColor(buttonFocusedFontColor);
					g.setFont(buttonFocusedFont);
				}
			}
			else
			{
				if (mouseover)
				{
					g.drawImage(buttonUnfocusedMouseoverImage, 0, 0, getWidth(), getHeight(), this);
					g.setColor(buttonUnfocusedMouseoverFontColor);
					g.setFont(buttonUnfocusedMouseoverFont);
				}
				else
				{
					g.drawImage(buttonUnfocusedImage, 0, 0, getWidth(), getHeight(), this);
					g.setColor(buttonUnfocusedFontColor);
					g.setFont(buttonUnfocusedFont);
				}
			}
		}
		else
		{
			g.drawImage(buttonDisabledImage, 0, 0, getWidth(), getHeight(), this);
			g.setColor(buttonDisabledFontColor);
			g.setFont(buttonDisabledFont);
		}

		FontMetrics metrics = g.getFontMetrics();
		Dimension d = getSize();
		int x = (d.width - metrics.stringWidth(text)) / 2;
		int y = (d.height - metrics.getHeight()) / 2 + metrics.getAscent();
		g.drawString(text, x, y);
	}

	public PPFrame getPPFrame()
	{
		ActionInterface actionInterface = getActionInterfaceParent();

		while (true)
		{
			if (actionInterface == null)
			{
				return null;
			}
			else if (actionInterface instanceof PPFrame)
			{
				return (PPFrame) actionInterface;
			}
			else
			{
				actionInterface = getActionInterfaceParent((Container) actionInterface);
			}
		}
	}

	public ActionInterface getActionInterfaceParent()
	{
		return getActionInterfaceParent(this);
	}

	public ActionInterface getActionInterfaceParent(Container container)
	{
		Container parent = container.getParent();

		while (true)
		{
			if (parent == null)
			{
				return null;
			}
			else if (parent instanceof ActionInterface)
			{
				return (ActionInterface) parent;
			}
			else
			{
				parent = parent.getParent();
			}
		}
	}

	public void keyPressedAction(KeyEvent keyEvent)
	{
		ActionInterface actionInterface = getActionInterfaceParent();
		if (actionInterface != null)
		{
			actionInterface.keyPressedAction(keyEvent);
		}
	}

	public void keyReleasedAction(KeyEvent keyEvent)
	{
		ActionInterface actionInterface = getActionInterfaceParent();
		if (actionInterface != null)
		{
			actionInterface.keyReleasedAction(keyEvent);
		}
	}

	public void keyTypedAction(KeyEvent keyEvent)
	{
		ActionInterface actionInterface = getActionInterfaceParent();
		if (actionInterface != null)
		{
			actionInterface.keyTypedAction(keyEvent);
		}
	}

	public void mouseClickedAction(MouseEvent mouseEvent)
	{
		ActionInterface actionInterface = getActionInterfaceParent();
		if (actionInterface != null)
		{
			actionInterface.mouseClickedAction(mouseEvent);
		}
	}

	public void mouseDraggedAction(MouseEvent mouseEvent)
	{
		ActionInterface actionInterface = getActionInterfaceParent();
		if (actionInterface != null)
		{
			actionInterface.mouseClickedAction(mouseEvent);
		}
	}

	public void mouseEnteredAction(MouseEvent mouseEvent)
	{
		ActionInterface actionInterface = getActionInterfaceParent();
		if (actionInterface != null)
		{
			actionInterface.mouseEnteredAction(mouseEvent);
		}
	}

	public void mouseExitedAction(MouseEvent mouseEvent)
	{
		ActionInterface actionInterface = getActionInterfaceParent();
		if (actionInterface != null)
		{
			actionInterface.mouseExitedAction(mouseEvent);
		}
	}

	public void mousePressedAction(MouseEvent mouseEvent)
	{
		ActionInterface actionInterface = getActionInterfaceParent();
		if (actionInterface != null)
		{
			actionInterface.mousePressedAction(mouseEvent);
		}
	}

	public void mouseReleasedAction(MouseEvent mouseEvent)
	{
		ActionInterface actionInterface = getActionInterfaceParent();
		if (actionInterface != null)
		{
			actionInterface.mouseReleasedAction(mouseEvent);
		}
	}

	public void mouseWheelAction(MouseWheelEvent mouseWheelEvent)
	{
		ActionInterface actionInterface = getActionInterfaceParent();
		if (actionInterface != null)
		{
			actionInterface.mouseWheelAction(mouseWheelEvent);
		}
	}
}
```


----------



## Gast2 (22. Jan 2008)

ja okay du setzt Bilder als Hintergründe =)...Aber es gibt ja auch Formeln für Farbverläufe oder andere Effekte des wäre ineressant...
Eine frage hätte ich dazu wenn du jetzt ein Bild setzt der den Button runde darstellen soll und du ihn anklickst oder er den Focus hat... Wie makiert er ihn dir???Reckteckig oder richtig der form entlang???


----------



## *Hendrik (23. Jan 2008)

java.sun.com/developer/TechTips/1999/tt0826.html


----------



## Ariol (23. Jan 2008)

Durch

```
setFocusPainted(false);
      setBorderPainted(false);
```
wird kein Focus mehr gezeichnet. Ich hab dafür eigene Bilder:


```
protected void paintComponent(Graphics g)
   {
      if (isEnabled())
      {
         if (focused)
         { 
            ....
```

EDIT:
Das Ganze ist noch nicht perfekt, sondern im Aufbau..., aber funzt schon ganz gut^^


----------



## Gast2 (23. Jan 2008)

@ Hendrik danke hab ich schon selber hinbekommen in verschiedenen Formen... wie gesagt mir fehlen nur die effekte sonst sieht das ganze so langweilig aus....

@Ariol woher hast du die Bilder deiner Buttons-->selber gemacht???


----------



## Gast2 (23. Jan 2008)

ach ja noch was nur so als tipp wenn du eh von JButton erbst dann benutz doch das model dann hast du die ganzen Zustände des Buttons

Hier mein Button

```
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.geom.Rectangle2D;
import java.awt.geom.RoundRectangle2D;

import javax.swing.JButton;
import javax.swing.JFrame;

public class RoundButton extends JButton  {

	private Shape shape;
	private boolean rollover;

	public RoundButton(String label) {
		super(label);
		setContentAreaFilled(false);
		
	}

	protected void paintComponent(Graphics g) {

		if (shape instanceof RoundRectangle2D) {
			shape = new RoundRectangle2D.Double(0, 0, getSize().width - 1,
					getSize().height - 1, 50, 50);
		}

		if (shape instanceof Rectangle2D) {
			shape = new Rectangle2D.Double(0, 0, getSize().width,
					getSize().height);
		}

		Graphics2D g2 = (Graphics2D) g;

		if (getModel().isArmed()) {
			g2.setColor(Color.lightGray);
		} else {
			g.setColor(getBackground());
		}
		g2.setPaint(new GradientPaint(0.0F, 0.0F, Color.white, getSize().width,
				getSize().height, g2.getColor(), false)); //hier wird des Farbverlauf gezeichnet

		g2.fill(shape);

		super.paintComponent(g);
	}

	protected void paintBorder(Graphics g) {
		Graphics2D g2 = (Graphics2D) g;
		
		
		shape.getBounds().width = getBounds().width + 1;
		shape.getBounds().height = getBounds().height + 1;
		
		if(model.isRollover())
		{
			g2.setColor(Color.CYAN);
		}
		else
		{
			g2.setColor(getForeground());	
		}
		
		
		g2.draw(shape);
	}

	public static void main(String[] args) {

		JButton button = new RoundButton("Jackpot");
		button.setBackground(Color.MAGENTA);
		JFrame frame = new JFrame();
		frame.getContentPane().setBackground(Color.yellow);
		frame.getContentPane().add(button);
		frame.getContentPane().add(new JButton("jackpot"));
		frame.getContentPane().setLayout(new FlowLayout());
		frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		frame.setSize(150, 70);
		frame.setVisible(true);
	}

	public Shape getShape() {
		return shape;
	}

	public void setShape(Shape shape) {
		this.shape = shape;
	}


}
```

hab zum vergleich ein normalen Button auch drin... also meiner sieht richtig sch... aus!!!!!
Der normale Button sieht leicht 3-D mäßig aus und sowas möchte ich gern auch hinbekommen


----------



## MiDniGG (23. Jan 2008)

Schau doch ma nach der lib substances sehr schönes Design und nette Effekte. Außer natürlich du willst das alles unbedingt selbst schreiben...
Auch nett is die lib von JGoodies "looks"

cya


----------



## Gast2 (23. Jan 2008)

ja des weiß ich =)... aber schön mal selber zu versuchen sowas zu machen...Soll ja nur ein versuch sein


----------



## PELLE (23. Jan 2008)

@SirWayne: dein code gibt mir das:


```
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at sun.java2d.pipe.SpanShapeRenderer.renderPath(Unknown Source)
	at sun.java2d.pipe.SpanShapeRenderer.fill(Unknown Source)
	at sun.java2d.pipe.ValidatePipe.fill(Unknown Source)
	at sun.java2d.SunGraphics2D.fill(Unknown Source)
	at RoundButton.paintComponent(RoundButton.java:46)
	at javax.swing.JComponent.paint(Unknown Source)
	at javax.swing.JComponent.paintChildren(Unknown Source)
	at javax.swing.JComponent.paint(Unknown Source)
	at javax.swing.JComponent.paintChildren(Unknown Source)
	at javax.swing.JComponent.paint(Unknown Source)
	at javax.swing.JLayeredPane.paint(Unknown Source)
	at javax.swing.JComponent.paintChildren(Unknown Source)
	at javax.swing.JComponent.paintToOffscreen(Unknown Source)
	at javax.swing.BufferStrategyPaintManager.paint(Unknown Source)
	at javax.swing.RepaintManager.paint(Unknown Source)
	at javax.swing.JComponent.paint(Unknown Source)
	at java.awt.GraphicsCallback$PaintCallback.run(Unknown Source)
	at sun.awt.SunGraphicsCallback.runOneComponent(Unknown Source)
	at sun.awt.SunGraphicsCallback.runComponents(Unknown Source)
	at java.awt.Container.paint(Unknown Source)
	at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
	at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
	at javax.swing.RepaintManager.seqPaintDirtyRegions(Unknown Source)
	at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
```


----------



## Ariol (23. Jan 2008)

Zum Testen hab ich momentan einen Button aus dem Internet und mir dann die daraus abgeleiteten selbstgemacht.

Farbe geändert, Rahmen drumrum...

Hier mal ein Screenshot:

http://picasaweb.google.de/SiKraemer/Open/photo#5158392045889004482


Aus Performancegründen werden die Bilder als Instanzen geladen. Den Pfad bekommt das Programm über eine XML-Properties Datei - Damit sind dann auch verschiedene Skins möglich^^


----------



## Gast2 (23. Jan 2008)

@pelle bei mir gehts ohne probleme www.java-forum.org/de/userfiles/user10343/button.jar musst das fenster noch ein bischen größer ziehen 

@ariol schaus mir morgen mal an aber wie gesagt schau dir das Buttonmodel mal an damit ersparst du dir viel stress

z.B. model.isRollover() usw....


----------



## PELLE (23. Jan 2008)

> @pelle bei mir gehts ohne probleme www.java-forum.org/de/userfiles/user10343/button.jar musst das fenster noch ein bischen größer ziehen


 yo hab die .jar bei freundin auf pc geguckt, dein button sieht sch...recklich aus  :wink: ich denke mal solche Buttons sollte man eher in einem guten Grafikprogramm erstellen als .png sieht besser aus als selberzeichnen mit der 2DGraphics Klasse, denke zumindest ich...


----------



## Gast2 (23. Jan 2008)

das er schrecklich aussieht weiß ich selber lol!!!! wie macht es denn das substance... das ist auch kein bild das wird bestimmt gemalt....


----------



## Ariol (23. Jan 2008)

Das hier klingt auch interessant:

http://javadesktop.org/articles/synth/


----------



## Gast2 (24. Jan 2008)

ja des schau ich mir übers we mal genauer an =)


----------



## *Hendrik (25. Jan 2008)

Ist zwar kein runder Button, aber vielleicht auch interessant:

Die Kapitel

Chapter 8: Build a Colorful Vector-Based Button
Chapter 1: Create Image-Themed Components

aus www.oreilly.com/catalog/swinghks/toc.html.

Gibt zwar nicht viel Text, aber man kann sich zumindest den Quellcode dazu runterladen.


----------

