Rysowanie na layoucie

0

Mam następujący kod:

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

import javax.swing.JFrame;
import javax.swing.JPanel;


public class Main extends JFrame {

	private JPanel contentPane;

	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Main frame = new Main();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	public Main() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		getSize(new Dimension(300, 300)	);
		contentPane = new JPanel();
		setContentPane(contentPane);
		contentPane.setLayout(new BorderLayout(0, 0));
		
		JPanel panel1 = new JPanel();
		contentPane.add(panel1, BorderLayout.NORTH);
		
		Rysowanie rysowanie = new Rysowanie();
		panel1.add(rysowanie);
	}
}

class Rysowanie extends JPanel {
	public Rysowanie(){
		this.setSize(new Dimension(300, 300));
	}
	public void paint(Graphics g){
		g.clearRect(0, 0, getSize().width, getSize().height);
		g.fillRect(0, 0, 100, 100);
	}
}


Jak widać tworzę jeden wielki panel o layoucie "BorderLayout". Następnie dodaję do niego panel Rysowanie. Powinien on wyświetlić kwadrat o wymiarach 100x100px. Tak jednak się nie dzieje. Panel ten jest tak jakby przycięty. Jak sprawić, by panel Rysowanie był wyświetlany w pełnych wymiarach?

1

Po co Ci wywołanie getSize()?
Masz dwa błędy: brak pack() i setSize() zamiast setPreferredSize().

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
 
import javax.swing.JFrame;
import javax.swing.JPanel;
 
 
public class Main extends JFrame {
 
        private JPanel contentPane;
 
        public static void main(String[] args) {
                EventQueue.invokeLater(new Runnable() {
                        public void run() {
                                try {
                                        Main frame = new Main();
                                        frame.setVisible(true);
                                } catch (Exception e) {
                                        e.printStackTrace();
                                }
                        }
                });
        }
 
        public Main() {
                setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                getSize(new Dimension(300, 300)        );
                contentPane = new JPanel();
                setContentPane(contentPane);
                contentPane.setLayout(new BorderLayout(0, 0));
 
                JPanel panel1 = new JPanel();
                contentPane.add(panel1, BorderLayout.NORTH);
 
                Rysowanie rysowanie = new Rysowanie();
                panel1.add(rysowanie);
                pack();
        }
}
 
class Rysowanie extends JPanel {
        public Rysowanie(){
                this.setPreferredSize(new Dimension(300, 300));
        }
        public void paint(Graphics g){
                g.clearRect(0, 0, getSize().width, getSize().height);
                g.fillRect(0, 0, 100, 100);
        }
1

Jeżeli chcesz mieć okno zawierające w sobie panel o rozmiarze 300x300px (naturalnie okno będzie trochę większe, bo obramowanie itd.) to robisz to tak:

  • przy tworzeniu okna nie używasz metody setSize()
  • dodajesz panel który w konstruktorze ma setPreferredSize(new Dimension(300, 300));
  • na końcu w oknie wywołujesz pack() a potem setVisible(true);
0
bo napisał(a)

Po co Ci wywołanie getSize()?

To jest mój błąd. Prawdopodobnie chodziło mi wtedy o setSize(), ale pomyliłem to z getSize().

Pomogliście, działa jak należy. Dziękuję bardzo.
Powiedzcie mi tylko jeszcze jaka jest różnica między setPreferredSize() a setSize() i którego raczej powinno się używać? A może to zależy od sytuacji..?

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