Java Swing, skalowanie obrazka

0

Witam, zacząłem bawić się w NetBeansie javą i stworzyłem program który po wciśnięciu przycisku ładuje wybrane przez nas zdjęcie, otwiera je w oryginalnych rozmiarach ale nie mogę sobie dać rady ze skalowaniem tego obrazka.Chodzi mi o kod który sprawia, że zdjęcie rozciąga się z zachowaniem proporcji, proszę o pomoc Oto kod:

import java.awt.Graphics;
import java.awt.Image;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JFileChooser;


public class Obrazki extends javax.swing.JFrame {

    
    public Obrazki() {
        initComponents();
    }

    
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        otworz = new javax.swing.JButton();
        widok = new javax.swing.JPanel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        otworz.setText("Otwórz....");
        otworz.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                otworzActionPerformed(evt);
            }
        });

        widok.setBackground(new java.awt.Color(0, 0, 0));

        javax.swing.GroupLayout widokLayout = new javax.swing.GroupLayout(widok);
        widok.setLayout(widokLayout);
        widokLayout.setHorizontalGroup(
            widokLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );
        widokLayout.setVerticalGroup(
            widokLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 363, Short.MAX_VALUE)
        );

        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()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(widok, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(otworz)
                        .addGap(0, 422, Short.MAX_VALUE)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(otworz)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(widok, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>                        

    Image obrazek=null;
    @Override
    public void paint(Graphics gs){
        super.paint(gs);
        if(obrazek==null) return;
        Graphics g = widok.getGraphics();
        g.drawImage(obrazek, 0, 0,
                   widok.getWidth(), widok.getHeight(),
                this);
        
    }
    
    private void otworzActionPerformed(java.awt.event.ActionEvent evt) {                                       
       
        JFileChooser okno = new JFileChooser();
        okno.showOpenDialog(this);
        
        File plik = okno.getSelectedFile();
        try {
            obrazek = ImageIO.read(plik);
            Graphics g = widok.getGraphics();
         
            g.drawImage(obrazek, 0, 0, this);
        } catch (IOException ex) {
            Logger.getLogger(Obrazki.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    }                                      

    
    public static void main(String args[]) {
     
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(Obrazki.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(Obrazki.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(Obrazki.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Obrazki.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
       
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Obrazki().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify                     
    private javax.swing.JButton otworz;
    private javax.swing.JPanel widok;
    // End of variables declaration                   
}
0

Poniższy kod zmniejsza siedmiokrotnie obrazek.

Graphics2D g2 = (Graphics2D)g;
g2.scale(1.0/7,1.0/7);
g2.drawImage(obraz,0,0,this);
0

nie do końca o to mi chodzi, potrzebuje wpisać kod po którym obrazek powiększając go będzie zachowywał swoje proporcje

0

Znasz geometrię? Jak każdy bok skrócisz w tym samym stosunku, to proporcję się zachowają.

0

ale rozciągając myszką mogę go dowolnie rozciągnąć w jedną stronę a nie rozciągać w drugą a chce zachować proporcję podczas rozciągania tak aby rozciągał się za pomocą myszki równomiernie w pionie i w poziomie

0

Naucz się zadawać pytania.

Chodzi mi o kod który sprawia, że zdjęcie rozciąga się z zachowaniem proporcji,

I dostałeś kod

0

Łapiesz ruch myszką z wciśniętym przyciskiem na komponencie w którym masz obrazek i skalujesz w obie strony o taką samą proporcję, wyczytaną z przesunięcia myszy. Gdzie tu problem?

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