Пусть пользователь размещает кнопки в Java

#java #swing #jbutton #jflap

#java #swing #jbutton #jflap

Вопрос:

Я хочу закодировать небольшой инструмент, который имитирует детерминированный конечный автомат (например, JFLAP) для себя.

Мой JFrame просто пустой. Как я могу позволить пользователю размещать кнопки при щелчке левой кнопкой мыши? И как мне присвоить этой кнопке правильные значения (например, какую функцию вызывать при нажатии).

Я знаю, что могу разместить кнопку с

 JButton button = new JButton("Press me");
frame.add(button);
 

Но я не знаю, как я мог бы это динамически кодировать.

Любая помощь приветствуется. Также, если вы считаете, что глупо решать мою проблему с помощью кнопок, я хотел бы услышать предложения по улучшению.

Комментарии:

1. Сколько кнопок вы ожидаете, что пользователь разместит? Какие типы функций связаны с кнопками? Какие типы текста или изображений будут размещены на кнопках?

2. Должно быть возможно разместить бесконечное количество кнопок. Функции, которые необходимы для кнопки, связаны с другой кнопкой. Мне не нужны изображения на моих кнопках. Текст не имеет значения. Может быть 1,2,3,4,5,…

3. @Samuel: в этом коде нет ничего «волшебного»: вы можете сделать это при создании своего компонента или внутри обработчика щелчков мыши (как показано в ответе). На самом деле, слово «динамически» часто ничего не значит в такого рода требованиях: нет разницы между «обычным способом» и этим способом.

Ответ №1:

Следующий код будет добавлять a JButton в «пробел» JFrame каждый раз, когда мышь щелкает внутри JFrame . Они JButton будут размещены там, где произошел щелчок мыши. JButton Текст будет числом. Каждая JButton из них будет отображать разное число.

 import java.awt.Dimension;
import java.awt.EventQueue;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;

public class AdButton extends MouseAdapter implements Runnable {
    private int  counter;
    private JFrame  frame;
    private JPanel  contentPane;

    public void mouseClicked(MouseEvent event) {
        int x = event.getX();
        int y = event.getY();
        JButton button = new JButton(String.valueOf(  counter));
        Dimension dim = button.getPreferredSize();
        button.setBounds(x, y, dim.width, dim.height);
        contentPane.add(button);
        contentPane.revalidate();
        contentPane.repaint();
    }

    @Override
    public void run() {
        showGui();
    }

    private void showGui() {
        frame = new JFrame();
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        contentPane = (JPanel) frame.getContentPane();
        contentPane.setLayout(null);
        contentPane.addMouseListener(this);
        frame.setSize(400, 450);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new AdButton());
    }
}