Rysowanie na panelu i dziwnie rozmieszczające się komponenty

0

Witajcie, mam pewien problem, z którym nie mogę sobie poradzić, mianowicie:

  • po naciśnięciu przycisku na panelu jest rysowane kilka figur (nie ważne jakich, nie ważne co, chodzi o sam fakt rysowania po naciśnięciu)
  • interfejs graficzny składa się z dwóch elementów: panelu i przycisku (to wszystko oczywiście wsadzone w JFrame)

i mam taki problem, po naciśnięciu przycisku wszystko się rysuje, tylko button się duplikuje i wyskakuje w innym miejscu, nieco niżej...
Dlaczego się tak dzieje? Żeby nie być gołosłownym podrzucam kod:

package dom;

import java.awt.Color;

public class Tstt {

	public static JFrame frame;
	public static int a = 0;
	public static mojP panel = new mojP();
	
	public static void main(String[] args) 
	{
		EventQueue.invokeLater(new Runnable() 
		{
			public void run() 
			{
				try 
				{
					Tstt window = new Tstt();
					window.frame.setVisible(true);
				} 
				catch (Exception e) 
				{
					e.printStackTrace();
				}
			}
		});
	}

	public Tstt() 
	{
		initialize();
	}

	private void initialize() 
	{
		frame = new JFrame();
		frame.setBounds(100, 100, 450, 300);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		JButton btnNewButton = new JButton("New button");
		btnNewButton.addMouseListener(new MouseAdapter() 
		{
			@Override
			public void mouseClicked(MouseEvent e) 
			{
				Tstt.a = 1;
				panel.repaint();
			}
		});
		
		
		GroupLayout groupLayout = new GroupLayout(frame.getContentPane());
		groupLayout.setHorizontalGroup(
			groupLayout.createParallelGroup(Alignment.LEADING)
				.addComponent(btnNewButton, GroupLayout.DEFAULT_SIZE, 434, Short.MAX_VALUE)
				.addComponent(panel, GroupLayout.DEFAULT_SIZE, 434, Short.MAX_VALUE)
		);
		groupLayout.setVerticalGroup(
			groupLayout.createParallelGroup(Alignment.LEADING)
				.addGroup(groupLayout.createSequentialGroup()
					.addComponent(btnNewButton, GroupLayout.PREFERRED_SIZE, 49, GroupLayout.PREFERRED_SIZE)
					.addPreferredGap(ComponentPlacement.RELATED)
					.addComponent(panel, GroupLayout.PREFERRED_SIZE, 207, GroupLayout.PREFERRED_SIZE))
		);
		frame.getContentPane().setLayout(groupLayout);
	}

}

class mojP extends JPanel
{
	Graphics g;

	public void paint(Graphics g)
	{
		if(Tstt.a == 1)
		{
			Insets b = getInsets();
			g.translate (b.left, b.top);
			g.setColor( new Color( 20, 20, 100));
			g.fillRect( 10, 10, 50, 50 );
			g.setColor( Color.green );
			g.fillOval( 100, 50, 20, 20 );
			repaint();
		}
	}
}

Jeśli ktoś powie co robię nie tak, będę wdzięczny...

0

Nigdy nie wywołuj repaint() z metody paint().

0

Ok, ale to nie rozwiązuje mojego problemu.

0

Po rysowaniu daj:

g.translate(-b.left, -b.top)

Musisz przywrócić oryginalny układ współrzędnych.

0

To nic nie da, obojętnie co dam w metodzie paint, nawet:

g.drawRect(100, 100, 100, 100);

to i tak się rozłazi

0

Tego kodu nie można skompilować i przetestować. Co to jest ComponentPlacement?

0

czemu nie da?
to jest kod automatycznie wygenerowany przez WindowBuildera w Eclipse

szlag mnie trafia
jeśli ktoś może to nie musi poprawiać, prosiłbym o jakąś próbkę własnego kodu, co rysuje coś na panelu/canvasie po kliknięciu w przycisk

0

To go skompiluj poleceniem javac.
Pola niepotrzebnie są static, ale już nie zmieniałem.

public class Tstt {
 
        public static JFrame frame;
        public static int a = 0;
        public static mojP panel = new mojP();
 
        public static void main(String[] args) 
        {
                EventQueue.invokeLater(new Runnable() 
                {
                        public void run() 
                        {
                                try 
                                {
                                        Tstt window = new Tstt();
                                        window.frame.setVisible(true);
                                } 
                                catch (Exception e) 
                                {
                                        e.printStackTrace();
                                }
                        }
                });
        }
 
        public Tstt() 
        {
                initialize();
        }
 
        private void initialize() 
        {
                frame = new JFrame();
                frame.setBounds(100, 100, 450, 300);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
                JButton btnNewButton = new JButton("New button");
                btnNewButton.addMouseListener(new MouseAdapter() 
                {
                        @Override
                        public void mouseClicked(MouseEvent e) 
                        {
                                Tstt.a = 1;
                                panel.repaint();
                        }
                });
 
                frame.setLayout(new BorderLayout(2,2));
                frame.add(panel,BorderLayout.CENTER);
                frame.add(btnNewButton,BorderLayout.SOUTH);
        }
 
}
 
class mojP extends JPanel
{
        Graphics g;
 
        public void paint(Graphics g)
        {
                if(Tstt.a == 1)
                {
                        Insets b = getInsets();
                        g.translate (b.left, b.top);
                        g.setColor( new Color( 20, 20, 100));
                        g.fillRect( 10, 10, 50, 50 );
                        g.setColor( Color.green );
                        g.fillOval( 100, 50, 20, 20 );
                }
        }
}
0

Twoj kod rowniez powoduje blad, ktory mam i ja...

1

Zachęcam wszystkich do przetestowania kodu z mojego poprzedniego postu. U mnie kod działa poprawnie na XP SP3, (java 6 i 7). Działa niepoprawnie na 7 (java 6 i 7).

0

super, dziękuję

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