Обработка окна изменения размера и наличие кнопок динамически занимают доступное пространство

Я использую обработку для отображения количества кнопок с API ControlP5. В настоящий момент я могу заставить кнопки отображаться в окне эскиза, но когда я изменяю размер рамки, положения кнопок не обновляются. Есть ли простой способ перерисовать кнопки для их автоматического позиционирования, когда окно изменил размер или я трачу свое время?

Вот код:

package controlp5userinterface;

import java.awt.event.*;
import java.util.ArrayList;
import processing.core.PApplet;
import processing.core.PImage;
import controlP5.*;


public class ControlP5UserInterface extends PApplet {

ControlP5 controlP5;
PImage bg;
Controller b;

@SuppressWarnings("deprecation")
public void setup() {
    size(1000,1000);
    smooth();

    if (frame != null) {
        frame.setResizable(true);
    }

    bg = loadImage("StockBackground1.jpg");

    /*
     * 
     * BEGIN CONTROL P5 MENU GENERATION
     *  buttons will spread out to fit available screen space
     */

    controlP5 = new ControlP5(this);
    ArrayList<Button> buttons = new ArrayList<Button>();
    Group MainMenu = controlP5.addGroup("MainMenu");
    MainMenu.setSize(100, 100);
    //controlP5.addGroup("MainMenu");
    controlP5.addButton("SIMON").setGroup("MainMenu").setSize(80, 50);

    controlP5.addButton("ACN").setGroup("MainMenu").setSize(80, 50);
    controlP5.addButton("GOOG").setGroup("MainMenu").setSize(80, 50);
    //buttons.add(controlP5.addButton("AAPL").setGroup("MainMenu"));
    //buttons.add(controlP5.addButton("ACN").setGroup("MainMenu"));
    //controlP5.getGroup("MainMenu").setSize(300, 300);

}

/*
 * 
 * SCREEN RESIZE CONTROLLER HERE??(non-Javadoc)
 * @see processing.core.PApplet#draw()
 * 
 */

public void draw() {
    background(0);  // background black
    controlP5.getGroup("MainMenu").update();

}

public int sketchWidth(){
    return displayWidth;
}

public int sketchHeight(){
    return displayHeight;
}

public static void main(String _args[]) {
    PApplet.main(new String[] { controlp5userinterface.ControlP5UserInterface.class.getName() });
}

}

2 ответа

У меня была похожая проблема, и, хотя я довольно новичок в обработке, я нашел способ заставить ее работать. Что я сделал, чтобы это работало, так это то, что я поместил свои элементы GUI в controlGroup и перед обновлением (что я сделал с помощью своей пользовательской функции setGUI()) из-за изменения размера окна я скрыл controlGroup с помощью функции hide() и после обновления я снова отобразил его с помощью функции show(). Надеюсь, это может вам как-то помочь.

Я всегда передал значения, такие как ширина и высота, переменным в заголовке и использовал такие числа, как @1690199, упомянутые в его комментарии к вашему вопросу:

      float buttonWidth = 0.02;
float buttonHeight = 0.13;

Button button0, button1, button2, button3;

boolean didSizeChange = false;

а затем обновите свои значения внутриdraw()функция. Может быть, вам нужно сохранить синглbuttonвнутри другой переменной, чтобы иметь возможность обновить ее позже, только если размер экрана изменился.

      if( didSizeChange == true ){
    buttonP0 = controlP5.addButton("P0", 1, 490, 5, 20, 20);
    buttonP0.setColorBackground(gray_);
}

Нашел пример сbuttonsвнутри этого репо

https://java.hotexamples.com/examples/processing.data/ControlP5/addButton/java-controlp5-addbutton-method-examples.html

Кнопки были определены в этом классе

https://github.com/ranqingfa/Firmware/blob/master/GUI/EvvGC_GUI_v0_4/EvvGC_GUI_v0_4.pde

Другие вопросы по тегам