Tag: swing

将图片插入JTextPane

在我的记事本应用程序中,我试图通过单击名为Picture的JMenuItem将图像添加到JTextPane ,就好像它是JLabel 。 private class Picture implements ActionListener { public void actionPerformed(ActionEvent event) { fc = new JFileChooser(); FileNameExtensionFilter picture = new FileNameExtensionFilter(“JPEG files (*.jpg)”, “jpg”); fc.setFileFilter(picture); fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); if (fc.showDialog(Notepad.this, “Insert”)!=JFileChooser.APPROVE_OPTION) return; filename = fc.getSelectedFile().getAbsolutePath(); // If no text is entered for the file name, refresh the dialog box if (filename==null) return; // NullPointerException textArea.insertIcon(createImageIcon(filename)); […]

如何支持缩放JScrollPane中显示的视图以避免将JScrollBars显示到最小尺寸?

我想要实现的行为是默认情况下以1:1的比例显示视图。 如果其容器变大(由用户动态调整父JFrame的大小),则应缩放视图以适应更大的区域; 如果缩小,视图应缩放以适应较小的区域 – 达到极限。 当小于最小尺寸时,滚动条应与视口一起出现,以支持在最小比例显示的视图周围导航。 我现在有一个运行不良的实现,使用JScrollPane和ComponentListener来确定何时发生resize。 基于新大小,设置新的比例因子以绘制视图以适合(最小比例),设置视图的preferredSize并调用revalidate()。 问题是这会导致“抖动”显示; 当调整超过应用新比例的点以避免显示滚动条时,滚动条会出现,然后消失。 我相信这是因为我的方法是react native的,而不是预测性的。 也就是说,LayoutManager仅查看视图的preferredSize并基于此执行布局。 我正在侦听JScrollPane的大小调整,当它只是太小时才更改视图的preferredSize,然后通过调用revalidate()使容器再次布局。 至少这是我理解它的方式。 我一直在审查JScrollPane,JViewport及其相应的LayoutManagers的源代码。 在这一点上,我正在考虑将一个或多个子类化为更好(预测,导致更平滑的大小调整)实现。这似乎是其他人必须实现的行为。是否有另一种方法来使用现有的Container / LayoutManagers /方法来执行这没有子类化并冒着跨越不同LnF或平台的意外行为的风险? 编辑:我已经攻击了ScrollPaneLayout的原型子类。 它在添加滚动条之前检查视图的最小大小。 这是有效的(因为滚动条在视口小于视图的最小大小之前不会出现,而不是在视口小于视图的首选大小时显示滚动条的原始行为)但是当显示滚动条时,视图会认为它仍然是首选尺寸,而不是最小尺寸。 我也可能不得不破解ViewportLayout类,但这很快就会成为我怀疑会强大的东西。 编辑: 我回到基础并再次尝试了这些建议,并取得了成功。 我尝试重载ScrollPaneLayout和ViewportLayout的默认行为,以及它们之间的交互不是正确的方向。 在我第一次尝试之后,我确信在LayoutManagers完成他们的工作之后,没有办法避免我的“反应”方法的闪烁和不稳定性来修复不正确的大小。 幸运的是,有一种方法可以在没有子类化LayoutManager的情况下完成这项工作 – 如上所述,它是通过实现Scrollable接口(我之前已经正确完成,但没有进行其他更改以使其工作)。 诀窍的确是实现getScrollableTracksViewport(),使其根据视口大小返回true / false。 除了我正在做的其他计算之外,我还没有做的是更新视图的preferredSize。 这是至关重要的一步。 (请注意,我还依赖于侦听ComponentListener.componentResized()通知来触发正确设置返回值所需的计算。function代码如下所示,即可获得帮助。 @SuppressWarnings(“serial”) class ScalingScreenPanel extends JScrollPane { private static final Dimension PREFERRED_SIZE = new Dimension(800,200); private static ScalingScreen sScreen; […]

在Java中从Font对象创建一个Shape对象

我有一个字体对象和一个字符串。 我想返回一个Shape对象,它是String的表示forms。 我有一大堆其他类将显示String并处理它。 当我没有 graphics / graphics2d对象时,我无法弄清楚如何做到这一点。 任何帮助? 我在网上搜索但很难找到有用的链接。 public class SpecializationOfTester extends ParentTester { private String str; private Font font; public SpecializationOfTester(String str, Font font) { this.font = font; this.str = str; } public Shape getShape() { Shape s; // // return s; } } 谢谢

Spring JdbcTemplate和Threading

在Swing中使用JdbcTemplate分叉Thread以执行插入是否安全。 这是一个记录事件,我尽可能不希望它影响感知性能。

JTree有不同颜色的树线?

是否有可能在两个兄弟节点之间有不同的彩色树线? 我想通过连接它们的蓝线来显示这两个节点是链接的。 但是整个JTree默认颜色是灰色或黑色的角度线。 某些节点之间可能有部分不同的彩色线条吗?

如何使BoxLayout表现为垂直FlowLayout?

FlowLayout从右侧执行“压力”,因此所有组件都试图采用其最小宽度。 相反, BoxLayout尝试传播所有组件以填充整个空间高度。 我可以添加一些填充物作为最后一个组件或者某些东西,以使所有组件在BoxLayout具有最小高度吗?

在Java中,在哪里放置代码以在窗口关闭时可靠地触发?

我有几个窗口,我想保存默认值,在用户采取行动关闭窗口(通过标题栏中的按钮,菜单项或我提供的按钮)之后,在它被处理之前。 有些窗口我可以DISPOSE_ON_CLOSE但有些窗口我需要信息才能处理它们()。 formWindowClosed似乎只在窗口被处理时触发,我不能总是依赖它(见上下文 ) formWindowClosing似乎只有当用户从标题栏的系统菜单关闭窗口时才会触发,即使我在自己的菜单操作处理程序中调用System.exit(0) 根据GC文档,并不总是调用dispose()方法,并且在关闭应用程序时经常会忽略它。 我添加了一个ShutdownHook来运行System.runFinalization()但代码仍未执行。 这可能为时已晚,因为有些窗户将被处理掉。 如何在窗口处理之前确保代码运行? 窗口本身应该能够处理这项任务。 我对封闭,关闭和处置事件的不可靠性感到沮丧。 我错过了什么?

如何在Java Swing中正确地在两个不同的MVC控制器之间进行通信?

你能解释一下Controller如何以简单但仍然正确的方式调用另一个Controller方法吗? 请提供一些代码! 背景:我有2个不同的Controller-View-Model和2个库,他们需要在彼此之间进行通信: SettingsWindow / SettingsController / SettingsModel:负责应用程序设置。 该模型是单例,因为我需要整个应用程序的设置数据; 用于监视目录的库,每次在特定目录中创建文件时都会创建事件。 受监视的目录路径在SettingsModel中定义; 我正在使用Java 7 WatchService API; 用于监视Web服务器和下载新文件的库。 Web服务器地址和保存目录都在SettingsModel中定义; 我正在使用HttpsUrlConnection和一个计时器; MainWindow / MainController / MainModel:负责主应用程序窗口,该窗口具有必须在每次在受监视目录中创建新文件时更新的表,以及每次上述库下载文件时。 那么如何正确实例化和传达这4种不同的function呢? 他们的控制器如何在它们之间进行通信,因为它们都是相关的? 我应该如何根据MVC组织这个项目? 请提供基本的MVC脚手架(骨架)并显示我在哪里创建实例,在哪里以及如何调用彼此方法。 我是Java新手,特别是swing和mvc。 我已经阅读了很多,但我陷入了这种情况。

为什么我的样板Java桌面应用程序JFrame在main方法中使用EventQueue.invokeLater?

我正在使用最新的Eclipse和GWT Designer来用Java创建swing应用程序。 我的应用程序窗口中的主要function(这是一个javax.swing.JFrame)在工具生成的auto中如下所示: /* launch the application */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { AppWindow window = new AppWindow(); window.frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } 这似乎是围绕着这可能是一个很大的噪音: public static void main(String[] args) { try { AppWindow window = new AppWindow(); window.frame.setVisible(true); } […]

在最后修改区域扩展Jtree?

我正在使用dom4j从dom4j文档创建DocumentTreeModel。 我在JScrollPane显示了这个DocumentTreeModel。 我有一个按钮,为dom4j文档添加一个新节点,并重新创建DocumentTreeModel 我使用的是getPathForRow,但这看起来非常有限。 我需要能够使用多个树深度。 基本上寻找像tree.getPathOfLastModifiedChildrensParent()这样的东西 onAddNewNodeButtonClickEventFired { dom4jdocument.addElement( “1” ); tree.setModel(new DocumentTreeModel(dom4jdocument)); tree.expandPath(tree.getPathForRow(1)); } 基本上我每次编辑文档时都试图让Jtree重绘文档。