ich benutze Jtree
Um verschiedene Bilder eines Verzeichnisses aufzulisten, möchte ich ein Bild anzeigen applet
Wenn der Benutzer auf den im Baum angezeigten Bildnamen klickt, lautet der verwendete Code wie folgt: ta
ist ein Objekt des Applets, weil ich es in einer anderen Klasse verwende.
private void displayImage(URL furl, String fname) {
ta.Picture = ta.getImage(furl, fname);
prepareImage(ta.Picture, this);
Graphics g = ta.imageCanvas.getGraphics();
g.clearRect(10, 10, 800, 800);
g.drawImage(ta.Picture, 10, 10, this);
} // displayImage
public void valueChanged(TreeSelectionEvent e)
{
// TODO Auto-generated method stub
FileTreeNode node = (FileTreeNode) tree.getLastSelectedPathComponent();
System.out.println("slecte asldf " + node.isLeaf());
if (node.isLeaf())
{
currentFile = node.file;
System.out.println("File name " + currentFile.getName());
try
{
URL furl = new URL("file:/F:/photos");
displayImage(furl, currentFile.getName());
}
catch (MalformedURLException mle)
{
System.out.println("Exception::::::" + mle);
}
}
else
currentFile = null;
}
Aber es funktioniert nicht.
Antworten:
2 für die Antwort № 1Da Sie Dateien aus dem lokalen Dateisystem anzeigen, ist das Arbeiten mit URLs nicht erforderlich. Verwenden
displayImage(currentFile);
und schreiben Sie diese Methode wie folgt um:
private void displayImage(File file) {
BufferedImage image = ImageIO.read(file);
ta.image = image;
ta.repaint();
}
Wobei die Lackiermethode der (ich an nehmenden) Komponente ta gleich sein muss
BufferedImage image;
public void paint(Graphics g) {
g.clearRect(10, 10, 800, 800);
g.drawImage(ta.Picture, 10, 10, this);
}
Aus Sicherheitsgründen kann das Applet nur dann auf das Dateisystem zugreifen, wenn es signiert ist oder ohne Sicherheitsmanager ausgeführt wird (meistens auf demselben Computer).
2 für die Antwort № 2
Aber es funktioniert nicht.
Dies ist in keiner Weise hilfreich, haben Sie Ausnahmen? Was geschieht? Bitte posten Sie eine SSCCE für eine bessere Hilfe früher
Ich möchte ein Bild im Applet anzeigen, wenn der Benutzer auf das Bild klickt Der in der Baumstruktur angezeigte Name lautet wie folgt: ta ist ein Objekt des Applets, weil ich es in einer anderen Klasse verwende.
IMO du machst es falsch mit dem JPanel
Objekt und Component#getGraphics
.
Nicht verwenden
Component#getGraphics()
da es keine gute übung ist und somit beim nächsten aufruf nicht ausharrtrepaint()
Der Bildschirm wird gelöscht.Verwenden Sie Applet nicht mit Swing-Komponenten, sondern verwenden Sie
JApplet
.
Fügen Sie eine benutzerdefinierte hinzu JPanel
mit Getter und Setter zum BufferedImage
variabel auf den Container und als überschreiben paintComponnet
und zeichne die BufferedImage
Dort.
Nun soll sich das ändern BufferedImage
einfach die anrufen Setter d setBackgroundImage(BufferedImage img)
und dann anrufen repaint()
auf JPanel
um die Änderungen anzuzeigen. Wie so:
public class MyPanel extends JPanel {
private BufferedImage bg;
public MyPanel(BufferedImage bi) {
bg=bi;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d=(Graphics2D)g;
g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY));
g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON));
g2d.drawImage(bg,0,0,this);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(bg.getWidth(),bg.getHeight());
}
public BufferedImage setBackgroundImage(BufferedImage bi) {
bg=bi;
}
}
Jetzt benutzen wir es so:
MyPanel mp=new MyPanel(...);//create the panel with an image
...
add(mp);//add to container
...
mp.setBackgroundImage(..);//change the image being displayed
mp.repaint();//so the new image may be painted