Auf ein Panel malen

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Abend,

ich habe das Problem, dass das gezeichnete nicht auf dem Panel angezeigt wird. :(

Code:
public class Test extends javax.swing.JPanel implements ActionListener {

	/** Creates new form NewJPanel1 */
	public Test() {
		jScrollPane2 = new javax.swing.JScrollPane();
		setLayout(new java.awt.GridLayout());
		jScrollPane2.setBackground(Color.white);
		add(jScrollPane2);
	}

	public void paintComponet(Graphics g) {
		g.setColor(Color.orange);
		g.fillRect(200, 200, 10, 10);
	}// close paintComponent

	private javax.swing.JScrollPane jScrollPane2;

	// End of variables declaration
	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		System.out.println("Hallo");
	}

}
 
G

Guest

Gast
also die Klasse wird auf gerufen jedoch daran sollte es nicht hängen (da das Panel weiß angezeigt wird). Könnte es an der JScrollPane liegen das man auf ihr nicht zeichnen kann?
 
S

SlaterB

Gast
poste ein komplettes Programm,

ist das Panel überhaupt groß genug? 200,200 ist recht weit rechts unten
 
G

Guest

Gast
also hier ist das Main Programm das die andere Klasse durch Button druck aufruft.

Code:
public class Main extends JFrame implements ActionListener {

	JPanel test_panel = new Test_Panel();

	JPanel jp_links = new JPanel();
	JScrollPane jScrollPane1 = new JScrollPane();
	JPanel jPanel4 = new javax.swing.JPanel();
	JButton button = new JButton("Test");
	JPanel jPanel2 = new JPanel();
	JScrollPane jScrollPane2 = new JScrollPane();

	/** Creates new form Test */
	public Main() {
		setSize(700, 700);
		initComponents();
	}
	
	private void initComponents() {
		setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		// setMinimumSize(new java.awt.Dimension(639, 479));
		getContentPane().setLayout(
				new BoxLayout(getContentPane(), BoxLayout.LINE_AXIS));

		jp_links.setMaximumSize(new Dimension(128, 1000));
		jp_links.setMinimumSize(new Dimension(128, 480));
		jp_links.setPreferredSize(new Dimension(128, 480));
		jp_links.setLayout(new BorderLayout());
		jScrollPane1.setMinimumSize(new Dimension(100, 23));
		jPanel4.setMaximumSize(new Dimension(100, 1000));
		jPanel4.setMinimumSize(new Dimension(90, 472));
		jPanel4.setLayout(new GridLayout(20, 0, 10, 10));
		button.addActionListener(this);
		jPanel4.add(button);
		jScrollPane1.setViewportView(jPanel4);
		jp_links.add(jScrollPane1, BorderLayout.CENTER);
		getContentPane().add(jp_links);
		jPanel2.setMaximumSize(new Dimension(1152, 1000));
		jPanel2.setMinimumSize(new Dimension(512, 480));
		jPanel2.setPreferredSize(new Dimension(100, 100));
		jPanel2.setLayout(new BoxLayout(jPanel2, BoxLayout.Y_AXIS));

		getContentPane().add(jPanel2);
	}

	public static void main(String[] args) {
		new Main().setVisible(true);
	}

	@Override
	public void actionPerformed(ActionEvent event) {
		jPanel2.setLayout(new GridLayout(1, 0, 0, 0));
		jPanel2.add(test_panel);
		repaint();
		jPanel2.revalidate();
	}
}
 

L-ectron-X

Gesperrter Benutzer
Code:
   public void actionPerformed(ActionEvent event) { 
      //jPanel2.setLayout(new GridLayout(1, 0, 0, 0)); //in initComponents() zu erledigen! 
      jPanel2.add(test_panel); 
      jPanel2.validate(); 
   }
 
G

Guest

Gast
also das n hat gefehlt, ist aber immer noch nix

zur berechtigung die Panelklasse heißt Test_Panel (war oben ein Schreibfehler von mir). Könnte es aber sein das ich durch den draw auf die ComponentPane zeichne und das dann durchs Panel verdecke?
 

André Uhres

Top Contributor
Anonymous hat gesagt.:
Könnte es aber sein das ich durch den draw auf die ComponentPane zeichne und das dann durchs Panel verdecke?
Es ist eher so, daß das Gezeichnete durch jScrollPane2 verdeckt wird :wink:

Swing unterteilt den paint() Aufruf in drei verschiedene Methoden, die in folgender Reihenfolge aufgerufen werden:
Code:
protected void paintComponent(Graphics g)
protected void paintBorder(Graphics g)
protected void paintChildren(Graphics g)
Wegen "add(jScrollPane2);" wird das, was in paintComponent(..) gezeichnet wurde, in paintChildren(..) wieder übermalt.
Siehe auch: Malen in AWT und Swing: Die_Malmethoden
 
G

Guest

Gast
Danke dir, dass wusste ich nicht. In Java lernt man nie aus. :###
 
G

Guest

Gast
so nun noch eine letzte frage :D

wenn ich auf den Panel Buttons lege werden diese erst sichtbar wenn ich mit der Maus drüber rutsche :(

nun im Panel:
Code:
public class Test_Panel extends javax.swing.JPanel implements ActionListener {

  	private static final long serialVersionUID = 1L;
 	JButton[] bt = new JButton[16];

 	protected void paintChildren(Graphics g){
	      g.setColor(Color.orange);
	      g.fillOval(500, 500, 50, 50);
	}// close paintComponent

 	/** Creates new form NewJPanel1 */
 	public Test_Panel() {

 		setLayout(null);
 		for (int i = 0; i < bt.length; i++) {
 			bt[i] = new JButton(cup);
 			bt[i].addActionListener(this);
 			bt[i].setActionCommand("bt" + i);
 			bt[i].setBounds(10*i,10, 4,4);
 			add(bt[i]);
 		}
 		setBackground(Color.black);
  	}
  
 	public void actionPerformed(ActionEvent action) {
 		System.out.println(action.getActionCommand());
 	}
 }
 

André Uhres

Top Contributor
Kleine Unachtsamkeit: paintChildren -> paintComponent :wink:
Obgleich die API es erlaubt, gibt es im Allgemeinen keinen Grund paintBorder() oder paintChildren()
zu überschreiben (und wenn du es tust, sei dir sicher was du tust!).
 

Balian

Bekanntes Mitglied
Hallo Zusammen,

ich habe eigentlich genau das gleiche Problem. Ich habe ein JPanel auf welches ich ein Bild zeichen. Das klappt! Nun packe ich dieses JPanel in eine JScrollpane und es ist nicht zu sehen. Was mache ich falsch?

Der Quellcode ist eigentlich der gleiche wie der vom Gast, nur das ich die JScrollPane an andere Stelle erzeuge und nicht gleich beim Panel.

Danke und Gruß

Balian
 

Balian

Bekanntes Mitglied
Hm, das hat es auch nicht gebracht. Hier mal ein Beispielcode:

Code:
package de.nicepicture.gui;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class Test extends JFrame {

	static Test fenster;
	String dateiname;
	BufferedImage bild;
	BildLeinwand leinwand;
	
	JMenuBar menuleiste = new JMenuBar();
	
	JMenu		menuDatei 				= new JMenu();
	JMenuItem	menuDateiOeffnen 		= new JMenuItem();
	
	public Test() {
		
		super();
		
		this.setTitle("Test");
		this.getContentPane().setBackground(Color.LIGHT_GRAY);
				
		menuDatei.setText("Datei");
		menuDateiOeffnen.setText("Öffnen");
		menuDateiOeffnen.addActionListener(new MenuAction());
		menuDatei.add(menuDateiOeffnen);
		menuleiste.add(menuDatei);
		this.setJMenuBar(menuleiste);
		
		// Eine Leinwand anlegen
		leinwand = new BildLeinwand();
				
		//JScrollPane mainPanel = new JScrollPane();
		//mainPanel.setPreferredSize(new Dimension(500, 500));
		//mainPanel.add(leinwand);
		
		this.getContentPane().add(leinwand, BorderLayout.CENTER);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
	}
	

	
	protected void bildOeffnen() {
				
		JFileChooser oeffnenDialog = new JFileChooser();
		oeffnenDialog.setCurrentDirectory(new File("."));
		oeffnenDialog.setAcceptAllFileFilterUsed(false);
		
		if(JFileChooser.APPROVE_OPTION == oeffnenDialog.showOpenDialog(this)) {
			
			this.dateiname = oeffnenDialog.getSelectedFile().getPath();
			
			try {
				
				bild = ImageIO.read(new File(dateiname));
				
				leinwand.repaint();
				pack();
				
			} catch (Exception e) {
				dateiname = null;
				bild = null;				
			}
			
		}
		
	}

	public static void main(String[] args) {
		
		Test fenster = new Test();
		fenster.setSize(500, 500);
		fenster.setLocation(200,300);
		fenster.setVisible(true);
		
	}
	
	
	class BildLeinwand extends JPanel {
		
		public void paintComponent(Graphics g) {
			super.paintComponent(g);
			
			if(bild != null) {
				g.drawImage(bild, 0, 0, bild.getWidth(), bild.getHeight(), this);
			}
		}
		
		public Dimension getPreferredSize() {
			if(bild != null) {
				return new Dimension(bild.getWidth(), bild.getHeight());
			} else {
				return fenster.getSize();
			}
		}
	}
	
	
	class MenuAction implements ActionListener {

		public void actionPerformed(ActionEvent e) {
			if(e.getSource() == menuDateiOeffnen) {
				bildOeffnen();
			}
		}
	}
}

Der Code funktioniert so, aber wenn ihr mal den ScrollPaneausschnitt nehmt, dann wird das Image nicht eu gezeichnet.

Es wäre toll, wenn Jemand meinen Fehler finden würde.

Danke und Gruß

Balian
 
S

SlaterB

Gast
bei leinwand musst du die PreferredSize setzen, nicht beim JScrollPane..

edit: hast du ja evtl. schon, ich probiers nun mal aus
 

Balian

Bekanntes Mitglied
Hi Slater,

ich habe es mit PreferredSize schon in verschiedenen Varianten probiert, aber vielleicht findest Du ja meinen Fehler.

Gruß

Balian
 
S

SlaterB

Gast
die statische Variable fenster ist immer null

zum Glück wird nie getPreferredSize abgefragt, weil du das JScrollPane nicht in die GUI einfügst:
> this.getContentPane().add(leinwand, BorderLayout.CENTER);

sonst gäbe es am Anfang eine Exception


------

//JScrollPane mainPanel = new JScrollPane();
//mainPanel.add(leinwand);

ist auch nicht der Standard dieser Welt, wo hast du den Code her?

JScrollPane mainPanel = new JScrollPane(leinwand);
schreibt man, ansonsten setViewPointView()


------

dein Problem mit painten ist allerdings ganz was anderes,
wie meinst du das denn,
Auswahl eines anderen Bildes per Datei/ Öffnen?

bei mir klappt das weitgehend mit dem repaint()-Aufruf, ruhig auch fürs ganze JFrame aufrufen,
nur werden die ScrollBars nicht auf die neue Größe angepasst,
weiß nicht welcher Befehl dafür da ist,
bei mir funktioniert das erneute Setzen des ViewPointViews:

Code:
public class Test3 extends JFrame {

	static Test3 fenster;
	String dateiname;
	BufferedImage bild;
	BildLeinwand leinwand;

	JMenuBar menuleiste = new JMenuBar();

	JMenu menuDatei = new JMenu();
	JMenuItem menuDateiOeffnen = new JMenuItem();
	JScrollPane mainPanel;

	public Test3() {

		super();

		this.setTitle("Test");
		this.getContentPane().setBackground(Color.LIGHT_GRAY);

		menuDatei.setText("Datei");
		menuDateiOeffnen.setText("Öffnen");
		menuDateiOeffnen.addActionListener(new MenuAction());
		menuDatei.add(menuDateiOeffnen);
		menuleiste.add(menuDatei);
		this.setJMenuBar(menuleiste);

		// Eine Leinwand anlegen
		leinwand = new BildLeinwand();
		mainPanel = new JScrollPane(leinwand);

		this.getContentPane().add(mainPanel, BorderLayout.CENTER);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

	}

	protected void bildOeffnen() {

		JFileChooser oeffnenDialog = new JFileChooser();
		oeffnenDialog.setCurrentDirectory(new File("."));
		oeffnenDialog.setAcceptAllFileFilterUsed(false);

		if (JFileChooser.APPROVE_OPTION == oeffnenDialog.showOpenDialog(this)) {

			this.dateiname = oeffnenDialog.getSelectedFile().getPath();

			try {

				bild = ImageIO.read(new File(dateiname));
				mainPanel.setViewportView(leinwand);

			} catch (Exception e) {
				dateiname = null;
				bild = null;
				e.printStackTrace();
			}

		}

	}

	public static void main(String[] args) {

		Test3 fenster = new Test3();
		fenster.setSize(300, 300);
		fenster.setLocation(200, 300);
		fenster.setVisible(true);

	}

	class BildLeinwand extends JPanel {

		public void paintComponent(Graphics g) {
			super.paintComponent(g);

			if (bild != null) {
				g.drawImage(bild, 0, 0, bild.getWidth(), bild.getHeight(), this);
			}
		}

		public Dimension getPreferredSize() {
			if (bild != null) {
				return new Dimension(bild.getWidth(), bild.getHeight());
			} else {
				return new Dimension(350, 350);
			}
		}
	}

	class MenuAction implements ActionListener {

		public void actionPerformed(ActionEvent e) {
			if (e.getSource() == menuDateiOeffnen) {
				bildOeffnen();
			}
		}
	}
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Soloeco JList/DefaultListModel: Wie kann ich ein Panel hinzufügen? Java Basics - Anfänger-Themen 1
P Herausfinden, auf welchem Panel des CardLayouts man gerade ist? Java Basics - Anfänger-Themen 12
CptK Interface 2 von einander unabhängige Frames mit Panel gleichzeitig nutzen Java Basics - Anfänger-Themen 66
O Klappt nicht: Ein Panel neu zeichnen Java Basics - Anfänger-Themen 3
L Panel verkleinert sich unerklärlicherweise Java Basics - Anfänger-Themen 7
N Mehrere Forms auf einem Panel Java Basics - Anfänger-Themen 6
M Panel erstellen, welches ein Control erhält. Ausgabe soll über einen Stream erfolgen. Java Basics - Anfänger-Themen 0
J Panel auf Hintergrund Java Basics - Anfänger-Themen 5
J Panel und Menü Java Basics - Anfänger-Themen 6
S timer funktion mit javax panel Java Basics - Anfänger-Themen 3
D Hintergrund jpg auf Panel Java Basics - Anfänger-Themen 3
D Bild zum Panel hinzufügen Java Basics - Anfänger-Themen 8
A Frage zu einer Methode - Panel arbeitet nicht ordnungsgemäß Java Basics - Anfänger-Themen 2
F Neues Panel und Button unsichtbar Java Basics - Anfänger-Themen 10
D Panel sichtbar/unsichtbar machen im ActionListener Java Basics - Anfänger-Themen 3
S Image in Panel laden Java Basics - Anfänger-Themen 12
D Panel von unten herausfahren Java Basics - Anfänger-Themen 2
S mehrere Rechtecke in ein Panel Java Basics - Anfänger-Themen 2
L panel verschmiert beim draggen! Java Basics - Anfänger-Themen 2
J Panel + Label anzeigen - Ich kriege es nicht hin Java Basics - Anfänger-Themen 3
S Swing, Gridbaglayout Panel in Panel;funzt nicht!! Java Basics - Anfänger-Themen 3
S Swing, Panel über Hintergrundbild!! Java Basics - Anfänger-Themen 6
C Panel und Label überdecken sich Java Basics - Anfänger-Themen 2
J JLabels in Panel Aktualisieren Java Basics - Anfänger-Themen 5
H Panel in Variable setzen möglich? Java Basics - Anfänger-Themen 10
M Spezielles Panel fade in / out Java Basics - Anfänger-Themen 5
C Panel Hintergrundfarbe per AdjustmenListenmer ändern Java Basics - Anfänger-Themen 4
D GUI: Panel in Panel laden Java Basics - Anfänger-Themen 10
R Eingefärbtes Panel wird in Frame nicht angezeigt Java Basics - Anfänger-Themen 10
eLogic Panel hinzufügen Java Basics - Anfänger-Themen 4
Nic.o Panel während Ladevorgang einblenden Java Basics - Anfänger-Themen 12
B PacMan: Panel aktualisieren Java Basics - Anfänger-Themen 2
D Eingabe aus Dialog, Ergebnis an Panel Java Basics - Anfänger-Themen 2
Z JFileChooser/ Panel + Menüproblem Java Basics - Anfänger-Themen 3
J GridLayout auf Panel zentrieren? Java Basics - Anfänger-Themen 2
G Aus eigenem Panel dieses Löschen Java Basics - Anfänger-Themen 2
J Panel-übergreifende Kommunikation Java Basics - Anfänger-Themen 3
M Panel ersetzen funktioniert nicht Java Basics - Anfänger-Themen 2
M BorderLayout zickt! Ein Panel versteckt das andere! Java Basics - Anfänger-Themen 6
K Panel fixieren und nicht zentrieren Java Basics - Anfänger-Themen 2
F Zeichnen auf einem Panel Java Basics - Anfänger-Themen 2
N Panel entfernen Java Basics - Anfänger-Themen 2
B Zugriff auf JTextPane in einem anderen Panel Java Basics - Anfänger-Themen 2
H TabbedPane: wie schalte ich auf ein bestimmtes panel? Java Basics - Anfänger-Themen 2
G Bild in Panel oder canvas einfügen Java Basics - Anfänger-Themen 3
kulturfenster Panel in Frame integrieren Java Basics - Anfänger-Themen 5
H Paint Methode malt nicht im Panel Java Basics - Anfänger-Themen 4
J Probleme mit Visual Editor Komponenten auf Panel legen Java Basics - Anfänger-Themen 4
M Panel ausgrauen (disable) Java Basics - Anfänger-Themen 2
K Component vom einem Panel löschen ? Java Basics - Anfänger-Themen 14
C Panel wird nicht übermalt Java Basics - Anfänger-Themen 6
P Swing Textarae so groß wie Panel? Java Basics - Anfänger-Themen 2
G Rekursives aufrufen führt zu StackOverflowError Panel durchl Java Basics - Anfänger-Themen 5
T JMenuItems werden von Komponente in Panel verdeckt Java Basics - Anfänger-Themen 11
D Event mit n-Button8s) von einem Panel Java Basics - Anfänger-Themen 9
Z Wie übergebe ich einer MyFrame-Klasse ein Panel? Java Basics - Anfänger-Themen 8
A g=panel.getGraphics() im Thread => Nullpointer Java Basics - Anfänger-Themen 9
S Bilder bleiben auf einem Panel nicht gezeichnet Java Basics - Anfänger-Themen 6
L Java Control Panel Java Basics - Anfänger-Themen 5
A Swing Schriftfarbe für komplettes Panel ändern Java Basics - Anfänger-Themen 2
G Panel Java Basics - Anfänger-Themen 4
B Kann man mit XMl ein Panel erstelln Java Basics - Anfänger-Themen 2
R Einfügen einer eigenen methode in ein Panel Java Basics - Anfänger-Themen 5
E Komponenten auf Panel positionieren Java Basics - Anfänger-Themen 3
G aus Thread auf Panel zeichnen Java Basics - Anfänger-Themen 22
G Text in Panel anordnen Java Basics - Anfänger-Themen 6
M Ein Panel in ein Panel laden Java Basics - Anfänger-Themen 3
S Graphic im Panel änder durch JSlider Java Basics - Anfänger-Themen 2
P Ball auf Panel hüpfen lassen Java Basics - Anfänger-Themen 4
T Panel entfernen Java Basics - Anfänger-Themen 4
T Panel entfernen, neues hinzufügen Java Basics - Anfänger-Themen 2
A Probleme mit Panel und GUI Java Basics - Anfänger-Themen 4
D Warum färbt er das unter Panel nicht ein? Java Basics - Anfänger-Themen 3
V Panel durchsichtig machen Java Basics - Anfänger-Themen 4
D Desktop auf nem Panel Java Basics - Anfänger-Themen 6
B Panel bei Mausklick färben Java Basics - Anfänger-Themen 3
S Keyevent in Panel Java Basics - Anfänger-Themen 5
C Add / Remove Panel Java Basics - Anfänger-Themen 2
C zweites Panel auf Knopfdruck anzeigen Java Basics - Anfänger-Themen 2
O größe von panel mit gridlayout Java Basics - Anfänger-Themen 9
G Panel in Methode erneut aufrufen Java Basics - Anfänger-Themen 5
B Panel mit Radiobuttons als eigene Klasse Java Basics - Anfänger-Themen 4
G aktueller Panel, der in BorderLayout.SOUTH angeordnet ist Java Basics - Anfänger-Themen 11
A Panel und getContentPane() ? Java Basics - Anfänger-Themen 2
S panel leeren Java Basics - Anfänger-Themen 2
S Panel / setbounds Java Basics - Anfänger-Themen 3
R Image lässt sich nicht in ein Panel einfügen Java Basics - Anfänger-Themen 3
G Paint auf Panel Java Basics - Anfänger-Themen 4
G JPG in einem Panel anzeigen lassen Java Basics - Anfänger-Themen 3
A Panel überschreiben Java Basics - Anfänger-Themen 4
X GUI: neues Panel in einer Applikation anzeigen lassen Java Basics - Anfänger-Themen 2
G Panel in Container einfügen Java Basics - Anfänger-Themen 7
N need help in panel Java Basics - Anfänger-Themen 8
B Panel mit Bild wird nicht angzeigt Java Basics - Anfänger-Themen 16
M Inhalt Panel,Frame löschen Java Basics - Anfänger-Themen 8
S Image von einem Panel erzeugen! Java Basics - Anfänger-Themen 2
A Komponenten im Panel ausrichten Java Basics - Anfänger-Themen 5
G Panel zur Laufzeit laden/entladen Java Basics - Anfänger-Themen 2
S Neues Fenster/Panel nach Knopfdruck Java Basics - Anfänger-Themen 2
C Grafik in einem Panel als Bild exportieren Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben