- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在用Java开发一个简单的绘画应用程序,当我选择一种颜色时,按钮背景会完美改变,但返回的颜色始终是前一个颜色。
例如,如果我选择黑色然后蓝色,它将绘制为黑色。如果我选择蓝色之后的另一种颜色,它将绘制为蓝色。
public class ColorChooserBtn extends JButton {
private Color color;
public ColorChooserBtn() {
super();
this.setBackground(Color.BLACK);
this.setPreferredSize(new Dimension(16, 16));
this.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
Color c = JColorChooser.showDialog(null, "Choose a Color", color);
if (c != null){
setSelectedColor(c);
setBackground(color);
}
}
});
}
public Color getSelectedColor() {
return color;
}
public void setSelectedColor(Color newColor) {
color = newColor;
}
}
public class Paint {
DrawArea drawArea;
JButton clearBtn;
ColorChooserBtn colorBtn;
ActionListener actionListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource() == clearBtn){
drawArea.clear();
} else if(e.getSource() == colorBtn){
drawArea.coloring(colorBtn.getSelectedColor());
}
}
};
public Paint() {
JFrame frame = new JFrame("Paint");
frame.getContentPane().setLayout(new BorderLayout());
drawArea = new DrawArea();
frame.getContentPane().add(drawArea, BorderLayout.CENTER);
JPanel controls = new JPanel();
clearBtn = new JButton("Clear");
clearBtn.addActionListener(actionListener);
colorBtn = new ColorChooserBtn();
colorBtn.addActionListener(actionListener);
controls.add(clearBtn);
controls.add(colorBtn);
frame.getContentPane().add(controls,BorderLayout.NORTH);
frame.setSize(600, 600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
public static void main(String[] args) {
new Paint();
}
}
最佳答案
问题是 ActionListener
的顺序的已通知。一般来说,Swing 调用按照 LIFO 顺序监听
因此,使用以下代码,并附加一些 System.out
是...
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
ColorChooserBtn btn = new ColorChooserBtn();
add(btn);
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Get color");
System.out.println(btn.getSelectedColor());
}
});
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
}
public class ColorChooserBtn extends JButton {
private Color color;
public ColorChooserBtn() {
super();
this.setBackground(Color.BLACK);
this.setPreferredSize(new Dimension(16, 16));
this.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("Choose color");
Color c = JColorChooser.showDialog(null, "Choose a Color", color);
if (c != null) {
setSelectedColor(c);
setBackground(color);
}
}
});
}
public Color getSelectedColor() {
return color;
}
public void setSelectedColor(Color newColor) {
color = newColor;
}
}
}
打印...
Get color
null
Choose color
这意味着ActionListener
用于从按钮“获取”所选颜色的函数首先在 ActionListener
之前调用。用于实际选择颜色
一种可能的解决方案可能是使用 PropertyChangeListener
并触发 propertyChanged
事件时selectedColor
被改变,例如...
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
ColorChooserBtn btn = new ColorChooserBtn();
add(btn);
btn.addPropertyChangeListener("selectedColor", new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
System.out.println("Changed");
System.out.println(evt.getNewValue());
}
});
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
}
public class ColorChooserBtn extends JButton {
private Color color;
public ColorChooserBtn() {
super();
this.setBackground(Color.BLACK);
this.setPreferredSize(new Dimension(16, 16));
this.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("Choose color");
Color c = JColorChooser.showDialog(null, "Choose a Color", color);
if (c != null) {
setSelectedColor(c);
setBackground(color);
}
}
});
}
public Color getSelectedColor() {
return color;
}
public void setSelectedColor(Color newColor) {
if (newColor != color) {
Color oldColor = color;
color = newColor;
firePropertyChange("selectedColor", oldColor, newColor);
}
}
}
}
关于java - JColorChooser 返回先前选择的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36258596/
我想知道为什么 JColorChooser当我的应用程序从 IDE (Eclipse) 或 Jar 文件(由 ant 脚本创建)运行时,外观会发生变化。 这是从 IDE 运行时的面板: 这是从可执行
我正在尝试实现自定义 JColorChooser。 colorPanel.setLayout(new GridLayout(1,2)); JColorChooser tcc = new JCo
我使用 JColorChooser 编写了一个简单的代码,以允许用户从面板中选择颜色。但我始终遇到一个错误。 GUI 代码有一个按钮,当用户单击它时,该按钮执行打开颜色面板的操作。请帮我纠正错误! i
我正在用Java开发一个简单的绘画应用程序,当我选择一种颜色时,按钮背景会完美改变,但返回的颜色始终是前一个颜色。 例如,如果我选择黑色然后蓝色,它将绘制为黑色。如果我选择蓝色之后的另一种颜色,它
我正在开发小程序,我需要一个简单的 16 项颜色选择器。以前有人实现过这样简单的东西吗?我遇到的任何示例都不是最美观或用户友好的...... 一如既往,非常感谢您的帮助... 干杯, 槽型 最佳答案
当我从 JColorChooser 选择颜色时,我想做一些工作。 在按下 OK 按钮后没有。 例如:当我按下红色时,我想显示一条消息说“你选择了红色”。我真正想要实现的是向用户呈现某种预览。 问题:当
我正在编写一个 Java Swing 程序,该程序需要使用户能够从“设置”表单中选择 8 种不同的颜色。就 JColorChooser 而言,这是非常简单的,但我想知道是否有推荐的表单布局方式。这是我
作为大学项目的一部分,我们正在本地化我们的应用程序。 是否可以本地化诸如 JOptionPane 之类的 swing 组件?如果可以,如何本地化? 最佳答案 您可以使用ResourceBundle用于
JColorChooser/Swatches 中的调色板尺寸非常小,而且调色板周围的颜色看起来也很相似。 为了我的使用,我需要增加它们的尺寸以及改变颜色变化。如何做到这一点? 最佳答案 “样本”的大小
我有一个非常简单的类,显示 jTable,在第 1 列中我添加了一个组合框 public class Table extends javax.swing.JFrame { public Tabl
import javax.swing.*; import java.awt.*; public class Fr extends JFrame{ Fr(String s){ s
是否可以设置 JColorChooser 的选定颜色? 我试过了 _ColorChooser_Color.setColor(color); 但它不起作用。意思是,它编译并运行,但不会更改组件的实际选择
我在应用程序的不同位置使用了 JColorchooser。可以有多个可以调用 JColorChooser 的面板实例。 选择器中的“色板”面板有一个“最近”颜色区域,它只存在于 JColorChoos
我正在尝试使用 JTextPane 制作文本编辑器,但在设置所选文本颜色时遇到问题。这是最好的方案(但显然不起作用): JMenuItem button = new JMenuItem("Se
我学习 Java 才几周时间,所以请记住这一点..我自己已经成功解决了许多问题,直到这个: 我想要实现的是在选项卡式 View 中使用 JComponent,以便在一个选项卡中您可以选择一种颜色(我的
我正在尝试为类编写一个程序,但我被卡住了。我需要创建一个形状(我的首字母),然后用 JColorChooser 填充它。我已经能够使用绘画和图形创建我的初始作品。然后我就可以使用 g.setColor
我必须编写一个程序,其中 JColorChooser 打开两次,这将允许用户选择背景和前景色。但是,如果用户选择的颜色太相似,程序应该抛出错误消息并再次打开 JColorChoosers... 我知道
使用 JColorChooser 时,输入的 CMYK 值会转换为特定的 RGB 颜色。当在 RGB 侧手动输入该颜色时,CMYK 值和以前不一样了。 以下程序可用于演示我遇到的行为。 import
我有一个java程序,我想创建一个颜色选择器,当选择该颜色选择器时,会保存该颜色并将其设置为JLabel、按钮、背景等。我怎样才能得到它?下面是代码 public class ColorChooser
我正在尝试创建一个 JColorChooser 对话框,其上方有一个 JLabel,以便 JLabel 文本颜色将更改为用户使用 JColorChooser 选择的颜色。这是我到目前为止所拥有的,但它
我是一名优秀的程序员,十分优秀!