当前位置: 首页 > 面试题库 >

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

孟浩慨
2023-03-14
问题内容

我有OKNO1和OKNO2,我想严格在OKNO1中显示带有图像的按钮。

此刻,带有图像的按钮将全局显示。我曾经用过cp5.addButton,在那里做过.moveTo(“okno1”);

现在,图像按钮使用OOP / Java。如何解决一个棘手的问题?您可以通过什么方式完成任务。我想再次使用void draw()。

Complete code example:

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);
    }
}

问题答案:

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

保持代码整洁(例如删除不必要的内容getImage)格式化代码,以便于阅读。我不能太强调这一点。
为了帮助自己,请务必完全理解所有代码:

阅读想像一下它会如何运行运行它并观察实际行为了解您的心理模型与计算机之间的区别。
通常,这将帮助您调试代码。另请查看Kevin Workman的调试教程。

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

获取第一个标签检查它是否处于活动状态如果是这样,请渲染按钮
例如,代替button.draw()您使用:

if(cp5.getTab("default").isActive()){
    button.draw();
  }

可以做到这一点,但是随着界面变得越来越复杂,您可能希望
对每个选项卡上绘制的内容进行分组。这是有关如何为
每个标签具有更多控件的UI进行组织的想法:

  • 添加一个全局变量(在代码顶部)以跟踪当前选项卡: int currentTab = 1;
  • 调用displayTabs();的draw(),而不是button.draw()为每片绘图处理。(有关displayTabs()波纹管的更多信息)
  • controlEvent()更新 currentTab

Like so:

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();
  }
}

单击/更新controlEvent任何ControlP5组件(控制器)时,都会触发该想法。如果是标签,则可以更新currentTab以
了解draw()要draw()使用的内容displayTabs():

void displayTabs(){
  switch(currentTab){
    case 1:
      displayTab1();
      break;
    case 2:
      displayTab2();
      break;
  }
}

void displayTab1(){
  button.draw();
}

void displayTab2(){
  // render stuff for tab 2 only
}

因此,有一个开关可以根据currentTab值调用一个功能或另一个功能。这样做的好处是,将来您可以
轻松地case为另一个选项卡复制另一个选项卡,并且每个选项卡的内容都被整齐地分隔开了。



 类似资料:
  • 我正在尝试制作一个选项卡,其中我必须在gridview中显示图像,所以我从一个库中制作了普通选项卡,并制作了一个适配器来显示我的主要活动代码中的图像。 我的片段类。 我已将适配器设置如下: 我能够在活动中创建网格视图,但是我用它来声明类中的图像,但在这里我遇到了错误。我在适配器中声明为适配器将调用图像的 Sso。它正确编译,没有任何错误,但它显示运行时错误错误为 那么如何解决这个问题,我必须声明图

  • 我在sencha touch 2中创建了一个索引页面,在其中我在容器内创建了一些自定义按钮 这些按钮看起来像这个 单击橙色按钮后,我想显示一个新视图。 我尝试了ext.Navigation view,但它不是我想要的。我必须在按钮上添加一个事件监听器,还是我必须做一些其他事情请建议 我在controller文件夹main.js中创建了一个新控制器 还有我的新视图Eligibelity.js代码 还

  • 我正在创建一个图像库,在单击时显示图像的模式和一些附加信息。数据是从嵌入的json字符串中提取的。该模式在一个大框架中显示正确的图像,但也显示下面的其他图像。如何防止显示其他图像? 非常感谢! 这是JSON: 这是HTML: 这将JSON放在div中: 这就是模态: var modal=文档。getElementById('myModal');

  • 编辑:如果有其他控件可以做到这一点,请让我知道。我在测试TableView。 提前感谢!

  • 问题内容: 这是我的代码。它不会在框架中显示图像,而是显示一些文本。有人可以建议我,我应该对代码进行哪些更改,以便可以在框架中显示图像? 问题答案: 请注意,我不会以这种方式设计代码,但是我希望使它尽可能接近原始代码,同时使其能够在基于Windows的框中显示图像列表。 列表显示

  • 我正在应用程序中使用引导下拉组件,如下所示: 我想将选定的项目显示为btn标签。换言之,将“请从列表中选择”改为已选择的列表项目(“项目一”、“项目二”、“项目三”)。