С вашего вопроса трудно понять, что именно вы пытаетесь достичь. Вы просто хотите изменить цвет фона фрейма или выполнить какую-то пользовательскую покраску ???
Этот Graphics g = frame.getGraphics()
никогда не является хорошей идеей. Помимо того факта, что возможно, что getGraphics
может вернуться null
, графика не имеет аналогов в Java, что означает, что графический контекст, который вы используете для рисования, может меняться между циклами рисования, вы никогда не должны полагаться на него или поддерживать ссылку на него.
Помимо ошибочного подхода, JFrame
содержит числовые компоненты, которые отображаются поверх него, поэтому даже если этот метод работал, вы не увидите никакой разницы, потому что кадр фактически покрывается другими компоненты (JRootPane
и его содержимое)
Настраиваемая окраска должна выполняться в одном из методов краски Component
.
В следующем примере используется ряд методов для изменения и обновления содержимого фрейма.
Во-первых, он заменяет панель контента с нашего компонента. Это всегда необходимо, но поскольку я выполняю обычную покраску на кадре, это было проще всего. Я мог бы просто добавить PaintPane
к кадру, чтобы получить аналогичный результат.
Во-вторых, я использую setBackground
, чтобы изменить фон моего компонента.
В-третьих, я переопределяю paintComponent
, чтобы выполнить пользовательскую покраску на моем компоненте.
public class SimplePaint01 {
public static void main(String[] args) {
new SimplePaint01();
}
public SimplePaint01() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.setContentPane(new PaintPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class PaintPane extends JPanel {
private int angle = 0;
private Rectangle shape = new Rectangle(0, 0, 100, 100);
public PaintPane() {
setBackground(Color.RED);
Timer timer = new Timer(16, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
angle += 5;
repaint();
}
});
timer.setRepeats(true);
timer.setCoalesce(true);
timer.start();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
int x = ((getWidth() - shape.width)/2);
int y = ((getHeight() - shape.height)/2);
shape.x = x;
shape.y = y;
g2d.setColor(Color.BLUE);
g2d.setTransform(AffineTransform.getRotateInstance(Math.toRadians(angle), x + (shape.width/2), y + (shape.height/2)));
g2d.fill(shape);
g2d.dispose();
}
}
}
Литература: [Выборочная живописи] (http://docs.oracle.com/javase/tutorial/uiswing/painting/), [Параллелизм в свинг] (http://docs.oracle.com/javase /tutorial/uiswing/concurrency/index.html). – ignis
1. Не вызывайте методы AWT или Swing из потоков, отличных от Thread Dispatch Thread. 2. Подкласс JPanel (не JFrame) и переопределить paintComponent() для вызова super.paintComponent(), а затем выполнить собственный чертеж. – ignis
Вы можете использовать «frame.getContentPane(). SetBackground (Colour.BLUE)». Это экономит ненужный прямоугольник. – cworner1