#java #graphics #awt #drawstring
#java #графика #awt #drawstring
Вопрос:
Я работаю над простым счетчиком. Моя проблема в том, что метод drawString () рисует новую строку поверх старой. Как очистить старую строку раньше? Код…
package foobar;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;
public class board extends JPanel implements Runnable {
Thread animator;
int count;
public board() {
this.setBackground( Color.WHITE );
count = 0;
animator = new Thread( this );
animator.start();
}
@Override
public void run() {
while( true ) {
count;
repaint();
try {
animator.sleep( 1000 );
} catch ( InterruptedException e ) {}
}
}
@Override
public void paint( Graphics Graphics ) {
Graphics.drawString( Integer.toString( count ), 10, 10 );
}
}
P.S. Я новичок в Java, поэтому, пожалуйста, не бойтесь сказать мне, какие еще вещи я должен исправить в своем коде…
Комментарии:
1. Пытаюсь Java! Хороший выбор 😉 А пока наберитесь терпения. Позже все станет (очень) проще.
Ответ №1:
Несколько проблем в вашем коде:
- У меня нет цикла while (true) или Thread.sleep в графическом интерфейсе Swing. Вместо этого используйте таймер переключения.
- Переопределите paintComponent JPanel, а не его метод рисования.
- Первый вызов в paintComponent (Graphics g) должен быть super.paintComponent(g), чтобы ваша JPanel могла вести домашнее хозяйство и избавиться от старой графики.
Редактировать:
- К сожалению, ваши while (true) и Thread.sleep (…) будут работать, поскольку они находятся в фоновом потоке, но,…
- Thread.sleep является статическим методом и должен вызываться в классе, потоке и
- Я все еще думаю, что таймер Swing был бы более простым способом сделать это.
- Еще проще даже не использовать метод paint или paintComponent, а просто установить текст JLabel для вашего отображения.
например,
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class Board2 extends JPanel {
private static final int TIMER_DELAY = 1000;
private int counter = 0;
private JLabel timerLabel = new JLabel("000");
public Board2() {
add(timerLabel);
new Timer(TIMER_DELAY, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
counter ;
timerLabel.setText(String.format("d", counter));
}
}).start();
}
private static void createAndShowUI() {
JFrame frame = new JFrame("Board2");
frame.getContentPane().add(new Board2());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
createAndShowUI();
}
});
}
}
Ответ №2:
Я думаю, Graphics.clearRect — это то, что вы ищете.
Комментарии:
1. Кит, ты придурок! Это не JComponent, а JPanel. Нет, это супер метод, и он должен быть в paintComponent. Надеюсь, у вас и ваших друзей все идет хорошо. С уважением, Пит
2. @Судно на воздушной подушке, полное угрей: Я согласен с этим. Тем не менее, это хорошая практика для
clearRect
первых шагов, чтобы понять , как все работает.3. @jmendeth: Я не уверен. Это необходимо при создании графики в JComponent, но JPanel сделает это за вас, если вы вызовете метод super, и поэтому я думаю, что лучше всего использовать соответствующий ситуации инструмент. Но я также просто доставлял Киту неприятности, так как не видел его целую вечность (со времен моего старого форума Sun).
4. @HFOE: Привет!!! Давно не видел! Как ни странно, я действительно очень хочу одну из этих . И да, я ВСЕ ЕЩЕ придурок, и мне все еще нужно научиться действительно ЧИТАТЬ вопросы (внимательно)… В мою защиту: AWT — это чистая грязь! (ИМХО), и я купил себе одну из этих (BF MkII)… Ее зовут Бетти, она черная, и она КУСАЕТСЯ!
5. Круто! Сам я хотел бы получить Aston Martin DB6 Volante, как принц Уильям, но моя жена Диана говорит, что это либо машина, либо она. Я обязательно буду скучать по Диане.
Ответ №3:
Я бы сделал это так:
public void paintComponent(Graphics g)
{
super.paintComponent(g);
//draw all the other stuff
}
Ответ №4:
Аааа! Это нормально. Представьте свою панель в виде классной доски. Каждый раз, когда вы хотите перерисовать то, что вы записали, вам придется сначала стереть классную доску.
В Java, как и в графике в целом, все происходит аналогичным образом. В вашем методе рисования сделайте это:
Graphics.clearRect(0,0, getWidth(),getHeight());
//CLEAR the entire component first.
Graphics.drawString(...); //now that the panel is blank, draw the string.
Когда вы сможете лучше справиться с темой, сделайте super.paint(Graphics)
вместо clearRect()
.