Я изучаю Java и Swing через книгу (Filthy Rich Clients, не процитировать ее), и я попробовал следующий короткий пример кода для Linux (Oracle JDK 8):
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class OvalComponent extends JComponent {
public void paintComponent(Graphics g) {
g.setColor(getBackground());
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(Color.GRAY);
g.fillOval(0, 0, getWidth(), getHeight());
}
private static void createAndShowGUI() {
JFrame f = new JFrame("Oval");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(200, 200);
f.add(new OvalComponent());
f.setVisible(true);
}
public static void main(String args[]) {
Runnable doCreateAndShowGUI = new Runnable() {
public void run() {
createAndShowGUI();
}
};
SwingUtilities.invokeLater(doCreateAndShowGUI);
}
}
Когда я запускаю этот код, я странно наблюдаю следующий «артефакт» на границе JFrame
:
Этот «артефакт» остается при перетаскивании окна, но исчезает при его изменении. Я хотел бы понять, почему у меня такое странное поведение в Linux. Это присуще Linux (в Windows 7 я не обнаружил артефактов) и что нужно / можно сделать, чтобы исправить эту «ошибку»?
Я также заметил, что простой вызов super.paintComponent(Graphics g);
только в начале paintComponent
метода решает проблему. Но, что очень любопытно, авторы книги утверждают, что в данном конкретном случае звонок на super.paintComponent()
не нужен.
Мой главный вопрос: почему я наблюдаю этот черный артефакт в моем окне Java?