Błędne wyświetlanie przycisków przy użyciu swinnga

0

Mam dziwny przypadek w prostym programie z dwoma przyciskami:
Załącznik "test"
A efekt jakiego się spodziewam to:
Załącznik "test2"

Nie wiem czemu wyświtla mi się w pewnym sensie drugi raz ten sam przycisk (którego nie da się użyć/nacisnąć). Raz wyświetla mi się poprawnie a czasami z tym dodatkowym przyciskiem.
Mój kod:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.border.Border;

public class Okno 
{

	JFrame ramka;
	JButton przycisk1, przycisk2;
	
	public static void main(String[] args) 
	{
		Okno okno1 = new Okno();
		okno1.doIt();
	}

	public void doIt()
	{
		ramka = new JFrame("Ramka testowa");
		ramka.setVisible(true);
		ramka.setSize(300, 300);
		ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		OknoPanel op1 = new OknoPanel();
		
		przycisk1 = new JButton("EXIT");
		przycisk1.addActionListener(new ActionListener() 
		{
			public void actionPerformed(ActionEvent e) 
			{
				System.exit(0);
			}
		});
		
		przycisk2 = new JButton("OK");
		przycisk2.addActionListener(new ActionListener() 
		{
			public void actionPerformed(ActionEvent e) 
			{
				przycisk1.setText("test");
				ramka.repaint();
			}
		});
		
		ramka.getContentPane().add(BorderLayout.EAST, przycisk1);
		ramka.getContentPane().add(BorderLayout.WEST, przycisk2);
		ramka.getContentPane().add(BorderLayout.CENTER, op1);
	}
	
}
import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JPanel;

public class OknoPanel extends JPanel
{
	int zmienna1, zmienna2;
	public void paintComponent(Graphics g)
	{
		g.setColor(Color.BLUE);
		g.fillRect(zmienna1, zmienna2, 50, 50);
			zmienna1 ++;
			zmienna2 ++;

	}
}
1

w OknoPanel w paintComponent dorzuć na początku linijkę.

super.paintComponent(g);
0

Co wymusza takie rozwiązanie? Czemu musze się odwołać do metody z klasy JPanel?
Nigdzie nie znalazłem takiej informacji w książce z której korzystam (ale sam przykład też zmodyfikowałem).

1

W zasadzie to nie musisz.
W metodzie paint będzie odmalowane tylko to co tam jest. A to oznacza, przy pierwszym malowaniu na ekran cały ten panel nie jest malowany. Jest rysowany tylko niebieski prostokąt - reszta to śmieci.
(które z różnych wzglęów przypadkowo wyglądają jak dopiero co namalowany przycisk).
Zamiast tego super.paintComponent możesz też odmalować na szaro całe tło.

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