2015-12-20 3 views
0

Я хочу установить расположение JButtons с координатами, но как заставить каждую кнопку не «прикасаться» к другим? Макет должен быть пустым !!! Я попробовал метод содержать и с Rectangle, но это не сработало.Java: Случайная позиция JButton

Благодаря

+0

Почему вы не можете использовать диспетчер компоновки, такой как FlowLayout? –

+0

Менеджмент макета не является случайными координатами, я не хочу определенного местоположения, такого ряда !!! Спасибо за ответ – EagleJ

+0

Если каждая координата каждой кнопки задана как случайная - вам нужно рассчитать границы самостоятельно. Каждая кнопка может быть случайным образом помещена в отдельную зону прямоугольника. –

ответ

1

Вы должны будете использовать 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(); 
      } 
     }); 
    } 
} 
+0

'GridLayout' и переключаясь с помощью' JButton.setVisible (true/false) ', тогда требование OPs завершено ..., thats just my (helocopter) view – mKorbel

+0

@mKorbel Я согласен, что это, вероятно, лучшее решение. Тем не менее, OP заявил * «Макет ** должен ** быть нулевым» *, поэтому я предполагаю, что это («абсолютно» случайные позиции) - это то, о чем он просил. –

+0

@ LuxxMiner Большое спасибо за ваш ответ !! – EagleJ

1

Допустим, у вас есть общее пространство H пикселей на W пикселей. Вы можете разделить это пространство на сетку 10 на 10.
Каждый «слот» теперь H/10 по W/10.
Теперь вы можете создать 100 кнопок, которые не сталкиваются с использованием случайных setBounds (...) в каждом слоте с использованием нулевого макета.
Каждый JButton имеет свое собственное пространство, и вы все равно получаете полу-случайность.

Обратите внимание, что MadProgrammer сказал бы вам, что это очень плохая идея использовать пустые макеты.

EDIT:
Не только MadProgrammer.

Отказ от ответственности:
Я когда-то использовал пустой макет для JDekstopPane. У меня все еще есть эта строка кода со мной.
Остальные 1М или около того строк кода не содержат таких мятежных концепций.

+0

upvote для ссылки MadProgrammer – Dan

+1

Каждый пользователь GUI (не только Swing) сказал бы вам, что вы не используете нулевые макеты. – user1803551

Смежные вопросы