Я создаю игру тральщика, и я хочу иметь JTextField, где пользователь вводит свое имя, чтобы его счет был сохранен в файле.
Моя проблема в том, что когда я создаю JTextField и добавляю его в свою Jpanel, он появляется в двух местах. Вот изображение происходящего (https://i.imgur.com/Ao8dRo1.jpg а>)
Это мой упрощенный код. Я считаю, что я не совсем понимаю, как работает механизм графического интерфейса.
GUI.java
public class GUI extends JFrame {
//..
//some variables here
//...
public GUI() {
this.setTitle("Minesweeper Game");
this.setSize(WIDTH, HEIGHT);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
this.setResizable(false);
this.setLayout(null);
//This method does not involve any drawing, it only places data in some arrays that I later use in paintComponent() to draw stuff accordingly to what the data is
setMinefield();
Board board = new Board();
this.setContentPane(board);
Click click = new Click();
this.addMouseListener(click);
}
public class Board extends JPanel {
public void paintComponent (Graphics g) {
//...
//Drawing tiles, smiley, counters
//...
//And now I draw the area for the JTextField, and I also create it and add it in the Jpanel
JTextField textField = new JTextField();
textField.setFont(new Font("Tahoma", Font.PLAIN, 35));
textField.setBounds(290, 80, 135, 40); //<-- This correctly places the textField where I want. The second textField seems to appear in the exact center of the X axis of my window
add(textField); //<-- Adding the textField to the Jpanel
} //End of paintComponent()
}//End of Board class
}//End of GUI class
Main.java
public class Main implements Runnable {
GUI gui = new GUI();
public static void main(String[] args) {
new Thread (new Main()).start();
}
@Override
public void run() {
while (true) {
gui.repaint();
}
}
}
gui.repaint()
в тесном цикле без вызовов сна; вы перегрузите очередь событий. - person VGR   schedule 06.06.2019