Anonymous
Проблемы с пользовательской jpanel в Netbeans
Сообщение
Anonymous » 10 ноя 2024, 07:04
Добрый день!. Некоторое время у меня возникла проблема: когда я создаю собственную jpanel и добавляю ее в другой проект, все в порядке. Проблема возникает, например, когда я добавляю jlabel в эту jpanel, а затем, когда я сохраняю проект, закрываю netbeans и снова открываю его... изображения jpanel больше нет, и я получаю эту ошибку.
Я думаю, что это происходит потому, что ссылка на память объекта изменилась, но я не знаю, как это решить.
Я также хотел бы спросить, есть ли способ заставить изображение, которое я передал в качестве фона в пользовательскую панель jpanel, автоматически адаптироваться к нему. p>
Код прикрепляю здесь:
Код: Выделить всё
package jpanelimagen;
import java.io.File;
import java.io.Serializable;
/**
*
* @author Tarde
*/
public class ImagenFondo implements Serializable {
private File rutaimagen;
private Float opacidad;
private Float saturacion;
public ImagenFondo(File rutaimagen, Float opacidad,Float saturacion) {
this.rutaimagen = rutaimagen;
this.opacidad = opacidad;
this.saturacion=saturacion;
}
public Float getSaturacion() {
return saturacion;
}
public void setSaturacion(Float saturacion) {
this.saturacion = saturacion;
}
public File getRutaimagen() {
return rutaimagen;
}
public void setRutaimagen(File rutaimagen) {
this.rutaimagen = rutaimagen;
}
public Float getOpacidad() {
return opacidad;
}
public void setOpacidad(Float opacidad) {
this.opacidad = opacidad;
}
}
Код: Выделить всё
package jpanelimagen;
import java.io.File;
import javax.swing.JFileChooser;
/**
*
* @author Tarde
*/
public class ImagenFondoPanel extends javax.swing.JPanel {
/**
* Creates new form ImagenFondoPanel
*/
public ImagenFondoPanel() {
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")
//
private void initComponents() {
jLabelImagen = new javax.swing.JLabel();
jTextFieldRuta = new javax.swing.JTextField();
jButtonAbrirRuta = new javax.swing.JButton();
jLabelOpacidad = new javax.swing.JLabel();
jSliderOpacidad = new javax.swing.JSlider();
jLabelSaturacion = new javax.swing.JLabel();
jSliderSaturacion = new javax.swing.JSlider();
jLabelImagen.setText("Imagen: ");
jTextFieldRuta.setEditable(false);
jButtonAbrirRuta.setText("...");
jButtonAbrirRuta.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButtonAbrirRutaActionPerformed(evt);
}
});
jLabelOpacidad.setText("Opacidad: ");
jLabelSaturacion.setText("Saturación: ");
jSliderSaturacion.setMaximum(200);
jSliderSaturacion.setToolTipText("");
jSliderSaturacion.setValue(100);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jLabelImagen, javax.swing.GroupLayout.PREFERRED_SIZE, 54, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jTextFieldRuta, javax.swing.GroupLayout.PREFERRED_SIZE, 150, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jButtonAbrirRuta))
.addGroup(layout.createSequentialGroup()
.addComponent(jLabelOpacidad, javax.swing.GroupLayout.PREFERRED_SIZE, 87, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jSliderOpacidad, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createSequentialGroup()
.addComponent(jLabelSaturacion)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jSliderSaturacion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addContainerGap(99, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabelImagen, javax.swing.GroupLayout.PREFERRED_SIZE, 27, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jTextFieldRuta, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jButtonAbrirRuta))
.addGap(34, 34, 34)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(jLabelOpacidad, javax.swing.GroupLayout.PREFERRED_SIZE, 24, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jSliderOpacidad, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(26, 26, 26)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jLabelSaturacion)
.addComponent(jSliderSaturacion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap(150, Short.MAX_VALUE))
);
}//
private void jButtonAbrirRutaActionPerformed(java.awt.event.ActionEvent evt) {
JFileChooser fileChooser= new JFileChooser();
int resultado=fileChooser.showOpenDialog(this);
if(resultado== JFileChooser.APPROVE_OPTION){
File file=fileChooser.getSelectedFile();
jTextFieldRuta.setText(file.getAbsolutePath());
}
}
public ImagenFondo getSelectedValue(){
File f= new File(jTextFieldRuta.getText());
Float opacidad = jSliderOpacidad.getValue()/100f;
Float saturacion=jSliderSaturacion.getValue()/100f;
return new ImagenFondo(f,opacidad,saturacion);
}
// Variables declaration - do not modify
private javax.swing.JButton jButtonAbrirRuta;
private javax.swing.JLabel jLabelImagen;
private javax.swing.JLabel jLabelOpacidad;
private javax.swing.JLabel jLabelSaturacion;
private javax.swing.JSlider jSliderOpacidad;
private javax.swing.JSlider jSliderSaturacion;
private javax.swing.JTextField jTextFieldRuta;
// End of variables declaration
}
Код: Выделить всё
package jpanelimagen;
import java.awt.Component;
import java.beans.PropertyEditorSupport;
import java.io.File;
/**
*
* @author Tarde
*/
public class ImagenFondoPropertyEditorSupport extends PropertyEditorSupport {
private ImagenFondoPanel imagenFondoPanel = new ImagenFondoPanel();
@Override
public boolean supportsCustomEditor() {
return true; //To change body of generated methods, choose Tools | Templates.
}
@Override
public Component getCustomEditor() {
return imagenFondoPanel; //To change body of generated methods, choose Tools | Templates.
}
@Override
public String getJavaInitializationString() {
ImagenFondo imagenFondo= imagenFondoPanel.getSelectedValue();
File rutaImagen = imagenFondo.getRutaimagen();
String ruta = rutaImagen.getAbsolutePath().replace("\\", "/");
return "new jpanelimagen.ImagenFondo(new java.io.File(\"" + ruta + "\"), "
+ imagenFondo.getOpacidad() + "f, "
+ imagenFondo.getSaturacion() + "f)";
}
@Override
public Object getValue() {
return imagenFondoPanel.getSelectedValue(); //To change body of generated methods, choose Tools | Templates.
}
}
Код: Выделить всё
package jpanelimagen;
import java.awt.AlphaComposite;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.awt.image.RescaleOp;
import java.io.IOException;
import java.io.Serializable;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
/**
*
* @author Tarde
*/
public class JPanelImagen extends JPanel implements Serializable {
/**
* @param args the command line arguments
*/
private ImagenFondo imagenFondo;
public ImagenFondo getImagenFondo() {
return imagenFondo;
}
public void setImagenFondo(ImagenFondo imagenFondo) {
this.imagenFondo = imagenFondo;
repaint(); //volvemos a dibujar si se elige otra imagen de fondo
}
@Override
protected void paintComponent(Graphics grphcs) {
super.paintComponent(grphcs); //To change body of generated methods, choose Tools | Templates.
if(imagenFondo!=null){
if (imagenFondo.getRutaimagen() != null && imagenFondo.getRutaimagen().exists()) {
try{
//Cargar la imagen desde el archivo
BufferedImage b=ImageIO.read(imagenFondo.getRutaimagen());
//verificar si la imagen es indexada y convertir a RGB si no es asi
if(b.getType()==BufferedImage.TYPE_BYTE_INDEXED){
BufferedImage rgb=new BufferedImage(b.getWidth(), b.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D g2d=rgb.createGraphics();
g2d.drawImage(b, 0,0, null);
g2d.dispose();
b=rgb;
}
//Ajuste de saturacion
float saturacion=imagenFondo.getSaturacion();
RescaleOp op=new RescaleOp(saturacion,1f,null);
//generamos la imagen ajustada medianteun "snapshot" de imageview
BufferedImage ad=op.filter(b, null);
Graphics2D g2d = (Graphics2D) grphcs;
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, imagenFondo.getOpacidad()));
g2d.drawImage(ad, 0, 0, null);
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1));
}catch(IOException e){
e.printStackTrace();
}
}
}
}
}
И еще есть сгенерированный класс "jpanelbeaninfo", вот так выглядит проблема:
[img]
https://i .sstatic.net/FyBKGkZV.png[/img]
Кажется, изображение есть, но когда я запускаю файл, оно не появляется, и над всплывающим окном отображается ошибка
Подробнее здесь:
https://stackoverflow.com/questions/791 ... n-netbeans
1731211448
Anonymous
Добрый день!. Некоторое время у меня возникла проблема: когда я создаю собственную jpanel и добавляю ее в другой проект, все в порядке. Проблема возникает, например, когда я добавляю jlabel в эту jpanel, а затем, когда я сохраняю проект, закрываю netbeans и снова открываю его... изображения jpanel больше нет, и я получаю эту ошибку. [img]https://i.sstatic.net/T9zR6eJj.png[/img] Я думаю, что это происходит потому, что ссылка на память объекта изменилась, но я не знаю, как это решить. Я также хотел бы спросить, есть ли способ заставить изображение, которое я передал в качестве фона в пользовательскую панель jpanel, автоматически адаптироваться к нему. p> Код прикрепляю здесь: [code]package jpanelimagen; import java.io.File; import java.io.Serializable; /** * * @author Tarde */ public class ImagenFondo implements Serializable { private File rutaimagen; private Float opacidad; private Float saturacion; public ImagenFondo(File rutaimagen, Float opacidad,Float saturacion) { this.rutaimagen = rutaimagen; this.opacidad = opacidad; this.saturacion=saturacion; } public Float getSaturacion() { return saturacion; } public void setSaturacion(Float saturacion) { this.saturacion = saturacion; } public File getRutaimagen() { return rutaimagen; } public void setRutaimagen(File rutaimagen) { this.rutaimagen = rutaimagen; } public Float getOpacidad() { return opacidad; } public void setOpacidad(Float opacidad) { this.opacidad = opacidad; } } [/code] [code]package jpanelimagen; import java.io.File; import javax.swing.JFileChooser; /** * * @author Tarde */ public class ImagenFondoPanel extends javax.swing.JPanel { /** * Creates new form ImagenFondoPanel */ public ImagenFondoPanel() { 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") // private void initComponents() { jLabelImagen = new javax.swing.JLabel(); jTextFieldRuta = new javax.swing.JTextField(); jButtonAbrirRuta = new javax.swing.JButton(); jLabelOpacidad = new javax.swing.JLabel(); jSliderOpacidad = new javax.swing.JSlider(); jLabelSaturacion = new javax.swing.JLabel(); jSliderSaturacion = new javax.swing.JSlider(); jLabelImagen.setText("Imagen: "); jTextFieldRuta.setEditable(false); jButtonAbrirRuta.setText("..."); jButtonAbrirRuta.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButtonAbrirRutaActionPerformed(evt); } }); jLabelOpacidad.setText("Opacidad: "); jLabelSaturacion.setText("Saturación: "); jSliderSaturacion.setMaximum(200); jSliderSaturacion.setToolTipText(""); jSliderSaturacion.setValue(100); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(jLabelImagen, javax.swing.GroupLayout.PREFERRED_SIZE, 54, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jTextFieldRuta, javax.swing.GroupLayout.PREFERRED_SIZE, 150, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jButtonAbrirRuta)) .addGroup(layout.createSequentialGroup() .addComponent(jLabelOpacidad, javax.swing.GroupLayout.PREFERRED_SIZE, 87, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jSliderOpacidad, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(layout.createSequentialGroup() .addComponent(jLabelSaturacion) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jSliderSaturacion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) .addContainerGap(99, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabelImagen, javax.swing.GroupLayout.PREFERRED_SIZE, 27, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jTextFieldRuta, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jButtonAbrirRuta)) .addGap(34, 34, 34) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(jLabelOpacidad, javax.swing.GroupLayout.PREFERRED_SIZE, 24, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jSliderOpacidad, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(26, 26, 26) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jLabelSaturacion) .addComponent(jSliderSaturacion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap(150, Short.MAX_VALUE)) ); }// private void jButtonAbrirRutaActionPerformed(java.awt.event.ActionEvent evt) { JFileChooser fileChooser= new JFileChooser(); int resultado=fileChooser.showOpenDialog(this); if(resultado== JFileChooser.APPROVE_OPTION){ File file=fileChooser.getSelectedFile(); jTextFieldRuta.setText(file.getAbsolutePath()); } } public ImagenFondo getSelectedValue(){ File f= new File(jTextFieldRuta.getText()); Float opacidad = jSliderOpacidad.getValue()/100f; Float saturacion=jSliderSaturacion.getValue()/100f; return new ImagenFondo(f,opacidad,saturacion); } // Variables declaration - do not modify private javax.swing.JButton jButtonAbrirRuta; private javax.swing.JLabel jLabelImagen; private javax.swing.JLabel jLabelOpacidad; private javax.swing.JLabel jLabelSaturacion; private javax.swing.JSlider jSliderOpacidad; private javax.swing.JSlider jSliderSaturacion; private javax.swing.JTextField jTextFieldRuta; // End of variables declaration } [/code] [code]package jpanelimagen; import java.awt.Component; import java.beans.PropertyEditorSupport; import java.io.File; /** * * @author Tarde */ public class ImagenFondoPropertyEditorSupport extends PropertyEditorSupport { private ImagenFondoPanel imagenFondoPanel = new ImagenFondoPanel(); @Override public boolean supportsCustomEditor() { return true; //To change body of generated methods, choose Tools | Templates. } @Override public Component getCustomEditor() { return imagenFondoPanel; //To change body of generated methods, choose Tools | Templates. } @Override public String getJavaInitializationString() { ImagenFondo imagenFondo= imagenFondoPanel.getSelectedValue(); File rutaImagen = imagenFondo.getRutaimagen(); String ruta = rutaImagen.getAbsolutePath().replace("\\", "/"); return "new jpanelimagen.ImagenFondo(new java.io.File(\"" + ruta + "\"), " + imagenFondo.getOpacidad() + "f, " + imagenFondo.getSaturacion() + "f)"; } @Override public Object getValue() { return imagenFondoPanel.getSelectedValue(); //To change body of generated methods, choose Tools | Templates. } } [/code] [code]package jpanelimagen; import java.awt.AlphaComposite; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.awt.image.RescaleOp; import java.io.IOException; import java.io.Serializable; import javax.imageio.ImageIO; import javax.swing.JPanel; /** * * @author Tarde */ public class JPanelImagen extends JPanel implements Serializable { /** * @param args the command line arguments */ private ImagenFondo imagenFondo; public ImagenFondo getImagenFondo() { return imagenFondo; } public void setImagenFondo(ImagenFondo imagenFondo) { this.imagenFondo = imagenFondo; repaint(); //volvemos a dibujar si se elige otra imagen de fondo } @Override protected void paintComponent(Graphics grphcs) { super.paintComponent(grphcs); //To change body of generated methods, choose Tools | Templates. if(imagenFondo!=null){ if (imagenFondo.getRutaimagen() != null && imagenFondo.getRutaimagen().exists()) { try{ //Cargar la imagen desde el archivo BufferedImage b=ImageIO.read(imagenFondo.getRutaimagen()); //verificar si la imagen es indexada y convertir a RGB si no es asi if(b.getType()==BufferedImage.TYPE_BYTE_INDEXED){ BufferedImage rgb=new BufferedImage(b.getWidth(), b.getHeight(), BufferedImage.TYPE_INT_RGB); Graphics2D g2d=rgb.createGraphics(); g2d.drawImage(b, 0,0, null); g2d.dispose(); b=rgb; } //Ajuste de saturacion float saturacion=imagenFondo.getSaturacion(); RescaleOp op=new RescaleOp(saturacion,1f,null); //generamos la imagen ajustada medianteun "snapshot" de imageview BufferedImage ad=op.filter(b, null); Graphics2D g2d = (Graphics2D) grphcs; g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, imagenFondo.getOpacidad())); g2d.drawImage(ad, 0, 0, null); g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1)); }catch(IOException e){ e.printStackTrace(); } } } } } [/code] И еще есть сгенерированный класс "jpanelbeaninfo", вот так выглядит проблема: [img]https://i .sstatic.net/FyBKGkZV.png[/img] Кажется, изображение есть, но когда я запускаю файл, оно не появляется, и над всплывающим окном отображается ошибка Подробнее здесь: [url]https://stackoverflow.com/questions/79173471/problems-with-custom-jpanel-in-netbeans[/url]