Java 如何仅在所需选项卡中显示带有图像的按钮?

Java 如何仅在所需选项卡中显示带有图像的按钮?,java,processing,control-p5,Java,Processing,Control P5,我有OKNO1和OKNO2,我想用OKNO1显示一个带有图像的按钮 此时,带有图像的按钮将全局显示。 我以前使用的是cp5.addButton,在那里我使用.moveTo(“okno1”) 现在图像按钮使用OOP/Java。 如何解决棘手的问题?你可以用什么方法完成这项任务。我想再次使用voiddraw() 完整的代码示例: import controlP5.*; ControlP5 cp5; ImageButton button; Textlabel I; Textlabel tempIn;

我有OKNO1和OKNO2,我想用OKNO1显示一个带有图像的按钮

此时,带有图像的按钮将全局显示。 我以前使用的是
cp5.addButton
,在那里我使用
.moveTo(“okno1”)

现在图像按钮使用OOP/Java。 如何解决棘手的问题?你可以用什么方法完成这项任务。我想再次使用
voiddraw()

完整的代码示例:

import controlP5.*;
ControlP5 cp5;
ImageButton button;
Textlabel I;
Textlabel tempIn;

void setup() {
  size(700, 420, P3D);
  surface.setResizable(false);
  smooth();
  frameRate(30);
  cp5 = new ControlP5(this);

  PFont p = createFont("Times New Roman", 18);
  ControlFont font=new
    ControlFont(p);
  cp5.setFont(font);

  cp5.addTab("okno2")
    .setColorBackground(color(0, 160, 100))
    .setColorLabel(color(255))
    .setColorActive(color(255, 128, 0));

  cp5.getTab("default")
    .activateEvent(true)
    .setLabel("okno1")
    .setId(1);

  cp5.getTab("okno2")
    .activateEvent(true)
    .setId(2);

  tempIn = cp5.addTextlabel("Sostoyanie")
    .setText("1")
    .setFont(createFont("Times New Roman", 20))
    .setColor(color(0xffffff00))
    .setPosition(155, 35);

  I = cp5.addTextlabel("Impuls")
    .setText("2")
    .setPosition(155, 35)
    .setFont(createFont("Times New Roman", 20))
    .setColor(color(0xffffff00))
    .moveTo("okno2");

  int w = 99;
  int h = 25;
  button = new ImageButton(112, 137, w, h, 
    new PImage[]{
    loadImage("0.png"), // off
    loadImage("1.png"), // 10
    loadImage("2.png"), // 20
    loadImage("3.png"), // 30
    loadImage("4.png"), // 40
    loadImage("5.png"), // 50
    loadImage("6.png"), // 60
    });
}
void draw() {
  background(0);
  button.draw();
}
void mousePressed() {
  button.mousePressed(mouseX, mouseY);
  println(button.min);
}
PImage getImage(int w, int h, int c) {
  PImage img = createImage(w, h, RGB);
  java.util.Arrays.fill(img.pixels, c);
  img.updatePixels();
  return img;
}
class ImageButton {
  int min = 0;
  PImage[] stateImages;
  int stateIndex;
  int x, y;
  int w, h;
  String label = "ВЫКЛ";
  ImageButton(int x, int y, int w, int h, PImage[] stateImages) {
    this.x = x;
    this.y = y;
    this.w = w;
    this.h = h;
    this.stateImages = stateImages;
  }
  void mousePressed(int mx, int my) {
    boolean isOver = ((mx >= x && mx <= x + w) &&
      (my >= y && my <= y + h) ); // check vertical
    if (isOver) {
      min += 10;
      stateIndex++;
      if (min>60) {
        min = 0; 
        stateIndex = 0;
        label = "ВЫКЛ";
      } else {
        label = min + " Мин";
      }
    }
  }
  void draw() {
    if (stateImages != null && stateIndex < stateImages.length) {
      image(stateImages[stateIndex], x, y, w, h);
    } else {
      println("error displaying button state image");
      println("stateImages: ");
      printArray(stateImages);
      println("stateIndex: " + stateIndex);
    }
}
导入控制p5.*;
控制p5-cp5;
图像按钮;
文本标签I;
Textlabel tempIn;
无效设置(){
大小(700、420、P3D);
表面。可设置大小(假);
光滑的();
帧率(30);
cp5=新控制P5(本);
PFont p=createFont(“泰晤士报新罗马”,18);
ControlFont=新建
对照组(p);
cp5.setFont(字体);
cp5.添加选项卡(“okno2”)
.setColorBackground(颜色(0、160、100))
.setColorLabel(颜色(255))
.setColorActive(颜色(255,128,0));
cp5.getTab(“默认值”)
.activateEvent(真)
.setLabel(“okno1”)
.setId(1);
cp5.getTab(“okno2”)
.activateEvent(真)
.setId(2);
tempIn=cp5.addTextlabel(“Sostoyanie”)
.setText(“1”)
.setFont(createFont(“Times New Roman”,20))
.setColor(颜色(0xffffff00))
.设定位置(155,35);
I=cp5.addTextlabel(“脉冲”)
.setText(“2”)
.设置位置(155,35)
.setFont(createFont(“Times New Roman”,20))
.setColor(颜色(0xffffff00))
.moveTo(“okno2”);
int w=99;
int h=25;
按钮=新图像按钮(112、137、w、h、,
新PImage[]{
loadImage(“0.png”),//关闭
loadImage(“1.png”),//10
loadImage(“2.png”),//20
loadImage(“3.png”),//30
loadImage(“4.png”),//40
loadImage(“5.png”),//50
loadImage(“6.png”),//60
});
}
作废提款(){
背景(0);
button.draw();
}
void mousePressed(){
按钮。鼠标按下(mouseX,mouseY);
println(按钮最小值);
}
PImage getImage(整数w、整数h、整数c){
PImage img=创建图像(w、h、RGB);
java.util.array.fill(img.pixels,c);
img.updatePixels();
返回img;
}
类图像按钮{
int min=0;
PImage[]状态图像;
int状态索引;
int x,y;
int w,h;
String label=“БцЛ”;
图像按钮(整数x、整数y、整数w、整数h、PImage[]状态图像){
这个.x=x;
这个。y=y;
这个.w=w;
这个,h=h;
this.stateImages=stateImages;
}
鼠标按下无效(int mx,int my){
布尔值isOver=((mx>=x&&mx=y&&my 60){
最小值=0;
stateIndex=0;
label=“БцЛ”;
}否则{
标签=最小值+;
}
}
}
作废提款(){
if(stateImages!=null&&stateIndex
帮助他人(包括我自己)帮助您:

  • 保持代码整洁(删除任何不必要的内容,例如
    getImage
  • 把代码格式化以便阅读。我怎么强调都不过分
要帮助自己始终确保完全理解所有代码,请执行以下操作:

  • 读一下
  • 在你的脑海里想象它将如何运行
  • 运行它并观察实际行为
  • 了解你的心智模型和电脑的不同之处
这将有助于您调试代码,也可用于签出

关于您的问题:按钮始终在
draw()
中呈现。 您只希望在第一个选项卡处于活动状态时绘制它,因此:

  • 获取第一个选项卡
  • 检查它是否处于活动状态
  • 如果是,请渲染该按钮
e、 g而不是
按钮.draw()
您将使用:

if(cp5.getTab("default").isActive()){
    button.draw();
  }
这样就可以了,但随着界面变得越来越复杂,您可能需要对每个选项卡绘制的内容进行分组。以下是如何组织每个选项卡具有更多控件的UI的想法:

  • 添加一个全局变量(在代码顶部)以跟踪当前选项卡:
    int currentTab=1;
  • draw()
    中调用
    displaytables();
    而不是
    按钮。draw()
    来处理每个选项卡绘图。(下面是关于
    displaytables()
    的详细信息)
  • controlEvent()
    更新
    currentTab
像这样:

void controlEvent(ControlEvent event) {
  // update current tab only if the current event comes from a tab (and not other controllers) 
  if(event.isTab()){
    currentTab = event.getId();
  }
}
想法是当点击/更新任何ControlP5组件(控制器)时,
controlEvent
将被触发。如果它是一个选项卡,您可以更新
currentTab
,以便在
draw()
中使用
displayTabs()
知道要绘制哪些内容:

因此,有一个开关可以调用一个函数或另一个函数,具体取决于
currentTab
值。这样做的好处是,您可以方便地在将来为另一个选项卡复制另一个
案例,并且每个选项卡内容都被整齐地划分开来。

帮助他人(包括我自己)帮助您:

  • 保持代码整洁(删除任何不必要的内容,例如
    getImage
  • 把代码格式化以便阅读。我怎么强调都不过分
要帮助自己始终确保完全理解所有代码,请执行以下操作:

  • 读一下
  • 在你的脑海里想象它将如何运行
  • 运行它并观察实际行为
  • 了解你的心智模型和电脑的不同之处
这将有助于您调试代码,也可用于签出

关于您的问题:按钮始终在
draw()
中呈现。 您只希望在第一个选项卡处于活动状态时绘制它,因此:

  • 获取第一个选项卡
  • 检查它是否处于活动状态
  • 如果是,请渲染该按钮
e、 g而不是
按钮.draw()
您将使用:

if(cp5.getTab("default").isActive()){
    button.draw();
  }
这样就可以了,但随着接口变得越来越复杂,您可能需要