paint - JPanel Problem

marcbielik

Grünschnabel
Hallo zusammen

Ausgangslage:
Das GUI meiner Application sollte folgendermassen aussehen: ein Grosses JPanel (wo Informationen drauf stehen) und einige kleinere JPanels, welche ich darauf platziere. Eines dieser JPanels wird einige paintComponenten beinhalten.

Ich habe folgendes Problem:
1. Wie mache ich es, dass meinen JPanel mit den paint-Elementen über diesem grossem JPanel liegt?
2. Wie kann ich die Grösse diese paint JPanels definieren?

Wascheinlich sind das für einen Experten relativ simple Fragen, aber ich wäre trotzem sehr dankbar für die Antworten. THX!

Gruss marc


PS: Hier ist noch ein Demo Code an welchem ich dieses Problem zu verstehen/lösen versuche.



import java.awt.*;
import java.awt.Graphics;
import javax.swing.*;


public class DrawFirstLine
{
public static void main( String[] args )
{
JFrame f = new JFrame();
JPanel marc = new JPanel();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE );
f.setBounds(120,100,900,850);
f.setSize( 600, 600 );
f.add(marc); // entweder sehe ich das marc-Panel oder das DrawPanel -> marc-Panel
f.add( new DrawPanel());
// f.add(marc); // entweder sehe ich das marc-Panel oder das DrawPanel -> DrawPanel
marc.setBackground(Color.white);
f.setVisible( true );
}
}


class DrawPanel extends JPanel {

protected void paintComponent( Graphics g ) {
super.paintComponent( g );
g.drawLine(10, 10, 100, 50 );
g.drawRect(20, 40, 20, 20);
g.drawOval(30, 30, 20, 20);
repaint();
}
}
 
Hi,

bin selbst noch nicht lange am java Programmieren, aber denke so müsste es gehen. Es ist ein wenig strukturierter als dein Code. Ich deklariere erst die variabeln und mit den getJ..() inertialisiere ich die dann.



package src;

import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

import java.awt.BorderLayout;
import java.awt.Rectangle;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.border.BevelBorder;
import java.awt.Color;


public class GuckstDu{

//deklarieren der elemente
private JFrame jFrame = null; // @jve:decl-index=0:visual-constraint="10,10"
private JPanel jPanel0 = null;
private JPanel jPanel1 = null;
private JLabel jLabelInformation1 = null; // @jve:decl-index=0:
private JButton jButton = null;
private MyDraw g = new MyDraw(); // @jve:decl-index=0:

// das frame wird initialisiert
private JFrame getJFrame() {
if (jFrame == null) {
jFrame = new JFrame();
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setSize(418, 270);
jFrame.setContentPane(getJPanelInfo());
jFrame.setTitle("Eine Gui für MarcBiliek");
}
return jFrame;
}


//hier wird das jPanelInfo, das "große" initialisiert. hier siehst du auch, das ich
//das kleine panel1 einfach ans große panel panelinfo ge-added habe
private JPanel getJPanelInfo() {
if (jPanel0 == null) {
jLabelInformation1 = new JLabel();
jLabelInformation1.setBounds(new Rectangle(19, 26, 279, 16));
jLabelInformation1.setText("This is a simple information on the bigPane");
jPanel0 = new JPanel();
jPanel0.setLayout(null);
jPanel0.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
jPanel0.add(getJPanel1(), null);
jPanel0.add(jLabelInformation1, null);
jPanel0.add(getJButton(), null);
}
return jPanel0;
}

//hier das kleine panel, an dem ich die graphic einheit hänge
private JPanel getJPanel1() {
if (jPanel1 == null) {
jPanel1 = new JPanel();
jPanel1.setLayout(new BorderLayout());
jPanel1.setBorder(BorderFactory.createLineBorder(Color.black, 3));
jPanel1.setBounds(new Rectangle(20, 125, 370, 97));
jPanel1.add(g);
}
return jPanel1;
}


//noch ein button wenn du magst...
private JButton getJButton() {
if (jButton == null) {
jButton = new JButton();
jButton.setBounds(new Rectangle(18, 49, 183, 19));
jButton.setText("und noch ein Button dazu");
jButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
// Hier passiert was wenn du auf den Button drückst
System.out.println("Button pressed, blök");

}
});
}
return jButton;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
GuckstDu application = new GuckstDu();
application.getJFrame().setVisible(true);
}
});
}


}




und dann noch die Klasse MyDraw, am besten in eier extra MyDraw.java file packen!:


package src;

import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.BorderFactory;
import javax.swing.JPanel;


public class MyDraw extends JPanel {
public MyDraw() {
this.setPreferredSize(new Dimension(100, 100));
//this.setBorder(BorderFactory.createLoweredBevelBorder());
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawLine(50, 50, 20, 20);
}
}



Vielleicht hilft dir das ja ohne weitere Kommentare meinerseits weiter. Wenn nicht, frag nochmal ;)

lg Rene
 
Zuletzt bearbeitet:
ich pack hier mal noch die files als .txt in den anhang. einfach in .java umbenennen und ggf. in dein package umbenennen. Dazu noch wie es bei mir aussieht..


Lg, rene
 

Anhänge

  • GuckstDu.txt
    2,5 KB · Aufrufe: 132
  • MyDraw.txt
    464 Bytes · Aufrufe: 133
  • soSiehtsAus.JPG
    soSiehtsAus.JPG
    13,4 KB · Aufrufe: 223
He rene

Danke vielmals für deine wertvollen Inputs. Ich habe mir deinen Code angeschaut und habe dann einige Änderungen gleich für meinen Code übernehmen können...

Wirklich gut und übersichtlich struckturiert dein Code. THX!

Jetzt habe ich dieses Problem (dank dir) lösen können und schon habe ich ein weiteres...

Ist es möglich die Graphics der paintComponent-Methode verschieden zu benennen?
(zbsp. : ein Kreis -> k und eine Linie -> g)
Ich will die componenten die erzeutgt habe danach auch ansprechen und ändern können.
Oder soll ich das Panel stets repainten, wenn ich Änderungen vorgenommen habe?

Hoffentlich kannst du mir auch da helfen... ;-)

Bessten Dank
marc
 
ganz schnelle antwort:
da kann ich dir nicht helfen.
ich habe noch nie mit graphics gearbeitet und bis auf das codebeispiel das ich schnell runtergeschrieben habe auch nix mit graphics gemacht.

Ich empfehle dir, für diese Frage einen neuen Thread aufzumachen, da es sehr gut sein kann, das sich nicht mehr viele diesen anschauen, weil sie denken das dir schon geholfen wurde, und sie nicht alles bis zum ende durchlesen. Muss aber auch nicht sein ;)

Lg, René
 
He rene

Ja ich könnte einen neuen Thread aufmachen und diese Thema posten...

Aber beim programieren heute Nachmittag ist mir aufgefallen, dass ich alle "Graphiken" sequenziell (nacheinander) kreieren kann und sie dann gleich ansprechen kann. Falls ich dann eine Änderung machen will, dann repainte ich das ganze Panel mit den neuen Graphik-Eigenschaften und habe es somit gar nicht nötig im nachhinein die einzelnen Graphik-Elemente anzusprechen.

Gemäss dem Motto: "Problemen aus dem Weg gehen, statt sie vom Grund auf zu lösen..."

Nochmals Danke für deine Mitarbeit und bis bald mal
bei einem weiteren Problem... ;-)

Lg marc
 
Zurück