Wczytywanie i edycja obrazka

0

Witam, chcę stworzyć prosty programik który, wczytuje zdjęcia do panelu i później coś z nim robi. Mam stworzoną klasę, gdzie w konstruktorze w bloku try wczytuję jakiś obrazek ze ścieżki.

 
public class Obrazek extends JPanel{
        public static BufferedImage img,dest = null;

        public Obrazek(){
            super();
            try{
              img = ImageIO.read(new File("D:\\tlo.jpg"));
            }catch(Exception e){}
        }
        
        public static void ustawObrazek(BufferedImage im){
            img=im;
        }
        @Override
        public void paint(Graphics g) {
            g.drawImage(img, 0, 0, null);
        }
}

W głównym programie też w konstruktorze mam stworzony panel, który jest obiektem tej pierwszej klasy. W metodzie guzika, którym wczytuję obrazek pobieram nowe zdjęcie.

 

    private void przyciskWczytaj(java.awt.event.ActionEvent evt) { 
                                
                int odpowiedz = jFileChooser1.showOpenDialog(this);

    if (odpowiedz == jFileChooser1.APPROVE_OPTION) {
        File file = jFileChooser1.getSelectedFile();
        try {
                BufferedImage im = ImageIO.read(new File(file.getAbsolutePath());       
                jPanel1.ustawObrazek(im);                
               
        } catch (IOException ex) {
                System.out.println("Błąd");
        }
    }
    } 

Mam też w tej głównej klasie metody, w których pobieram jakieś dane z tego obrazka i coś z nimi robię. Chciałbym spytać co mam zrobić, żeby po wczytaniu operować na tym nowym obrazku a nie tym który wczytuję ze ścieżki ?? Z góry dziękuje za wszelakie wskazówki

0

Nie jestem pewien, ale wydaje mi się, że powinieneś użyć metody repaint (i ewentualnie przed nią validate) na obiekcie (jak zgaduję) jPanel1

0

Dopisałem takie coś ale nadal wywala mi jakieś błędy

    private void przyciskWczytaj(java.awt.event.ActionEvent evt) {                                 
                int odpowiedz = jFileChooser1.showOpenDialog(this);
	if (odpowiedz == jFileChooser1.APPROVE_OPTION) {
	    File file = jFileChooser1.getSelectedFile();
	    try {
                BufferedImage im = ImageIO.read(new File(file.getAbsolutePath()));
                jPanel1.ustawObrazek(im);
                jPanel1.revalidate();
                jPanel1.repaint();

               
	    } catch (IOException ex) {
                System.out.println("Błąd");
	    }
	}
    } 
 

Wstawię jeszcze kod z konstruktora głównej klasy:

    public OknoPrzetwarzania() {
        
        jPanel1 = new Obrazek();
        jPanel1.setBounds(10,100,256,256);
        add(jPanel1); 
    }
 
0

Po pierwsze google nie boli. Pierwsza lepsza odpowiedź na fraze "java swing display image"

BufferedImage myPicture = ImageIO.read(new File("path-to-file"));
JLabel picLabel = new JLabel(new ImageIcon(myPicture));
add(picLabel);

Nie ma czegoś takiego jak jakieś błędy ! Jak następnym razem ich nie przekopiujesz to nikt Ci nie pomoże.

0

Zamiast błąd powinieneś, wypisac jaki błąd wypisuje na konsole aplikacja.

catch (IOException ex) {
 ///  System.out.println("Błąd"); takie cos nic nie da
/// mozesz tak
Toast.makeText(this, ex, Toast.LENGTH_SHORT).show();
///mozesz tak
System.err.println("Caught IOException: " + ex.getMessage());
/// lub
ex.printStackTrace();
}

Jeszcze możesz użyc do tego loggera, ale tyle wystarczy.
Jak sprawdzisz jaki błąd drukuje to podaj go tutaj.

0

Pierwsza strona z google: http://stackoverflow.com/questions/299495/java-swing-how-to-add-an-image-to-a-jpanel

Wystarczy że nie obsłużysz wyjątku w Javie SE to cały stack trace wywali się do konsoli.

0

Dziękuje za wszelakie wskazówki, mam teraz takie pytanie mam stworzoną klasę, w której stworzyłem sobie dwa slidery i combobox

public class pierwszeP extends javax.swing.JFrame {

    int wartJ, wartK=0;
    double warGamma=0;
    private OknoPrzetwarzania ok;
 
    public pierwszeP() {
        initComponents();
    }
                   

    private void jSlider1StateChanged(javax.swing.event.ChangeEvent evt) {                                      
        wartJ = jSlider1.getValue();
        jTextField1.setText(""+wartJ);
    }                                     

    private void jSlider2StateChanged(javax.swing.event.ChangeEvent evt) {                                      
        wartK = jSlider2.getValue();
        jTextField2.setText(""+wartK);
    }                                     

    private void jComboBox1ActionPerformed(java.awt.event.ActionEvent evt) {                                           
        int wartoscG = (int) jComboBox1.getSelectedIndex();
        double [] table = new double[]{0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1,2,3,4,5,6,7,8,9,10};
        warGamma = table[wartoscG];
        System.out.println("wartość Gamma: "+warGamma);
    }                                          
    
    
    private void jMenu1ActionPerformed(java.awt.event.ActionEvent evt) {                                       
        
    }                                      

    // Variables declaration - do not modify                     
    private javax.swing.JComboBox jComboBox1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JMenuItem jMenuItem1;
    private javax.swing.JSlider jSlider1;
    private javax.swing.JSlider jSlider2;
    private javax.swing.JTextField jTextField1;
    private javax.swing.JTextField jTextField2;
    // End of variables declaration                   
}
 

W klasie testującej chciałbym aby w polu tekstowym pokazywało mi bieżącą wartość jasności z pierwszej klasy. Czy ktoś wie jak mniej więcej trzeba byłoby to zrobić ?

 
public class test extends javax.swing.JFrame {
    private pierwszeP panelJKG;

    public test() {
        initComponents();
    }
    private void initComponents() {

        jasnosc = new javax.swing.JTextField();
        ....
        ....
        ....
   }
   public static void main(String args []){
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new test().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify
    private javax.swing.JButton jButton1;
    private javax.swing.JTextField jasnosc;
    // End of variables declaration
}
0

nie bardzo wiem co to jest wartość jasności z pierwszej klasy ale możesz przekazać do pierwszej klasy przy jej tworzeniu referencję(np w konstuktorze) do jej JTextField który nazwałeś jasnosc i zmieniać jej wartość w pierwszej klasie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1