【问题标题】:Using JColorChooser inside Processing 3.5在 Processing 3.5 中使用 JColorChooser
【发布时间】:2020-02-29 02:55:25
【问题描述】:

我正在尝试在草图中使用 JColorChooser:

import javax.swing.JColorChooser;
import java.awt.Color;
import javax.swing.JFrame;

color bgcolor = color(0,100,200,150);

void setup() {
  size(200, 200);
  noLoop();
}

void draw() {
  background(0);
  fill(bgcolor);
  rect(0,0,width,height);
}

void keyPressed() {
  bgcolor = pickColor(bgcolor);
  redraw();
}

color pickColor(int c) {
  Color javaColor = new Color(c, true);
  javaColor  = JColorChooser.showDialog(this, "Java Color Chooser", javaColor); 
  if (javaColor != null ) {  
    c = (int)alpha(c) << 24 | (javaColor.getRed() << 16 ) | (javaColor.getGreen() << 8 ) | (javaColor.getBlue() << 0 );
    println( "Picked:" + hex(c) );
    return c;
  }
  return color(0);
}

但处理显示错误:

函数“showDialog()”需要如下参数:“showDialog(Component, String, Color)”

我也尝试使用JColorChooser.showDialog( null,"Java Color Chooser",javaColor); 和使用/不使用noLoop()/loop(),但没有显示对话框。

我该如何解决?
有没有办法在处理中显示 JDialog 和/或 JFrame?

【问题讨论】:

  • JColorChooser.showDialog(null, "Java Color Chooser", javaColor); 工作得很好。我只是将您的代码复制粘贴到处理中,将... 替换为void setup() { noLoop(); colorPick(color(255,0,0)); },更新了showDialog 行,它运行时没有任何抱怨。请记住,Processing 基于但不遵循与 Java 相同的范围规则,因此在实际类方法之外没有您应该依赖的this
  • @Mike'Pomax'Kamermans:您使用的是哪个版本的处理和操作系统?
  • 来自processing.org/download 的当前处理。操作系统几乎无关紧要:处理与捆绑的 JVM 一起提供,因此执行完全基于该 JVM,而不是主机操作系统。
  • 我已将您的代码更新为 minimal reproducible example,并进行了两项调整:我已将 colorPick 重命名为 pickColor(标准约定:在方法之后命名),并且我已经修复了您构建c 的方式,因为new Color(c) 完全失去了alpha 通道,因此您必须保留原始颜色int 的alpha(...)。如果您将代码中的 this 更改为 null,正如您提到的已经尝试过的那样,该代码在当前处理中运行得非常好。

标签: java swing processing


【解决方案1】:

最后创建一个虚拟框架似乎可行,但我会等待其他答案:

...
int colorPick( int c ) {
  Color javaColor = new Color( c, true);
  noLoop();  
  JFrame jf = new JFrame( "Dummy" );
  jf.setDefaultCloseOperation( JFrame.HIDE_ON_CLOSE );
  jf.setLocationRelativeTo(null);
  jf.setAlwaysOnTop (true);
  jf.setVisible( true );
  javaColor  = JColorChooser.showDialog( jf,"Java Color Chooser",javaColor);
  jf.setVisible( false );
  loop();
  if (javaColor != null ) {  
    c = (javaColor.getAlpha() << 24 ) | (javaColor.getRed() << 16 ) | (javaColor.getGreen() << 8 ) | (javaColor.getBlue() << 0 );
    println( "Picked:" + hex(c) );
  }
  return c;
}
...

【讨论】:

    猜你喜欢
    • 2013-12-03
    • 2019-06-27
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 2023-03-23
    • 1970-01-01
    • 2014-12-05
    相关资源
    最近更新 更多