Rysowanie w jPanel

0

Jak przerobić poniższy kod, aby rysował w panelu o nazwie "rysunek"?


package funkcje;

import java.awt.Color;

public class Rysowanie extends javax.swing.JPanel{


    public Rysowanie() {
        initComponents();
    }
    @Override
    public void paint(java.awt.Graphics grafika){
        grafika.clearRect(0, 0, getSize().width, getSize().height);
        grafika.setColor(Color.red);
        grafika.fillOval(0, 0, 100, 100);
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        rysowanie = new javax.swing.JPanel();

        rysowanie.setBorder(javax.swing.BorderFactory.createTitledBorder("Rysowanie"));

        javax.swing.GroupLayout rysowanieLayout = new javax.swing.GroupLayout(rysowanie);
        rysowanie.setLayout(rysowanieLayout);
        rysowanieLayout.setHorizontalGroup(
            rysowanieLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 384, Short.MAX_VALUE)
        );
        rysowanieLayout.setVerticalGroup(
            rysowanieLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 276, Short.MAX_VALUE)
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(rysowanie, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(rysowanie, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
    }// </editor-fold>                        
    // Variables declaration - do not modify                     
    private javax.swing.JPanel rysowanie;
    // End of variables declaration                   
}

Bo jak na razie to rysunek tak jakby "zakrywa" mi panel.

0

Na miłość boską, nie używaj generatorów!

Masz schemat i nie grzesz więcej:

public class NazwaPanelu extends JPanel
{
	public NazwaPanelu()
	{
		// Konstruktor
		// Tu iniciujesz sobie zmienne itd.
	}
	
	public void paintComponent(Graphics g)
	{
		super.paintComponent(g); // To czyści panel
		Graphics2D g2 = (Graphics2D)g;
		
		// tutaj wywołujesz funkcje rysujące np. g2.fillRect()
	}
}
0

Nie bardzo rozumiem. Rysujesz w głównym panelu, a nie w tym "rysowanie" to też dzieje się dokładnie to co dziać się powinno. Co powinieneś zrobić? Nauczyć się że nie robi się klas na zasadzie człowiek-orkiestra. Ty wszystko na siłę wepchnąłeś do jednej klasy to i masz taki właśnie efekt. Zrób osobną klasę do:

  • obsługi głownego okna programu, np. dziedziczącą po JFrame
  • obsługi panelu z obrazkiem (mniej więcej to co masz, ale bez tego pola "rysowanie" oraz bez metody initComponenets)
    Następnie wewnątrz głównego okienka utwórz sobie pole gdzie stworzysz obiekt swojego panelu.

A jeśli chcesz używać generatora do GUI to zapomnij o Netbeansie, zainstaluj Eclipse i wtyczkę Google Window Builder, bo ona przynajmniej generuje porządny kod...

0

Dobra, może troszkę inaczej, gdyż za pomocą tamtego przykładu nie do końca jestem w stanie wytłumaczyć o co mi chodzi. Zrobiłem teraz taki oto przykładowy program:

package program;
import java.awt.*;
import javax.swing.*;
public class Program extends JFrame{
    private Container kontener;
    private Rysowanie rysowanie;
    public Program(){
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setSize(200, 200);
        
        kontener = getContentPane();
        rysowanie = new Rysowanie();
        
        rysowanie.setBorder(BorderFactory.createTitledBorder("Tytul ramki"));
        
        kontener.add(rysowanie, BorderLayout.CENTER);
        
    }
    public static void main(String[] args) {
        new Program().setVisible(true);
    }
}
class Rysowanie extends JPanel{
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        g.clearRect(0, 0, getSize().width, getSize().height);
        g.fillOval(0, 0, 100, 100);
    }
}

Od razu będziecie pewnie krzyczeć, po co zrobiłem ten kontener w konstruktorze klasy Program. Ano po to, gdyż zamierzam później do tego okienka dodawać też inne panele.
Ale teraz do rzeczy. Jak widać, zrobiłem obramowanie panelu "rysowanie". Po odpaleniu programu jednak rysunek (w tym wypadku koło) nie wyświetla się w tym obramowaniu, lecz przecina się z nim. Jak zrobić, aby obrazek wyświetlał się w tej ramce, a nie "na niej"?
P.S.
Czy tak napisany program jest choć trochę bardziej "poprawny", ew. optymalny czy jak to tam nazwać..?

I jeszcze jedno: uwazacie ze NetBeans nie jest dobrym środowiskiem? Eclipse jest lepszy..?

0

Ramka jest fragmentem panelu więc jak rysujesz od 0,0 panelu to na nią wchodzisz. Obejmij to jeszcze jednym panelem na przykład ;)

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;

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

public class Program extends JFrame {
    private static final long serialVersionUID = 1L;
    private final Container kontener;
    private final Rysowanie rysowanie;

    public Program() {
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setPreferredSize(new Dimension(200, 200));
        kontener = getContentPane();
        rysowanie = new Rysowanie(100, 100);
        JPanel outerPanel = new JPanel();
        outerPanel.add(rysowanie);
        outerPanel.setBorder(BorderFactory.createTitledBorder("Tytul ramki"));
        kontener.add(outerPanel, BorderLayout.CENTER);

        this.pack();
    }

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

class Rysowanie extends JPanel {
    private static final long serialVersionUID = 1L;
    private final int width;
    private final int height;

    public Rysowanie(int w, int h) {
        width = w;
        height = h;
        this.setPreferredSize(new Dimension(width, height));
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.clearRect(0, 0, width, height);
        g.fillOval(0, 0, width, height);
    }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1