Я хочу установить расположение JButtons с координатами, но как заставить каждую кнопку не «прикасаться» к другим? Макет должен быть пустым !!! Я попробовал метод содержать и с Rectangle, но это не сработало.Java: Случайная позиция JButton
Благодаря
Я хочу установить расположение JButtons с координатами, но как заставить каждую кнопку не «прикасаться» к другим? Макет должен быть пустым !!! Я попробовал метод содержать и с Rectangle, но это не сработало.Java: Случайная позиция JButton
Благодаря
Вы должны будете использовать intersects()
, а не . вернется только true
если comp1
полностью содержит comp2
. Вот пример, который продолжает добавлять новые JButton
в случайном положении, если они не пересекаются с другим Component
. (нажмите here для предварительного просмотра)
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.Timer;
public class Example {
private final int BUTTON_WIDTH = 100;
private final int BUTTON_HEIGHT = 20;
public Example() {
JFrame frame = new JFrame();
frame.setLayout(null);
Timer timer = new Timer(100, new ActionListener() {
Random random = new Random();
@Override
public void actionPerformed(ActionEvent arg0) {
JButton button = new JButton("Button");
button.setBounds(random.nextInt(frame.getContentPane().getWidth() - BUTTON_WIDTH),
random.nextInt(frame.getContentPane().getHeight() - BUTTON_HEIGHT), BUTTON_WIDTH,
BUTTON_HEIGHT);
for (int tries = 0; tries < 50; tries++) {
if (intersectsComponent(button, frame.getContentPane().getComponents())) {
button.setBounds(random.nextInt(frame.getContentPane().getWidth() - BUTTON_WIDTH),
random.nextInt(frame.getContentPane().getHeight() - BUTTON_HEIGHT), BUTTON_WIDTH,
BUTTON_HEIGHT);
} else {
frame.add(button);
break;
}
}
frame.revalidate();
frame.repaint();
}
});
timer.start();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(800, 600);
frame.setVisible(true);
}
public boolean intersectsComponent(Component component, Component[] components) {
for (Component c : components) {
if (c.getBounds().intersects(component.getBounds())) {
return true;
}
}
return false;
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new Example();
}
});
}
}
'GridLayout' и переключаясь с помощью' JButton.setVisible (true/false) ', тогда требование OPs завершено ..., thats just my (helocopter) view – mKorbel
@mKorbel Я согласен, что это, вероятно, лучшее решение. Тем не менее, OP заявил * «Макет ** должен ** быть нулевым» *, поэтому я предполагаю, что это («абсолютно» случайные позиции) - это то, о чем он просил. –
@ LuxxMiner Большое спасибо за ваш ответ !! – EagleJ
Допустим, у вас есть общее пространство H пикселей на W пикселей. Вы можете разделить это пространство на сетку 10 на 10.
Каждый «слот» теперь H/10 по W/10.
Теперь вы можете создать 100 кнопок, которые не сталкиваются с использованием случайных setBounds (...) в каждом слоте с использованием нулевого макета.
Каждый JButton имеет свое собственное пространство, и вы все равно получаете полу-случайность.
Обратите внимание, что MadProgrammer сказал бы вам, что это очень плохая идея использовать пустые макеты.
EDIT:
Не только MadProgrammer.
Отказ от ответственности:
Я когда-то использовал пустой макет для JDekstopPane. У меня все еще есть эта строка кода со мной.
Остальные 1М или около того строк кода не содержат таких мятежных концепций.
upvote для ссылки MadProgrammer – Dan
Каждый пользователь GUI (не только Swing) сказал бы вам, что вы не используете нулевые макеты. – user1803551
Почему вы не можете использовать диспетчер компоновки, такой как FlowLayout? –
Менеджмент макета не является случайными координатами, я не хочу определенного местоположения, такого ряда !!! Спасибо за ответ – EagleJ
Если каждая координата каждой кнопки задана как случайная - вам нужно рассчитать границы самостоятельно. Каждая кнопка может быть случайным образом помещена в отдельную зону прямоугольника. –