Grafiken zeichen im ScrollPane

melmager

Erfahrenes Mitglied
Als Quelle nutze ich Java ist eine Insel - aber das Buch hilft mir im Moment nicht weiter

gibts noch ande Bücher online - am besten für swing allein

Die Frage womit ich mich im Moment beschäftige sind:

wenn ich Netbeans unterandrem ein ScrollPane anlege wie schreibe ich da mit meinen Grafikfunctionen (die gut gehen wenn man nur ein fenster hat) rein ?

Java:
class DrawPanel extends JPanel
{
     
  @Override
  protected void paintComponent( Graphics g )
  {
    Graphics2D g2 = (Graphics2D) g;

    super.paintComponent( g );

    this.zeichneNotenzeile(g);
  }

das ist was ich habe und was geht (gekürzt da es nur um den Aufruf geht)

wenn ich eine ScrollPane anlege bekomme ich nur den Code von NetBeans erstellt:

private javax.swing.JScrollPane jScrollPane2;

da fehlt doch ne Function ... wie bei den Listenern z.B. die ich erweitern kann mit meinem Code zum Zeichnen.

zusatzfrage: ich mach zwar eine Scroll Pane um mir nur ein ausschnitt anzeigen zulassen aber wie definiere ich die grösse vom fenster dahinter ?

also scroll fenster ist 400 * 300 aber das fenster in dem ich zeichne soll dann 800 * 300 sein

zusätzlich versuche ich im Moment zu verstehen wie man ein extra Fenster aufmacht - es gibt ein Demo mit AboutBox das über ein Jmenu eintrag geöffnet wird, Noch verstehe ich das nicht. vorallem weil den Code der NetBeans mir anlegt wenn ich ein zusätzliches Item anlege und dazu ein set Acton erstelle, der erzeugte Code anders aus sieht wie der vorgegebene Demo Code :-(
 
Zuletzt bearbeitet:
Hallo melmager,

auf nen JPanel kann man auf jeden Fall zeichnen, wenn das der Inhalt deines JScrollPanes werden sonn, übergiebst du das JPanel-Objekt an Kobnstuktor deines JScrollPanes.
Am besten setzt man größen mit setPrefferedSize(x, y).

http://www.javabuch.de dreht sich zwar nicht nur um Swing, ist aber das zweite bekannte Online-Book.
Mit der gebundenen Version habe ich - abgesehen von Onlne-Tutorials und learning by doing - Java gelernt.

Wenn das zweite Fenster ne art dialo sein soll währe der Code z.B. folgender:
Java:
Object[] nachricht = {"Ein Fehler ist aufgetreten!"};
Object[] optionen = {"OK"};
final JOptionPane optionPane = new JOptionPane(nachricht, JOptionPane.ERROR_MESSAGE, JOptionPane.OK_OPTION, null, optionen, optionen[0]);
JDialog dialog = optionPane.createDialog(deinJFrameObjekt, "Fehler");
dialog.pack();
dialog.show();

Für ein gleichberechtigtes Fenster:
Java:
JFrame win = new JFrame("Der Titel");
win.setSize(200, 100);
win.setVisible(true);

Vielleicht intessiert dich ja auch meine Swing-FAQ (Link in der Signatur)...

Gruß
 
Zuletzt bearbeitet:
Hallo melmager,

auf nen JPanel kann man auf jeden Fall zeichnen, wenn das der Inhalt deines JScrollPanes werden sonn, übergiebst du das JPanel-Objekt an Kobnstuktor deines JScrollPanes.
Am besten setzt man größen mit setPrefferedSize(x, y).

Ich bekomms nicht gebacken

Java:
jScrollPane2 = new javax.swing.JScrollPane();

jScrollPane2.setBackground(resourceMap.getColor("jScrollPane2.background")); // NOI18N

jScrollPane2.setName("jScrollPane2"); // NOI18N

da wird der scrollPane erzeugt

und danach der Jpanel

Java:
jPanelgfx = new javax.swing.JPanel();

jPanelgfx.setBackground(resourceMap.getColor("jPanelgfx.background")); // NOI18N

jPanelgfx.setName("jPanelgfx"); // NOI18N

// Code of sub-components - not shown here

// Layout setup code - not shown here

jScrollPane2.setViewportView(jPanelgfx);
// folgende Zeilen habe ich eingebaut 
jPanelgfx.add(new jcPanelgfx());
jPanelgfx.setVisible( true );

und dat ist die classe

Java:
class jcPanelgfx extends javax.swing.JPanel {
        @Override
        protected void paintComponent( java.awt.Graphics g ) {
           java.awt.Graphics2D g2 = (java.awt.Graphics2D) g;
           super.paintComponent( g );
           g.drawLine(30, 30, 100, 100);
        }
    }

nur zeichen tut er nix
 
Zuletzt bearbeitet:
Hallo,

scroll fenster ist 400 * 300
= JScrollPane?
(oder doch JFrame?)
fenster in dem ich zeichne soll dann 800 * 300
= JPanel?

Der NetBeans-GUI-Designer produziet leider teilweise unleserlichen und zeigt unvollständigen Code, deshalb hier einfach mal ein funktionierender Code der denke ich das tut was du willst:
Java:
import javax.swing.*;
import java.awt.*;

public class Demo {

	public static void main(String[] args){
		try{
		   UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		}
		catch(Exception ex){
		}			
		JFrame win = new JFrame("Demo");
		win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		// Neuer Code
		YourPanel panel = new YourPanel();
		panel.setPreferredSize(new Dimension(800, 300));
		JScrollPane sp = new JScrollPane(panel);
		sp.setPreferredSize(new Dimension(400, 300));
		win.add(sp);
		//

		win.pack();
		win.setVisible(true);
	}

}

// Dein Code
class YourPanel extends JPanel {
    @Override
    protected void paintComponent(Graphics g) {
		Graphics2D g2 = (Graphics2D) g;
		super.paintComponent(g);
		g.drawLine(30, 30, 100, 100);
    }
}
//
 

Anhänge

  • demo.png
    demo.png
    5,8 KB · Aufrufe: 13
Danke für den Code aber ich habe was functoniernes gehabt was auf ein normalen JFrame läuft - es ging tatsächlich drum das in ein bestehendes Projekt, das mit NetBeans erstellt wurde, einzubauen.

ich bin schon mal ein schritt weiter :)

wenn ich in einem listener der auf ein Button reagiert den Code einbaue habe ich meinen Strich auf dem Bildschirm.

Java:
 private void jButtonMidiPortActionPerformed(java.awt.event.ActionEvent evt) {                                                
        // TODO add your handling code here: update Midi Devicelist in jComboMidi
        java.awt.Graphics g = jScrollPane2.getGraphics();
        java.awt.Graphics2D g2 = (java.awt.Graphics2D) g;
        g2.drawLine(20, 20, 100, 100);
        jPanelgfx.paintComponents(g2);

// weiterer Code
}
 
Also zeichen tut er aber es gibt 2 Probleme:

A) der Scrollpane merkt nicht das das Gezeichnete grösser ist wie dat Fenster und blendet daher nicht die Balken ein zum verschieben des Ausschnitts

B) wenn ich das gesamte Fenster der Anwendung die Grösse verändere verschwindet dat gezeichnete - müsste daran liege das PaintCompenents nicht überlagert ist - behaupte ich mal

Ideen ?
 
Zuletzt bearbeitet:
Wenn du dem JPanel gleich am Anfang ne prefferedSize giebst, müsste der JScrollPane das merken.
Ohne sich anfangs auf eine Größe festzulegen, gehts denke ich nicht.
Ist es besonders wichtig, dass der JFrame skalierbar ist, ansonsten einfach:
Java:
jFrame.setResizable(false);
 
Ich habe da ne Kurzanleitung im Netz gefunden -

jetz mal eine generelle Frage ist die JscrollPane das übergeordnete Fensten und darunter ist dann das JPanel
so habe ich es gemacht oder ist das umgekehrt wie in dem Beispiel das ich gefunden haben ?

und ich denke ich muss mit setsize arbeiten um die grösse anzupassen - fragt sich nur wie

Nachtrag:
ich probiere im moment mehrer Varianten durch
kann es sein das ich die grösse eines Jpanels nicht nachträglich ändern kann ?
aber wozu habe ich dann setsize ?
 
Zuletzt bearbeitet:
Also jetzt habe ich was worauf ich aufbauen kann.

jPanel1.setPreferredSize(blattgfx);

geht :)

Also nochmal die Kurzform wie es geht ein Fenster in Net Beans zu erstellen in das man zeichen kann:

1)erstelle ein Jpanel
2)dann in der design ansicht von NetBeans im Navigator Fenster sagen "enclosure in JScrollPane"
3)erstelle eine classe
Java:
public class NotenBlatt extends JPanel {

  ZeichneNote blattgfx = new ZeichneNote();

    @Override
  protected void paintComponent( Graphics g )
  {
    Graphics2D g2 = (Graphics2D) g;
    super.paintComponent( g );
    
    // hier wird gezeichnet   
  }
}

4) im Jpanel "Cutomize Code" anwählen und dort -jPanel1 = new NotenBlatt();- eingeben - den default Code entsprechend abändern
5) dann kann nach dem Zeichnen die Fenstergrösse mit -JPanel1.setPreferredSize- die grösse verändert werden die Scrollbalken werden entsprechend angepasst

ergebniss siehe unten - das unterste fenster mit den Notenlinie
 

Anhänge

  • Bildschirmfoto2.png
    Bildschirmfoto2.png
    19,4 KB · Aufrufe: 15
Zuletzt bearbeitet:
Zurück