- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想在用户输入无效时绘制一个图标。我找到了 Oracle 的示例并根据我的目的对其进行了修改。图标的绘制工作正常,但是当我更改值以更正图标时,图标不会完全不可见:在 JPanel 上绘制的部分仍然显示。
这是我的代码:
import java.awt.AlphaComposite;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.text.NumberFormat;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayer;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.plaf.LayerUI;
public class FieldValidator extends JPanel {
private static final int ICON_SIZE = 12;
private static final Icon ICON = createResizedIcon((ImageIcon) UIManager.getIcon("OptionPane.errorIcon"));
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
createUI();
}
});
}
public static void createUI() {
final JFrame f = new JFrame ("FieldValidator");
final JComponent content = createContent();
f.add (content);
f.pack();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLocationRelativeTo (null);
f.setVisible (true);
}
private static JComponent createContent() {
final LayerUI<JPanel> panelUI = new ValidationLayerUI();
// Number field.
final JLabel numberLabel = new JLabel("Number:");
final NumberFormat numberFormat = NumberFormat.getInstance();
final JFormattedTextField numberField = new JFormattedTextField(numberFormat) {
/**
* {@inheritDoc}
*/
@Override
public void replaceSelection(String content) {
super.replaceSelection(content);
getParent().repaint();
}
};
numberField.setColumns(16);
numberField.setFocusLostBehavior(JFormattedTextField.PERSIST);
numberField.setValue(42);
final int i = (ICON_SIZE / 2) + (ICON_SIZE % 2);
final JPanel numberPanel = new JPanel();
numberPanel.add(numberLabel);
final JPanel panel = new JPanel(new GridBagLayout());
final GridBagConstraints constr = new GridBagConstraints();
constr.insets = new Insets(i, i, i, i);
constr.weightx = 1;
constr.weighty = 1;
constr.fill = GridBagConstraints.BOTH;
panel.add(numberField, constr);
numberPanel.add(new JLayer<JPanel>(panel, panelUI));
return numberPanel;
}
//Icon resized to 12x12
private static Icon createResizedIcon(ImageIcon anIcon) {
final BufferedImage result = new BufferedImage(ICON_SIZE, ICON_SIZE, BufferedImage.TYPE_INT_ARGB);
final Graphics2D g = result.createGraphics();
g.setComposite(AlphaComposite.Src);
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BICUBIC);
g.drawImage(anIcon.getImage(), 0, 0, ICON_SIZE, ICON_SIZE, null);
g.dispose();
return new ImageIcon(result);
}
static class ValidationLayerUI extends LayerUI<JPanel> {
@Override
public void paint (Graphics g, JComponent c) {
super.paint (g, c);
final JLayer jlayer = (JLayer) c;
final JPanel panel = (JPanel) jlayer.getView();
final JFormattedTextField ftf = (JFormattedTextField) panel.getComponent(0);
if (!ftf.isEditValid()) {
ICON.paintIcon(panel, g, 0, panel.getHeight() - ICON.getIconHeight());
}
}
}
}
这是屏幕:初始都是正确的
当我绘制无效图标时,一切仍然正确
但是当值正确时,只有文本字段会被重绘
如何强制 JPanel 重绘???
附言我已经找到了一种使用 JLayeredPane 的方法,它工作正常,但我想知道我的代码有什么问题?
最佳答案
如何使用 DocumentListener
:
numberField.getDocument().addDocumentListener(new DocumentListener() {
@Override public void insertUpdate(DocumentEvent e) {
//Container c = numberField.getParent();
Container c = SwingUtilities.getUnwrappedParent(numberField);
if (c != null) {
c.repaint();
}
}
@Override public void removeUpdate(DocumentEvent e) {
insertUpdate(e);
}
@Override public void changedUpdate(DocumentEvent e) {}
});
引自此链接:Painting in AWT and Swing
The RepaintManager The purpose of Swing's RepaintManager class is to maximize the efficiency of repaint processing on a Swing containment hierarchy, and also to implement Swing's 'revalidation' mechanism (the latter will be a subject for a separate article). It implements the repaint mechanism by intercepting all repaint requests on Swing components (so they are no longer processed by the AWT) and maintaining its own state on what needs to be updated (known as "dirty regions"). Finally, it uses invokeLater() to process the pending requests on the event dispatching thread, as described in the section on "Repaint Processing" (option B).
在这种情况下,当 isEditValid()
状态改变时,父级 JPanel
不是脏区。所以剩下以前的 Icon
油漆。
关于java - JLayer 和 JPanel 的绘画问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24200940/
你好,我试图在java中创建一个网格并绘制每个单元格,但我不知道我做错了什么。每个单元格都是一个 JPanel,我将每个单元格添加到 mazePanel。之后 mazePanel 添加到框架中。但只能
我正在开发一个应用程序(适用于 iOS 和 Android),其中我需要允许用户从图库中选择照片并通过在图像上绘图来圈出某些项目。一旦用户完成绘制,系统就会提示他在弹出窗口中为该项目命名。命名项目后,
当我使用绘画/绘图应用程序时,我从未注意到在按下手指和能够看到显示屏上绘制的内容之间存在延迟。但是,对于我的应用程序,接收到的初始触摸非常缓慢。第二个、第三个和第四个手势每秒接收 60 个,但第一个手
到目前为止,在我的尝试中,我能够在普通图像上画线,比如创建我自己的 CGRect 大小的普通上下文并在其上画线。我看到的所有教程都是如何在创建的 x*y 大小的图像上下文上绘制。但是我想在已经存在的图
我在 android 中开发,我必须为 android 做一个 Paint。 我正在使用下面的代码,当我执行代码时,绘制工作正常,但是,似乎有 2 个表面要绘制,当你绘制一个时,另一个消失了。 我一直
我使用QGraphicsView、QGraphicsScene 和QGraphicsItem 来绘制一些图表。我已经实现了用于绘制文本(图表的值)的 QGraphicsItem::paint 函数,但
Canvas { id: canvas onPaint: { if (personalInfo.count === 0) { return
好的,这就是问题所在:在 C# 表单中,我创建了一个新的私有(private) void: private void NewBtn(string Name, int x, int y) 它的目的是创建
任何人都可以详细建议我如何使用 QDirectPainter 类直接在帧缓冲区上绘制小部件。如果您能提供一个工作示例,我会更有帮助。 最佳答案 QDirectPainter 不会也不能绘制任何东西。它
我正在使用 cardLayout 更改“ View ”(此类有一个 JFrame 变量)。当用户点击新游戏按钮时,会发生这种情况: public class Views extends JFrame
目标: 我想在 pdf 位图上绘制/书写/绘画并将它们保存在一起,以便我可以通过电子邮件发送给他们。 详细信息: 我有多个 Pdf包含 5-20 的文件每个页面,现在我正在从 pdfs 中提取位图并将
我最近开始学习Qt。 我不太清楚如何使用 QPainter 类进行绘画。假设我只想在窗口中放置几个点: class PointDrawer: public QWidget { Q_OBJE
我必须为我的 CS 类(class)期末项目创建一个带有 GUI 的 connect 5 游戏。我在最后一个项目中使用 Graphics2D - 迷宫 - 使用 Graphics2D 是一场噩梦。 c
我已经删除了 CS_HREDRAW、CS_VREDRAW。 消息 WM_PAINT 和 WM_ERASEBKGND 什么都不做,但是一旦窗口重新调整大小,它就会用背景颜色重新绘制它。有什么办法可以完全
首先大家好! 我遇到了一个大问题:我需要构建一个程序,该程序包括构建一个包含 5 个方 block 和一个按钮的 java swing 界面。按钮功能是在方 block 内画一个圆。我有这段代码,但我
我正在尝试从显示幻灯片的 Qt fluidLauncher 演示中运行稍微修改过的代码。代码贴在下面。当处理 paintEvent 时,屏幕上会显示一个黑色矩形,因为导入的图像大小为 0。 单步执行Q
我有以下代码来激活/停用橡皮擦: public PorterDuffXfermode clear = new PorterDuffXfermode(PorterDuff.Mode.CLEAR);
我正在绘制一个未被清除的 Canvas ,并使 Canvas 随着时间的推移逐渐变成纯色,或者在 alpha 中逐渐消失以显示后面的图层。 我的第一直觉是简单地用每帧的低 alpha 在绘图上填充一个
我正在尝试在每幅画上检测并绘制一个矩形轮廓,例如这张图片: 我遵循了一些指南并执行了以下操作: 灰度转换 应用中值模糊 锐化图像 应用自适应阈值 应用形态梯度 寻找轮廓 绘制轮廓 得到如下结果: 我知
创建 JFrame、在其上添加 JPanel 并在 JPanel 上绘制矩形的类 class Frame { JFrame frame; myPanel panel; void draw() {
我是一名优秀的程序员,十分优秀!