- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用 JScrollNavigator
组件描述 here ,为了提供一个导航窗口到一个大型的“类似 Canvas ”的 CAD 组件,我已经嵌入了 JScrollPane
.
我试图适应 JScrollNavigator
绘制 Canvas 的缩略图以为用户提供一些额外的上下文。但是,这样做会导致我的应用程序主框架的渲染损坏。具体就是调用paint(Graphics)
的 Action 在视口(viewport)组件(即我的主 Canvas )上,传入 Graphics
由 BufferedImage
创建的对象导致后续显示损坏;如果我注释掉这一行,一切正常。
以下是JScrollNavigator
的覆盖 paintComponent
方法:
@Override
protected void paintComponent(Graphics g) {
Component view = jScrollPane.getViewport().getView();
BufferedImage img = new BufferedImage(view.getWidth(), view.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = img.createGraphics();
// Paint JScrollPane view to off-screen image and then scale.
// It is this action that causes the display corruption!
view.paint(g2d);
g2d.drawImage(img, 0, 0, null);
Image scaled = img.getScaledInstance(getWidth(), getHeight(), 0);
super.paintComponent(g);
g.drawImage(scaled, 0, 0, null);
}
JScrollNavigator
在
JSplitPane
的左侧形成一个子面板.
JScrollPane
与导航器相关联的位于右侧。 “损坏”导致不再呈现拆分器并且滚动条不可见(它们显示为白色)。如果我调整
JFrame
的大小,
JMenu
段也变白了。如果我尝试使用导航器或与滚动条交互,它们会变得可见,但分隔符仍为白色。就好像各种组件的不透明设置已受到视口(viewport) View 渲染到屏幕外图像的影响。
JScrollNavigator
出现在一个完全独立的
JDialog
,一切正常。
JMenuBar
到
mFrame
:
JMenuBar bar = new JMenuBar();
bar.add(new JMenu("File"));
mFrame.setJMenuBar(bar);
main()
JScrollNavigator
的方法代替:
jsp.setViewportView(textArea);
jsp.setViewportView(new JPanel() {
{
setBackground(Color.GREEN);
setBorder(BorderFactory.createLineBorder(Color.BLACK, 5));
}
});
JScrollNavigator
作为面板嵌入
mFrame
,而不是作为单独的
JDialog
出现:
mFrame.add(jsp, BorderLayout.CENTER);
mFrame.add(nav, BorderLayout.NORTH);
JMenuBar
不再可见 ;将 View (即带有粗黑色边框的绿色
JPanel
)绘制到
Graphics2D
的行为返回者
BufferedImage.createGraphics()
实际上似乎正在渲染它
屏幕 ,可能来自 JFrame 的左上角,从而遮挡了其他组件。这似乎只有在
JPanel
时才会发生用作视口(viewport) View ,而不是其他组件,例如
JTextArea
,
JTable
, 等等。
main
和
paintComponent
导致编辑 2 中描述的可重现错误的方法:
public static void main(String[] args) {
JScrollPane jsp = new JScrollPane();
jsp.setViewportView(new JPanel() {
{
setBackground(Color.GREEN);
setBorder(BorderFactory.createLineBorder(Color.BLACK, 5));
}
});
JScrollNavigator nav = new JScrollNavigator();
nav.setJScrollPane(jsp);
JFrame mFrame = new JFrame();
JMenuBar bar = new JMenuBar();
bar.add(new JMenu("File"));
mFrame.setJMenuBar(bar);
mFrame.setTitle("JScrollNavigator Test");
mFrame.setSize(800, 600);
mFrame.setLayout(new GridLayout(1, 2));
mFrame.add(jsp);
mFrame.add(nav);
Dimension screenDim = Toolkit.getDefaultToolkit().getScreenSize();
mFrame.setLocation((screenDim.width - mFrame.getSize().width) / 2, (screenDim.height - mFrame.getSize().height) / 2);
mFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mFrame.setVisible(true);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Component view = jScrollPane.getViewport().getView();
if (img == null) {
GraphicsConfiguration gfConf = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();
img = new BufferedImage(view.getWidth(), view.getHeight(), BufferedImage.TYPE_INT_ARGB);
}
Graphics2D g2d = img.createGraphics();
view.paint(g2d);
Image scaled = img.getScaledInstance(getWidth(), getHeight(), 0);
g.drawImage(scaled, 0, 0, null);
}
JMenuBar
还没有绘制(paint),看来
JPanel
在某个时间点呈现在 (0,0) (应该是
JMenuBar
的位置)。
view.paint
电话内
paintComponent
是造成这种情况的直接原因。
最佳答案
摘要:原文 JScrollNavigator
使用 Swing opacity
属性呈现方便的绿色 NavBox
在相邻 JScrollPane
中组件的缩放缩略图上.因为它扩展了 JPanel
,(共享)UI 委托(delegate)对 opacity
的使用与可滚动组件的冲突。在上面编辑 5 中看到的图像代表了相关的渲染工件,也显示了 here .解决办法是让NavBox
, JScrollNavigator
和可滚动组件扩展 JComponent
,正如下面第二个附录中所建议的那样。每个组件然后可以单独管理它自己的属性。
我在您的 code as posted 中没有看到异常的渲染伪像在我的平台上,Mac OS X,Java 1.6。抱歉,我没有看到任何明显的便携性违规。
一些可能不相关但可能有用的观察。
setSize()
,在这种情况下,您仍然应该pack()
内附Window
.f.pack();
f.setSize(300, 200);
add()
将组件转发到内容 Pane 。f.add(nav, BorderLayout.WEST);
StringBuilder
至 StringBuffer
. ComponentAdapter
代替 ComponentListener
. RenderingHints
得到了更灵活的结果而不是
getScaledInstance()
如下所示。添加一些图标可以更轻松地查看图像和文本上的不同效果。
editPane.insertIcon(UIManager.getIcon("OptionPane.errorIcon"));
editPane.insertIcon(UIManager.getIcon("OptionPane.warningIcon"));
...
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Component view = jScrollPane.getViewport().getView();
BufferedImage img = new BufferedImage(view.getWidth(),
view.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics2D off = img.createGraphics();
off.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
off.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BICUBIC);
view.paint(off);
Graphics2D on = (Graphics2D)g;
on.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
on.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BICUBIC);
on.drawImage(img, 0, 0, getWidth(), getHeight(), null);
}
JPanel
UI 委托(delegate)不合作。一种解决方法是扩展
JComponent
以便您可以控制
opacity .管理
backgroundColor
只需稍微多一点的工作.
NavBox
和
JScrollNavigator
也是类似治疗的候选人。
jsp.setViewportView(new JComponent() {
{
setBackground(Color.red);
setBorder(BorderFactory.createLineBorder(Color.BLACK, 16));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(getBackground());
g.fillRect(0, 0, getWidth(), getHeight());
}
@Override
public Dimension getPreferredSize() {
return new Dimension(300, 300);
}
});
关于java - 将组件绘制到 BufferedImage 会导致显示损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11739989/
我错过了什么,我已完成 的安装指南中要求的所有步骤 native 脚本 运行 tns doctor 给我以下输出... C:\abc\xyz>tns doctor √ Getting environm
尝试从 {addToCart(book)}}/>}> 传递数据至}> 问题: 购物车 ( render={()=> ) 收到 null,但没有收到我尝试发送的对象 已放置“console.log...
这是 _app.tsx 的外观: function MyApp({ Component, pageProps }: AppProps) { return } 我在构建项目时遇到了这个错误: Ty
我的 Laravel Vue 组件收到以下警告: [Vue warn]: Avoid mutating a prop directly since the value will be overwrit
根据这个example更详细this one我刚刚遇到了一件奇怪的事情...... 如果我使用方法作为 addTab(title,icon,component) 并且下一步想使用 setTabComp
目前我有一个捕获登录数据的表单,一个带有 TIWDBGrid 的表单,它应该返回与我从我的 mysql 数据库登录时创建的 user_id 关联的任何主机,以及一个共享数据模块。 下面是我的登录页面代
在我的react-native应用程序中,我目前有一个本地Android View (用java编写)正确渲染。当我尝试将我的react-native javascript 组件之一放入其中时,出现以
我为作业编写了简单的代码。我引用了文档和几个 youtube 视频教程系列。我的 react 代码是正确的我在运行代码时没有收到任何错误。但是这些 react-boostrap 元素没有渲染。此代码仅
几周前我刚刚开始使用 Flow,从一周前开始我就遇到了 Flow 错误,我不知道如何修复。 代码如下: // @flow import React, { Component } from "react
我想在同一个 View 中加载不同的 web2py 组件,但不是同时加载。我有 5 个 .load 文件,它们具有用于不同场景的表单字段,这些文件由 onchange 选择脚本动态调用。 web2py
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 6年前关闭。 Improve t
Blazor 有 InputNumber将输入限制为数字的组件。然而,这呈现了一个 firefox 不尊重(它允许任何文本)。 所以我尝试创建一个过滤输入的自定义组件: @inherits Inpu
我在学习 AngularDART 组件时编写了以下简单代码,但没有显示任何内容,任何人都可以帮助我知道我犯了什么错误: 我的 html 主文件:
我想在初始安装组件时或之后为 div 设置动画(淡入)。动画完成后,div 不应消失。我正在尝试使用 CSSTransition 组件并查看 reactcommunity.org 上的示例,但我根本无
我需要一个 JSF 组件来表示甘特图。是否有任何组件库(如 RichFaces)包含这样的组件? 最佳答案 JFreeChart有甘特图和PrimeFaces有一个图像组件,允许您动态地流式传输内容。
从软件工程的角度来看,组件、模块和子系统之间有什么区别? 提前致谢! 最佳答案 以下是 UML 2.5 的一些发现: 组件:该子句指定一组结构,可用于定义任意大小和复杂性的软件系统。特别是,它将组件指
我有使用非托管程序集(名为 unmanaged.dll)的托管应用程序(名为 managed.exe)。到目前为止,我们已经创建了 Interop.unmanaged.dll,managed.exe
我有一个跨多个应用程序复制的 DAL(我知道它的设计很糟糕,但现在忽略它),我想做的是这个...... 创建一个将通过所有桌面应用程序访问的 WCF DAL 组件。任何人都可以分享他们对关注的想法吗?
我有一个 ComboBox 的集合声明如下。 val cmbAll = for (i /** action here **/ } 所有这些都放在一个 TabbedPane 中。我想这不是问题。那么我
使用 VB6 创建一个 VB 应用程序。应用程序的一部分显示内部的闪存。 当我使用 printform它只是打印整个应用程序。我不知道如何单独打印闪光部分。任何帮助,将不胜感激!.. 谢谢。 最佳答案
我是一名优秀的程序员,十分优秀!