JScrollPane in den Code einbauen

tomovic

Bekanntes Mitglied
hallo,
ich habe ein Quellcode gefunden, mit dem man ein jpg öffnen kann. Über 2 Button ist es dann möglich zu zoomen. Leider ist es so, dass mir noch der JScrollPane fehlt, sobald das Bild übergröße bekommt, kann ich nicht scollen.

Java:
import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.ImageObserver;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

class Zoom extends Canvas implements ImageObserver {
  Image img;
  int iw;
  int ih;
  int x;
  int y;
  int adjX = 0;
  int adjY = 0;
  int adjW = 0;
  int adjH = 0;
  Dimension ds;
  
  Zoom() {
    img = getToolkit().getImage("c://1.jpg");
    ds = getToolkit().getScreenSize();
  }
  
  @Override
  public void paint(Graphics g) {
    Graphics2D g2d = (Graphics2D) g;
    setImageBounds();
    g2d.translate(x, y);
    g2d.drawImage(img, 0, 0, iw, ih, this);
    
  }
  
  public void setImageBounds() {
    x = (int) ds.getWidth() / 2 - img.getWidth(this) / 2 + adjX;
    y = (int) ds.getHeight() / 2 - img.getHeight(this) / 2 + adjY;
    iw = img.getWidth(this) + adjW;
    ih = img.getHeight(this) + adjH;
  }
  
  public void zoomIn() {
    adjX -= 10;
    adjY -= 10;
    adjW += 20;
    adjH += 20;
  }
  
  public void zoomOut() {
    if (x < (int) ds.getWidth() / 2 - img.getWidth(this) / 2) {
      adjX += 10;
      adjY += 10;
      adjW -= 20;
      adjH -= 20;
    }
  }
}

class MainInter extends JFrame implements ActionListener {
  JButton btZoomIn;
  JButton btZoomOut;
  JPanel panel;
  Zoom z;
  
  MainInter() {
    setTitle("Image zoom");
    // //////////////////////////////////// ab hier.....
    z = new Zoom();
    add(z, BorderLayout.CENTER);
    // ///////////////////////////////////// bis hier will ich den Code
    // verändern.
    btZoomIn = new JButton("+");
    btZoomIn.addActionListener(this);
    btZoomOut = new JButton("-");
    btZoomOut.addActionListener(this);
    btZoomOut.setOpaque(false);
    
    panel = new JPanel();
    panel.setLayout(new FlowLayout());
    panel.add(btZoomIn);
    panel.add(btZoomOut);
    add(panel, BorderLayout.SOUTH);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setExtendedState(this.getExtendedState() | JFrame.MAXIMIZED_BOTH);
    setVisible(true);
  }
  
  @Override
  public void actionPerformed(ActionEvent e) {
    if (e.getSource() == btZoomIn) {
      z.zoomIn();
      z.repaint();
    } else if (e.getSource() == btZoomOut) {
      z.zoomOut();
      z.repaint();
    }
  }
}

public class ImageZoom {
  public static void main(String args[]) {
    new MainInter();
  }
}


Laut Java Buch:
Java:
JLabel label = new JLabel(new ImageIcon("test.jpg"));
JScrollPane left = new JScrollPane(label);
left.setPreferredSize(new Dimension(200,200));
....

Meine Idee:

Java:
z=new Zoom();
JScrollPane left = new JScrollPane(z);
add(left,BorderLayout.CENTER );

Aber irgend wie haut das nicht hin :-(
 
Zuletzt bearbeitet von einem Moderator:
trotzdem mal danke.

Bei dem großen Quellcode (vom Internet) wird erst das Fenster generiert UND später das jpg geladen, laut meinem java Buch muss ich erst das jpg in ein Label laden, dann im JScrollPane das Label reinstecken und dann bau sich das Fenster auf.

Ich weis nicht wie ich JScrollPane in den grossen Quellcode (vom Internet ) einbauen kann?

Ich hoffe du verstehst was ich meine 🙂
 
Ich hoffe du verstehst was ich meine

öhm....jein.....

Java:
import java.awt.BorderLayout;
import java.awt.Image;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;



public class Foo extends JPanel{
	
	JLabel label;
	JScrollPane pane;
	Image image;
	
	public Foo() throws FileNotFoundException, IOException{
		
		setLayout(new BorderLayout());  // <---
		
		image = ImageIO.read(new FileInputStream(new File("F:/Bilder/Mask.png")));
		label = new JLabel(new ImageIcon(image));
		pane = new JScrollPane(label);
		
		add(pane);
	}
	
	public static void main(String[] args) throws FileNotFoundException, IOException{
		JFrame f = new JFrame();
		f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		f.setContentPane(new Foo());
		f.setSize(250,250);
		f.setLocationRelativeTo(null);
		f.setVisible(true);
	}
}

Was für ein layoutmanager hat der container dem du das Scrollpane hinzufügst ?

Ich weis nicht wie ich JScrollPane in den grossen Quellcode (vom Internet ) einbauen kann?

Der Große Quelltext also xD

Ich muss leider stark vermuten das dir so ziemliche Grundlagen fehlen , darum frage ich mich warum du dich mit Grafischer (Gui) Programmierung beschäftigen möchtest ?!
 
Zuletzt bearbeitet:
ok,thx.
Grundlagen naja 🙂

Ich habe einen kompletten synthesizer in java gebau (nicht alles ist auf meinem Mist gebau).
Bei der Grafik gestalten tute mich noch schwer.Ich code immer so weit wie möglich, dann nutze ich das Forum.

Kannst du nur bitte den zusammenhang kurz erklären.
Ich bekomme leider die Pussel nicht zusammen.
 
Du solltest dich dringend darüber schlau machen, was ein LayoutManager ist.
Bevor du viel Zeit in die GUI investierst - ansonsten musst du später alles nochmal umbauen.
Und nein, es ist keine gute Idee, das Fenster "genau so festzulegen, wie ich es will" - denn so schreibt man keine Programme, die sowohl auf einem Smartphone, als auch auf einem Tablet, einem Desktop-PC und einem 60-Zoll-4k-Monitor funktionieren, bei Schriftgrößen von 50% bis 400% ...

(Mit LayoutManagern geht es ganz komfortabel, dass das Programm sich später vollautomatisch anpasst, und es ist nicht viel Mehraufwand beim Programmieren...)
 
Zuletzt bearbeitet:

Zurück
Oben