- 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/
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 8 年前。 Improve this qu
我目前正在尝试制作一个非常简单的应用程序,它会根据一天中的时间问候。我的代码是: open System let read() = Console.Read() let readLine() = Co
我已经运行Elasticsearch服务很长时间了,但是突然遇到了以下情况 由以下原因导致:org.elasticsearch.index.translog.TranslogCorruptedExce
我对执行以下操作的 php 重定向脚本有一个奇怪的问题: 在用户的浏览器中植入 Cookie,或者读取现有 Cookie(如果有)。 将用户重定向到另一个网址(重定向的网址是原始网址中的参数,例如 h
我正在使用 iText 7.0.0(Java 风格),似乎表格单元格 HorizontalAlignment 被忽略,因为 CENTER 和 RIGHT 都不起作用。你能重现这个吗? see th
简而言之: 我有一个可以从多个线程访问的计数器变量。尽管我已经实现了多线程读/写保护,但该变量似乎仍然以不一致的方式同时写入,导致计数器结果不正确。 深入杂草: 我使用的“for 循环”会在后台触发大
我有一个 REST 项目,在访问控制服务类中保存用户的ArrayList。一切都工作正常,直到 REST Web 服务突然抛出 java.util.NoSuchElementException。单步查
已关闭。此问题不符合Stack Overflow guidelines 。它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
当我刷新页面时,我无法显示 voteUp/Down,因为如果我执行 voteUp/Down(+1 或 -1) 并刷新页面,这会再次返回 voteUp/Down (0)。过去我使用 JSON,但社区推荐
我正在为离散时间 CPU 调度模拟器编写代码。它只是生成流程并相应地安排它们。我目前正在实现 FCFS 计划。我理解离散时间模拟器的本质,但我在用 C++ 实现时遇到了麻烦。 问题出现在handleN
尝试使用 yum 部署包时出现错误: 2016-07-07 14:14:31,296 - ERROR - error: rpmdb: BDB0113 Thread/process 6723/1
我有一个简单的同步队列 template class SynchronisedQueue { public: void Enqueue(const T& d
我正在使用 hadoop 0.20.append 和 hbase 0.90.0。我将少量数据上传到 Hbase,然后出于评估目的杀死了 HMaster 和 Namenode。在此之后,我向 Hbase
我使用 symfony 框架 1.4 创建了一个网站。我正在使用 sfguard 进行身份验证。 现在,这在 WAMP (windows) 上运行良好。我可以在不同的浏览器上登录多个帐户并使用该网站。
目前我已经实现了 HashMap private static Map cached = new HashMap(); 和 Item 是一个具有属性的对象 Date expireTime 和 byte
我试图将 2 个不同的 WPF 控件绑定(bind)到 ViewModel 中的同一属性,即 CheckBox.IsChecked 和 Expander.IsExpanded。我想要实现的行为是让 C
我希望这是一个简单的问题,但我没有找到答案。 我想让 build.gradle 文件通过替换某些变量来设置我的 Spring Boot 应用程序中的版本。这与广告一样有效: def tokens =
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
这个问题在这里已经有了答案: In a fragment shader, why can't I use a flat input integer to index a uniform array o
我已经下载了 OSM 世界地图。解析时出现异常: osm bound changeset (...) changeset Exception in thread "main" org.xml.sax.
我是一名优秀的程序员,十分优秀!