Я все еще участвую в графическом интерфейсе, все еще испытывая некоторые проблемы с головою вокруг потоков:/
Im делает этот GUI, в котором есть 2 круга, один большой (100x100) и один маленький (50x50). Маленький будет идти к краю большого круга и в течение 0,5 секунд, маленький круг пойдет в центр и что он, когда пользователь должен щелкнуть. Всякий раз, когда пользователь нажимает, когда круг находится посередине, пользователь оценивает. Единственная проблема, с которой я сталкиваюсь, заключается в том, что круг не движется, так как я подозреваю, что это что-то связано с моими потоками, следовательно, причина, по которой im использует потоки, чтобы узнать, как их использовать.
графический интерфейс пользователя
public class gui extends JPanel implements MouseListener,
Runnable {
Thread t = new Thread();
int score = 0;
int rnd;
static final int smallcircleposx = 75;
static final int smallcircleposy = 75;
int circleposx = 75;
int circleposy = 75;
int mousex, mousey;
Random random = new Random();
public gui() {
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.BLUE);
g.fillOval(50, 50, 100, 100);
g.setColor(Color.RED);
g.fillOval(circleposx, circleposy, 50, 50);
}
// THREAD FOR MOVING THE CIRCLE
public void run() {
rnd = random.nextInt(999);
if (rnd % 5 == 0) {
circleposx = circleposx + 25;
} else if (rnd % 4 == 0) {
circleposx = circleposx - 25;
} else if (rnd % 3 == 0) {
circleposy = circleposy + 25;
} else {
circleposy = circleposy - 25;
}
try {
Thread.sleep(500);
circleposx = smallcircleposx;
circleposy = smallcircleposy;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void mouseClicked(MouseEvent m) {
if (circleposx == smallcircleposx && circleposy == smallcircleposy) {
score++;
}
}
ГЛАВНЫЙ
public class main {
public static void main(String[] args) {
JFrame frame = new JFrame("Circle enlarger");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400,400);
frame.setVisible(true);
gui co = new gui();
frame.add(co);
frame.addMouseListener(co);
Thread x = new Thread(new gui());
x.start();
}
}
Я знаю, что я не использовал все методы mouselistener
.
Используйте MouseAdaptor
вместо MouseListener
если вы не переопределяете все методы.
Не красьте непосредственно над верхней частью контейнера уровня, такие как JFrame
, JApplet
вместо этого использовать JPanel
Не используйте Thread.sleep()
который когда-нибудь повесит все приложение swing, вместо этого попробуйте использовать Swing Timer, который наиболее подходит для приложения swing.
Подробнее о том, как использовать качающиеся таймеры
Не забудьте вызвать super.paintComponent()
в переопределенном методе paintComponent()
.
Call frame.setVisible(true)
в конце после добавления всех компонентов.
Используйте frame.pack()
вместо frame.setSize()
который соответствует компонентам в соответствии с предпочтительным размером компонента.
Переопределите getPreferredSize()
чтобы установить предпочтительный размер JPanel
в случае пользовательской покраски.
Используйте SwingUtilities.invokeLater() или EventQueue.invokeLater(), чтобы убедиться, что EDT инициализирован правильно.
Прочитайте больше
Это стоит прочитать Урок: Выполнение пользовательской живописи
Пример кода: (измените его в соответствии с вашей собственной живописью)
private Timer timer;
...
// 500 Milli-seconds
timer = new javax.swing.Timer(500, new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
// change the coordinate
panel.repaint();
if (condition) {
timer.stop(); // you can stop the timer anytime
}
}
});
timer.setRepeats(true); // you can turn-off the repeatation
timer.start();
public static void main(String args[]) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
// Initialize the UI
}
});
}
class MyJPanel extends JPanel {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
...
}
@Override
public Dimension getPreferredSize() {
return new Dimension(..., ...);
}
}