Java 如何仅在所需选项卡中显示带有图像的按钮?
我有OKNO1和OKNO2,我想用OKNO1显示一个带有图像的按钮 此时,带有图像的按钮将全局显示。 我以前使用的是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;
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();
}
这样就可以了,但随着接口变得越来越复杂,您可能需要