Java Canvas in ScrollPane Problem

drunken.panda

Enthusiast
Thread Starter
Mitglied seit
19.01.2010
Beiträge
1.898
Servus miteinander,

ich bin aktuell an einer Oberfläche für ein Zeichentool am basteln aber die funktioniert noch nicht so wie ich mir das wünsche.
Realisieren wollte ich es als JFrame in dem zwei Panel sind. Ein Linkes und ein Rechtes für die Buttons.

Das linke ist ein ScrollPane, dass ein Canvas enthält.

Leider aktualisiert er mir mein Canvas nicht, wenn ich die ScrollBars nutze.
Ich habe bereits gelesen, dass man nicht AWT und Swing mischen soll aber ich bekomm es einfach nich gescheit hin meine Zeichenobjekte auf einem JPanel zu zeichnen, dass diese auch im inneren Linken Panel bleiben.

Hier mal n Codeausschnit von meiner View-Klasse.

Auf dem Canvas Objekt zeichne ich Vierecke und andere Figuren, die in meinem Modell in einem Feld gespeichert werden.

Code:
package View;

import java.awt.BorderLayout;
import java.awt.Canvas.*;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.awt.event.ComponentListener;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSlider;
import javax.xml.bind.Marshaller.Listener;










import Controller.MovieMakerController;
import Model.Figure;
import Model.MovieMakerModel;
import Model.Scene;
import View.MyCanvas;

public class MovieMakerView extends JFrame  {
		
	private MovieMakerController controller = null;
	private MovieMakerModel model = null;

	public JScrollPane linkesPanel;
	public JScrollPane getLinkesPanel() {
		return linkesPanel;
	}
	public void setLinkesPanel(JScrollPane linkesPanel) {
		this.linkesPanel = linkesPanel;
	}

	public JPanel rechtesPanel;
	private MyCanvas malFlaeche;
	

	private JButton kreis;
	private JButton ellipse;
	private JButton quadrat;
	private JButton rechteck;
	private JButton bewegen;
	private JButton loeschen;
	private JButton aufnehmen;
	private JButton animieren;
	private JSlider rot;
	private JSlider gruen;
	private JSlider blau;
	private JCheckBox chbx;

	// Hilfsmethode zum Hinzufügen von Komponenten ins rechte GidBagLayout Panel

	public void setzeKomponente(Component c, int x, int y, int width,
			int height, int fill, int anchor, int weightx, int weighty,
			int ipadx, int ipady, Insets abstand) {
		GridBagConstraints gbc = new GridBagConstraints();
		gbc.gridx = x;
		gbc.gridy = y;
		gbc.gridwidth = width;
		gbc.gridheight = height;
		gbc.fill = fill;
		gbc.anchor = anchor;
		gbc.weightx = weightx;
		gbc.weighty = weighty;
		gbc.ipadx = ipadx;
		gbc.ipady = ipady;
		gbc.insets = abstand;
	
		rechtesPanel.add(c, gbc);

	}
	public class Canvas_Neu extends Canvas  {
	
		public void paint(Graphics g)
		{
			ArrayList<Figure> lcScene = model.getScenes();
			super.paint(g);
			for (Figure lcFigure : lcScene) {
				lcFigure.paint();
			
			}
							
		
			
		}
		
	
			
		public void update (Graphics g) { 
			super.update(g);
			paint(g);
			}
		
		
			
		
		
	}
	

	// Konstruktor

	public MovieMakerView(MovieMakerController mmc, MovieMakerModel mmp) {
		super();
		this.controller=mmc;
		this.model=mmp;
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		addWindowListener(mmc);
		
		setLayout(new BorderLayout());
		
		malFlaeche = new MyCanvas();
		linkesPanel = new JScrollPane(malFlaeche);
		linkesPanel.setBackground(Color.LIGHT_GRAY);
	
		
		malFlaeche.setPreferredSize(new Dimension(800,800));
		
		add(linkesPanel, BorderLayout.CENTER);

		rechtesPanel = new JPanel(new GridBagLayout());
		rechtesPanel.setPreferredSize(new Dimension(330, 400));
		rechtesPanel.setBackground(Color.WHITE);
		
		
		
		
		// Setzen von leerer Fuellflaeche
		setzeKomponente(new JLabel(), 0, 0, 0, 1, GridBagConstraints.BOTH,
				GridBagConstraints.CENTER, 1, 1, 0, 0, new Insets(0, 0, 0, 0));

		// Obere 4 Buttonblock
		setzeKomponente(kreis = new JButton("Kreis"), 0, 1, 1, 1,
				GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER, 1, 0,
				0, 0, new Insets(2, 2, 2, 2));
		setzeKomponente(ellipse = new JButton("Ellipse"), 1, 1, 1, 1,
				GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER, 1, 0,
				0, 0, new Insets(2, 2, 2, 2));
		setzeKomponente(quadrat = new JButton("Quadrat"), 0, 2, 1, 1,
				GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER, 1, 0,
				0, 0, new Insets(2, 2, 2, 2));
		setzeKomponente(rechteck = new JButton("Rechteck"), 1, 2, 1, 1,
				GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER, 0, 0,
				0, 0, new Insets(2, 2, 2, 2));
		setzeKomponente(new JLabel(), 2, 2, 1, 1, GridBagConstraints.NONE,
				GridBagConstraints.CENTER, 0, 0, 90, 0, new Insets(0, 0, 0, 0));

		// Setzen von leerer Fuellflaeche
		setzeKomponente(new JLabel(), 0, 3, 1, 1, GridBagConstraints.BOTH,
				GridBagConstraints.CENTER, 1, 1, 0, 0, new Insets(0, 0, 0, 0));

		// Slider und Checkbox für RGB Einstellungen inkl. Beschriftung

		setzeKomponente(new JLabel("ROT"), 0, 4, 1, 1, GridBagConstraints.NONE,
				GridBagConstraints.CENTER, 1, 0, 0, 0, new Insets(0, 0, 0, 0));
		setzeKomponente(new JLabel("GRUEN"), 1, 4, 1, 1,
				GridBagConstraints.NONE, GridBagConstraints.CENTER, 1, 0, 0, 0,
				new Insets(0, 0, 0, 0));
		setzeKomponente(new JLabel("BLAU"), 2, 4, 1, 1,
				GridBagConstraints.NONE, GridBagConstraints.CENTER, 1, 0, 0, 0,
				new Insets(0, 0, 0, 0));
		setzeKomponente(new JLabel("gefuellt?"), 3, 4, 1, 1,
				GridBagConstraints.NONE, GridBagConstraints.CENTER, 1, 0, 0, 0,
				new Insets(0, 0, 0, 0));

		setzeKomponente(rot = new JSlider(0, 255), 0, 5, 1, 1,
				GridBagConstraints.BOTH, GridBagConstraints.WEST, 1, 0, 0, 0,
				new Insets(1, 1, 1, 1));
		setzeKomponente(gruen = new JSlider(0, 255), 1, 5, 1, 1,
				GridBagConstraints.BOTH, GridBagConstraints.CENTER, 1, 0, 0, 0,
				new Insets(1, 1, 1, 1));
		setzeKomponente(blau = new JSlider(0, 255), 2, 5, 1, 1,
				GridBagConstraints.BOTH, GridBagConstraints.EAST, 1, 0, 0, 0,
				new Insets(1, 1, 1, 1));
		setzeKomponente(chbx = new JCheckBox(), 3, 5, 1, 1,
				GridBagConstraints.NONE, GridBagConstraints.CENTER, 1, 0, 0, 0,
				new Insets(1, 1, 1, 1));

		// Setzen von leerer Fuellflaeche
		setzeKomponente(new JLabel(), 0, 6, 1, 1, GridBagConstraints.BOTH,
				GridBagConstraints.CENTER, 1, 1, 0, 0, new Insets(0, 0, 0, 0));

		// Setzen des Bewegen Buttons

		setzeKomponente(bewegen = new JButton("Bewegen"), 0, 7, 1, 1,
				GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER, 0, 0,
				0, 0, new Insets(2, 2, 2, 2));

		// Setzen von leerer Fuellflaeche
		setzeKomponente(new JLabel(), 0, 8, 1, 1, GridBagConstraints.BOTH,
				GridBagConstraints.CENTER, 1, 1, 0, 0, new Insets(0, 0, 0, 0));

		// Setzen des löschen Buttons

		setzeKomponente(loeschen = new JButton("Loeschen"), 0, 9, 1, 1,
				GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER, 0, 0,
				0, 0, new Insets(2, 2, 2, 2));

		// Setzen von leerer Fuellflaeche
		setzeKomponente(new JLabel(), 0, 10, 1, 1, GridBagConstraints.BOTH,
				GridBagConstraints.CENTER, 1, 1, 0, 0, new Insets(0, 0, 0, 0));

		// Setzen des aufnehmen,Animieren Buttons
		setzeKomponente(aufnehmen = new JButton("Aufnahme"), 0, 11, 1, 1,
				GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER, 0, 0,
				0, 0, new Insets(2, 2, 2, 2));
		setzeKomponente(animieren = new JButton("Animieren"), 1, 11, 1, 1,
				GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER, 0, 0,
				0, 0, new Insets(2, 2, 2, 2));

		// Setzen von leerer Fuellflaeche
		setzeKomponente(new JLabel(), 0, 12, 1, 1, GridBagConstraints.BOTH,
				GridBagConstraints.CENTER, 1, 1, 0, 0, new Insets(0, 0, 0, 0));

		// Listener
		kreis.addActionListener(mmc);
		rechteck.addActionListener(mmc);
		ellipse.addActionListener(mmc);
		quadrat.addActionListener(mmc);
		bewegen.addActionListener(mmc);
		aufnehmen.addActionListener(mmc);
		loeschen.addActionListener(mmc);
		animieren.addActionListener(mmc);
		rot.addChangeListener(mmc);
		rot.setName("rot");
		rot.setEnabled(false);
		rot.setFocusable(false);
		gruen.addChangeListener(mmc);
		gruen.setName("gruen");
		gruen.setEnabled(false);
		gruen.setFocusable(false);
		blau.addChangeListener(mmc);
		blau.setName("blau");
		blau.setEnabled(false);
		blau.setFocusable(false);
		chbx.addItemListener(mmc);
		chbx.setEnabled(false);
		malFlaeche.addMouseListener(mmc);
		malFlaeche.addMouseMotionListener(mmc);
		malFlaeche.setFocusable(false);
		
		quadrat.addFocusListener(mmc);
		kreis.addFocusListener(mmc);
		ellipse.addFocusListener(mmc);
		rechteck.addFocusListener(mmc);
		aufnehmen.addFocusListener(mmc);
		animieren.addFocusListener(mmc);
		loeschen.addFocusListener(mmc);
		gruen.addFocusListener(mmc);
		rot.addFocusListener(mmc);
		blau.addFocusListener(mmc);
		bewegen.addFocusListener(mmc);
		chbx.addFocusListener(mmc);
		chbx.setFocusable(false);
		malFlaeche.setBackground(Color.CYAN);
		
		add(rechtesPanel, BorderLayout.EAST);
		pack();
		setVisible(true);
		
		
		
	}
	public int getDefaultSliderRedValue()
	{
		
		return rot.getValue();
		
	}
	public int getDefaultSliderBlueValue()
	{
		
		return blau.getValue();
		
	}
	public int getDefaultSliderGreenValue()
	{
		
		return gruen.getValue();
		
	}
	
	public MyCanvas getMalFlaeche() {
		return malFlaeche;
	}

	public void setMalFlaeche(MyCanvas malFlaeche) {
		this.malFlaeche = malFlaeche;
	}
	
	public MovieMakerController getController() {
		return controller;
	}

	public void setController(MovieMakerController controller) {
		this.controller = controller;
	}

	public MovieMakerModel getModel() {
		return model;
	}

	public void setModel(MovieMakerModel model) {
		this.model = model;
	}
	public void setButtonsEnabled(boolean t)
	{
		rot.setEnabled(t);
		gruen.setEnabled(t);
		blau.setEnabled(t);
		chbx.setEnabled(t);
	}
	
	public JButton getFokusedButton()
	{
		
		if(kreis.isFocusOwner()==true || quadrat.isFocusOwner()==true || rechteck.isFocusOwner()==true || ellipse.isFocusOwner()==true)
		{
			return kreis;
		}
		if(loeschen.isFocusOwner()==true)
		{
			return loeschen;
		}
		if(bewegen.isFocusOwner()==true)
		{
			return bewegen;
		}
		if(aufnehmen.isFocusOwner()==true)
		{
			return aufnehmen;
		}
		if(animieren.isFocusOwner()==true)
		{
			return animieren;
		}
		else return null;
		
	}
 
Zuletzt bearbeitet:
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh