Swing Synth URLImageSource

E99

Aktives Mitglied
HI!

Ich habe ein bisschen mit Java synth herumexperimentiert.

Für einen Button verwende ich ein Hintergrungbild.

das bild liegt im Ordner "Projekt"/images/, heisst button.png

Java:
package test;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Image;
import java.text.ParseException;

import javax.swing.*;
import javax.swing.plaf.synth.*;

public class LookAndFeelTest extends JFrame {

	/**
	 * @param args
	 */
	private Image img;
	public LookAndFeelTest(){
		
		super("Look And Feel Test");
		img = new ImageIcon("images/background.png").getImage();
		JPanel contentPane = new JPanel() {
			protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                if (img != null) {
                    g.drawImage(img, 0, 0, getWidth(), getHeight(), null);
                }
            }
			
		};
		JLabel text = new JLabel("TESTESTEST!!!");
		JButton b = new JButton("Ich bin ein Button");
		contentPane.add(text);
		contentPane.add(b);
		
		this.setContentPane(contentPane);
		this.setSize(400,400);
		this.setVisible(true);
	}
	public static void main(String[] args) throws UnsupportedLookAndFeelException, ParseException {
		SynthLookAndFeel synth = new SynthLookAndFeel();
		synth.load(LookAndFeelTest.class.getResourceAsStream("EMSoftLAF.xml"),LookAndFeelTest.class);
		
	    UIManager.setLookAndFeel(synth);
        LookAndFeelTest testwnd = new LookAndFeelTest();

	}

}

[XML]<synth>

<style id="basicStyle">

<font name="Comic Sans MS" size="17" style="BOLD"/>

<state>
<color value="WHITE" type="FOREGROUND"/>
</state>

</style>



<style id="buttonStyle">

<property key="Button.textShiftOffset" type="integer" value="1"/>
<insets top="5" left="5" right="5" bottom="5"/>

<state id="PRESSED">

</state>

<state id="MOUSE-OVER">

</state>

<state>
<imagePainter method="buttonBackground" path="images/button.png" sourceInsets="2 2 2 2"/>
</state>

</style>





<bind style="buttonStyle" type="region" key="button"/>
<bind style="basicStyle" type="region" key=".*"/>

</synth>
[/XML]

jetzt bekomme ich aber folgende fehlermeldung:

Java:
Uncaught error fetching image:
java.lang.NullPointerException
	at sun.awt.image.URLImageSource.getConnection(Unknown Source)
	at sun.awt.image.URLImageSource.getDecoder(Unknown Source)
	at sun.awt.image.InputStreamImageSource.doFetch(Unknown Source)
	at sun.awt.image.ImageFetcher.fetchloop(Unknown Source)
	at sun.awt.image.ImageFetcher.run(Unknown Source)

weiss jmd. Rat???
 
Zuletzt bearbeitet von einem Moderator:

E99

Aktives Mitglied
Hmm.... Jetzt muss aber in der paintComponentmethode img final sein.

Wie bekomm ich denn das hin, wenn img oben nicht final sein darf???
 

JCODA

Top Contributor
Java:
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.ParseException;

import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.plaf.synth.*;

public class LookAndFeelTest extends JFrame {

	private static final long serialVersionUID = 1L;
	private BufferedImage img;

	public LookAndFeelTest() {
		super("Look And Feel Test");
		img = LookAndFeelTest.loadImage("images/background.png");
		JPanel contentPane = new JPanel() {
			private static final long serialVersionUID = 1L;

			protected void paintComponent(Graphics g) {
				super.paintComponent(g);
				if (img != null) {
					g.drawImage(img, 0, 0, getWidth(), getHeight(), null);
				}
			}

		};
		JLabel text = new JLabel("TESTESTEST!!!");
		JButton b = new JButton("Ich bin ein Button");
		contentPane.add(text);
		contentPane.add(b);

		this.setContentPane(contentPane);
		this.setSize(400, 400);
		this.setVisible(true);
	}

	public static void main(String[] args) {		
		EventQueue.invokeLater(new Runnable() {
			@Override
			public void run() {				
				SynthLookAndFeel synth = new SynthLookAndFeel();
				try {
					synth.load(LookAndFeelTest.class.getResourceAsStream("EMSoftLAF.xml"),
							LookAndFeelTest.class);
					UIManager.setLookAndFeel(synth);	
				} catch (ParseException e) {					
					e.printStackTrace();
				} catch (UnsupportedLookAndFeelException e) {				
					e.printStackTrace();
				}				
				new LookAndFeelTest();
				
			}
		});
	}

	public static BufferedImage loadImage(String path) {
		BufferedImage img = null;
		try {
			img = ImageIO.read(new File(path));
		} catch (IOException e) {
			e.printStackTrace();
		}
		return img;
	}
}
 
Zuletzt bearbeitet:

E99

Aktives Mitglied
Danke für deine Änderungen! Allerdings funktioniert es immer noch nicht. Ich glaube auch, dass der Fehler in der xml - Datei ist. Ohne das button.png-bild läuft alles...
 

JCODA

Top Contributor
Okay, ich hab's durch ausprobieren hinbekommen:

Das Bild muss auf class-Datei Ebene liegen, also der Pfad der bei
Code:
path="...."
steht, benutzt als "Root"-Ordner den class-Datei-Ordner.


bzw. da Du das Bild auch im Programm selbst nochmal lädst, muss es ebenfalls im Projekt-Root liegen.
 
Zuletzt bearbeitet:

E99

Aktives Mitglied
cAlles klar danke schonmal für die Mühe! Kann es leider erst morgen ausprobieren....

Ich poste noch ob es funktioniert hat.
 

E99

Aktives Mitglied
So. hab es ausprobiert: Läuft! also herzlichen dank!

weisst du zufällig, wie man das bild so abändert, dass der Button im gedrückten Zustand eingedrückt aussieht?

Ich habe dazu einfach mal das Bild in der Datei um ein paar Pixel nach unten-rechts verschoben. Allerdings tut sich nichts, wenn man klickt: Die Schrift bewegt sich, der Hintergrund aber nicht.
 

Ähnliche Java Themen

Neue Themen


Oben