Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hall ilebe Community heute Bastel ich in Netbeans an einem Swing Bildbetracher. Beim KLicken auf ein bestimmtes MenuItem soll ein Bild aus einem FileChooser in mein jPanel1.gezeichnet werden. Ich komme beim zeichnen irgendwie net so richtig anbei mal mein Code:
//Hier wird ein FileChooser erstellt und aufgerufen in der eine BIlddate
//ausgewählt werden soll
JFileChooser fileChooser = new JFileChooser(".");
fileChooser.setDialogTitle("Bild öffnen");
fileChooser.showOpenDialog(this);
String BildAdresse = fileChooser.getSelectedFile().getPath();
Toolkit Werkzeug = java.awt.Toolkit.getDefaultToolkit();
MediaTracker tracker;
tracker = new MediaTracker(this);
sollte man ohnehin nicht arbeiten. Du könntest dein eigenes Panel implementieren und die
Code:
paintComponent()
Methode überschreiben, etwa so:
Java:
public class ImagePanel extends JPanel
{
protected Image myImage;
//Konstruktor usw
public void setImage(Image img)
{
myImage = img;
this.repaint();
}
protected void paintComponent(Graphics g)
{
if (myImage == null)
super.paintComponent(g);
else
g.drawImage(myImage, 0, 0, null);
//oder wie auch immer du das Bild anordnen willst
}
}
Damit kannst du deinem Panel ein Bild zuweisen und es zeichnet es von sich aus. In deiner Listenermethode müsstest du dann dem ImagePanel jeweils das aktuelle Bild via Setter zuweisen.
Wobei die JLabel-Methodik meiner Ansicht nach auch einfacher wäre
möchtest du ja erreichen, dass jPanel1 das gegebene Bild darstellt. Ich weiß nicht genau, ob dieser Code das überhaupt tut, sprich ob er das Bild zeichnet, oder ob einfach gar nichts passiert.
Was aber passieren soll ist, dass ein Bild gezeichnet wird. Grundsätzlich wird in der
Code:
paintComponent()
-Methode gezeichnet und die wird selbstständig aufgerufen, wenn die betroffene Komponente neu gezeichnet werden soll. D.h. so bekommst du erst einmal eine saubere Einordnung in die Ereignisbehandlung.
Meine angebotene Klasse ersetzt dein jPanel1 und ist selbst für die Darstellung des Bildes verantwortlich. Du musst dann nur
Code:
setImage()
aufrufen, wenn ein (neues) Bild angezeigt werden soll.
Den o.g. Block kannst du dann durch
ok also ich habe jetzt zwar den Sinn deiner Klasse einigermasen verstanden aber wie ich sie einbinde ist mir ein rätsel
Java:
currentPost.edit();
private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {
//Hier wird eine FileChooser erstellt und aufgerufen in der eine BIlddate
//ausgewählt werden soll
JFileChooser fileChooser = new JFileChooser(".");
fileChooser.setDialogTitle("Bild öffnen");
fileChooser.showOpenDialog(this);
String BildAdresse = fileChooser.getSelectedFile().getPath();
System.out.println(BildAdresse);
Toolkit Werkzeug = java.awt.Toolkit.getDefaultToolkit();
MediaTracker tracker;
tracker = new MediaTracker(this);
Ich kann an dieser Stelle erstmal nur raten wie deine GUI aussieht, daher gehe ich mal vom einfachen Fall aus, dass du einen JFrame hast auf dem irgendwo ein Panel gesetzt wird, dass das Bild darstellen soll:
Java:
public class Bildbetrachter extends JFrame
{
protected ImagePanel jImagePanel;
public Bildbetrachter( ... )
{
// hier könnte gelayoutet werden, u.a. muss jImagePanel
// initialisiert & gelayoutet werden:
jImagePanel = new ImagePanel();
this.add(jImagePanel, BorderLayout.CENTER);
// ...oder welches Layout du auch immer hast
}
private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt)
{
//Hier wird eine FileChooser erstellt und aufgerufen in der eine BIlddate
//ausgewählt werden soll
JFileChooser fileChooser = new JFileChooser(".");
fileChooser.setDialogTitle("Bild öffnen");
fileChooser.showOpenDialog(this);
String BildAdresse = fileChooser.getSelectedFile().getPath();
System.out.println(BildAdresse);
Toolkit Werkzeug = java.awt.Toolkit.getDefaultToolkit();
MediaTracker tracker;
tracker = new MediaTracker(this);
Image Bild = Werkzeug.getImage(BildAdresse);
tracker.addImage(Bild, 0);
//tracker.wait();
if(tracker.checkAll() && !tracker.isErrorAny())
{
jImagePanel.setImage(Bild);
}//end if
}
}
Also das ImagePanel ist eine (fast) ganz normale GUI-Komponente die man irgendwie layouten muss, damit sie angezeigt wird (wie Labels).
ich check garnix mehr ich habe jetzt die beiden klassen Bildbetrchater u. Image Panel in meinem Projekt aber ic krieg nix zu mlaufen ich habe noch ne drittee Klasse newJFrame in dem ich das Fenster habe:
Java:
import java.awt.BorderLayout;
import javax.swing.*;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;
public class Bildbetrachter extends JFrame
{
protected ImagePanel jImagePanel;
public Bildbetrachter()
{
// hier könnte gelayoutet werden, u.a. muss jImagePanel
// initialisiert & gelayoutet werden:
jImagePanel = new ImagePanel();
this.add(jImagePanel, BorderLayout.CENTER);
// ...oder welches Layout du auch immer hast
}
private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt)
{
//Hier wird eine FileChooser erstellt und aufgerufen in der eine BIlddate
//ausgewählt werden soll
JFileChooser fileChooser = new JFileChooser(".");
fileChooser.setDialogTitle("Bild öffnen");
fileChooser.showOpenDialog(this);
String BildAdresse = fileChooser.getSelectedFile().getPath();
System.out.println(BildAdresse);
Toolkit Werkzeug = java.awt.Toolkit.getDefaultToolkit();
MediaTracker tracker;
tracker = new MediaTracker(this);
Image Bild = Werkzeug.getImage(BildAdresse);
tracker.addImage(Bild, 0);
//tracker.wait();
if(tracker.checkAll() && !tracker.isErrorAny())
{
jImagePanel.setImage(Bild);
}//end if
}
public static void main(){
Bildbetrachter b1 = new Bildbetrachter();
}
}
Java:
import java.awt.Graphics;
import java.awt.Image;
public class ImagePanel extends javax.swing.JPanel
{
protected Image myImage;
//Konstruktor usw
public void setImage(Image img)
{
myImage = img;
this.repaint();
}
protected void paintComponent(Graphics g)
{
if (myImage == null)
super.paintComponent(g);
else
g.drawImage(myImage, 0, 0, null);
//oder wie auch immer du das Bild anordnen willst
}
}
Ok du benutzt einen GUI-Designer. Das macht es natürlich nicht unbedingt einfacher, wenn man Neuling in Swing ist. Das ist zumindest meine Meinung, aber dazu gleich mehr.
Ich habe deinen Code entsprechend erweitert, sodass er zumindest grob das tut, was du erwartest und bin dabei auf den Tipp von eRaaaa mit dem JLabel zurückgekommen. Für das einfache Darstellen von Bildern in einer GUI genügt das vollkommen. D.h. meinen Vorschlag mit dem ImagePanel kannst du erst einmal ignorieren bis etwas mehr Grundverständnis da ist.
Im Code habe ich die geänderten Teile mit
Code:
// NEU ---
markiert.
Warum ging es bei dir nicht?
Hauptsächlich weil das ImagePanel nirgends initialisiert und gelayoutet wurde. Das ist hier wohl auf den GUI-Designer zurückzuführen, weil der normalerweise alles macht, aber eben keine eigenen Klasse hinzunimmt und sein Komponenten- und Layout-Management etwas "verbirgt".
Ich habe das JPanel jPanel1 durch jLabel1 ersetzt (Deklaration ganz unten) und das Objekt in
Code:
initComponents()
erstellt. Da wo im Layouting das jPanel1 hinzugefügt wurde (Z. 103 und 111 im geposteten Code) steht nun jLabel1.
In der Ereignismethode genügt dann der Aufruf
Code:
jLabel1.setIcon(Bild);
damit das Bild angezeigt wird.
Also mein Tipp ist, dass du erstmal an einfache, selbstgeschriebene Swing-GUIs rangehst und dich u.a. mit den LayoutManagern beschäftigts, einfach um mal zu verstehen, was Container, was Components, Layouts und Listener sind und wie man damit arbeitet. Erst dann kann man (meiner Meinung nach), GUI-Desginer auch so benutzen, dass man sie customisieren (gibts dafür ein deutsches Wort? ) kann und versteht, was dort so geschieht.
In den Java Tutorials gibts eigentlich alles, was das Herz begehrt.
Java:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/*
* NewJFrame.java
*
* Created on 14.10.2009, 11:57:25
*/
/**
*
* @author Sven
*/
//import javax.swing.JFileChooser;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class NewJFrame extends javax.swing.JFrame{
/** Creates new form NewJFrame */
public NewJFrame() {
initComponents();
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
// NEU ---
jLabel1 = new JLabel();
// -------
jMenuBar1 = new javax.swing.JMenuBar();
jMenu1 = new javax.swing.JMenu();
jMenuItem1 = new javax.swing.JMenuItem();
jMenuItem2 = new javax.swing.JMenuItem();
jMenu2 = new javax.swing.JMenu();
jMenuItem3 = new javax.swing.JMenuItem();
jMenuItem4 = new javax.swing.JMenuItem();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("Bildbetrachter 1.0 by Sven Amend");
setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jLabel1);
jLabel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 481, Short.MAX_VALUE)
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 328, Short.MAX_VALUE)
);
jMenu1.setText("File");
jMenuItem1.setLabel("Öffnen");
jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItem1ActionPerformed(evt);
}
});
jMenu1.add(jMenuItem1);
jMenuItem2.setLabel("Schliessen");
jMenu1.add(jMenuItem2);
jMenuBar1.add(jMenu1);
jMenu2.setText("Edit");
jMenuItem3.setText("jMenuItem3");
jMenu2.add(jMenuItem3);
jMenuItem4.setText("jMenuItem4");
jMenu2.add(jMenuItem4);
jMenuBar1.add(jMenu2);
setJMenuBar(jMenuBar1);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
// NEU ---
.addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
// -------
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
// NEU ---
.addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
// -------
.addContainerGap())
);
pack();
}// </editor-fold>
private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {
//Hier wird eine FileChooser erstellt und aufgerufen in der eine BIlddate
//ausgewählt werden soll
JFileChooser fileChooser = new JFileChooser(".");
fileChooser.setDialogTitle("Bild öffnen");
fileChooser.showOpenDialog(this);
String BildAdresse = fileChooser.getSelectedFile().getPath();
System.out.println(BildAdresse);
Toolkit Werkzeug = java.awt.Toolkit.getDefaultToolkit();
MediaTracker tracker;
tracker = new MediaTracker(this);
Image Bild = Werkzeug.getImage(BildAdresse);
tracker.addImage(Bild, 0);
//tracker.wait();
// NEU ---
jLabel1.setIcon( new ImageIcon(Bild) );
// -------
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new NewJFrame().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JMenu jMenu1;
private javax.swing.JMenu jMenu2;
private javax.swing.JMenuBar jMenuBar1;
private javax.swing.JMenuItem jMenuItem1;
private javax.swing.JMenuItem jMenuItem2;
private javax.swing.JMenuItem jMenuItem3;
private javax.swing.JMenuItem jMenuItem4;
// NEU ---
private javax.swing.JLabel jLabel1;
// -------
// End of variables declaration
}