带有匿名EventListener的JPanel – 为什么GC不会破坏侦听器?

我一直在仔细阅读JMapViewer的开源代码。 如果有其他人希望查看它,请检查SVN 。 简而言之,主类是JMapViewer ,它是JPanel的扩展。 还有另一个非常重要的类,名为DefaultMapController ,它充当主类的MouseListener 。 我注意到的第一个奇怪的事情是观众没有对控制器的引用。 JMapViewer构造函数实例化DefaultMapController的匿名实例,如下所示: public JMapViewer() { // other stuff new DefaultMapController(this); } 在我看来这是一个糟糕的设计选择,因为控制器有很多方法(选项,切换等 – 下面显示的例子),现在根本无法访问,所以有什么好处呢? public void setMovementMouseButton(int movementMouseButton) { // changes which mouse button is used to move the map } 控制器确实有一个对查看器的引用,如上面的第一个片段所示,这是它能够控制的方式。 然而,那时我想到的东西更怪异! 如果这个监听器的匿名实例没有引用,为什么它甚至可以存活? GC不应该迅速摧毁它吗? 或者GC是否足够聪明,知道引用实时JComponent的侦听器类也必须保持活动才能正常工作,即使它由于某些奇怪的原因而没有名称? 那么,两个真正的问题: 为什么GC不会破坏对象? 这确实是一个糟糕的设计选择,还是有一些方法我不知道从实例化查看器的类访问控制器? 我想为这个开源库做贡献,我改变的第一个想法是改变JMapViewer类,让一个字段引用它的控制器,并改变构造函数,将当前的匿名控制器分配给这个新字​​段。 但是,我想确保我不会无知地遗漏某些东西。 我在整个代码库中搜索了DefaultMapController文本,它只出现在它自己的类定义中,以及JMapViewer构造函数中的匿名实例化中。 编辑: 确实有一种方法可以通过使用java.awt.Component方法getMouseListeners()来访问匿名侦听器。 因此,在我的应用程序中,我可以在此集合中搜索DefaultMapController实例,并使用它来访问我需要用来更改控制器选项的方法。 但是,为了扮演魔鬼的拥护者,如果我采用原创的想法并给地图作为其控制器的参考,现在我有一种循环参考(地图知道控制器和控制器知道地图)。 这是一个坏主意吗?

获得正确的图像观察者来旋转图像

所以我画了一个BufferedImage’鸟’,但我想根据它落下的角度旋转它。 我有一个鸟对象,它包含BufferedImage和一个render()方法,它旋转绘制它。 public void render(Graphics2D g, ImageObserver io) { double theta = Math.tan((height – pastHeight) / .875); System.out.println(theta); Graphics2D g2 = (Graphics2D) bird.getGraphics(); g2.drawImage(bird, 100, (int) height, null); g2.rotate(theta); g2.drawImage(bird, 100, (int) height, io); } 我这样称呼它 bird.render(g2, ???); 在我的jcomponent中的paintcomponent方法中。 唯一的问题是我不知道该使用什么作为我的ImageObserver …我已经尝试传递我的JFrame和我的JComponent但是当我这样做时图像不再出现…我会传递什么图像出现在我的窗口和/或我怎么能实现这种旋转?

JFrame与背景图像和JPanel

我有以下内容: public class Frame { public static void main(String[] args) { JFrame frame = new JFrame(“Frame Demo”); Panel panel = new Panel(); frame.add(panel); frame.setBounds(250,100,800,500); frame.setVisible(true); } } public class Panel extends JPanel { JButton singlePlayerButton; JButton multiPlayerButton; BufferedImage image; Gui gui; public Panel() { gui = new Gui(); add(gui); try { image = ImageIO.read(new File(“C:\\Users\\void\\workspace\\BattleShips\\src\\Testumgebung\\background\\battleship_main.jpg”)); […]

通过具体(Java)示例进行乐观锁定

我早上花了很多时间阅读谷歌在乐观锁定方面所做的所有热门文章,而对于我的生活,我仍然没有真正理解。 我理解乐观锁定涉及添加用于跟踪记录的“版本”的列,并且该列可以是时间戳,计数器或任何其他版本跟踪构造。 但我仍然不明白如何确保WRITE完整性(意味着如果多个进程同时更新同一个实体,那么之后,实体正确地反映了它应该处于的真实状态)。 有人可以提供一个具体的,易于理解的例子,说明如何在Java中使用乐观锁定(可能是MySQL DB)。 假设我们有一个Person实体: public class Person { private String firstName; private String lastName; private int age; private Color favoriteColor; } 并且Person实例被持久化到一个people MySQL表: CREATE TABLE people ( person_id PRIMARY KEY AUTO_INCREMENT, first_name VARCHAR(100) NOT NULL, last_name VARCHAR(100) NOT NULL, # } I realize these column defs are not valid but this is just […]

Android – Firebase – 将用户发送到聊天室

目标 允许用户访问他们选择的群聊。 用户单击群聊名称后,将进入群聊。 数据库树 如数据库树中所示,将显示当前已登录用户的已创建的群聊名称列表。 我有一个管理员帐户来为用户创建这些群聊。 在数据库中看到的Android,亚洲和欧洲组聊天不是固定变量。 他们是名字。 新的群聊名称可以是“地球”。 因此,除了由Node本身调用它之外,没有办法通过变量调用它。 应用截图 组聊天列表2.进入群聊 活动流程 GroupFragment —>聊天活动 GroupFragment <—聊天活动 申请流程 用户—> LoginActivity —> UserActivity —> GroupFrag —> GroupChatActivity 在(GroupFrag —> GroupChatActivity)用户必须在GroupFrag中选择一个群聊名称才能进入GroupChatActivity 用户必须在GroupFrag中选择一个群聊名称才能输入GroupChatActivity 描述 用户将能够选择群聊名称(来自GroupFragment),该应用程序将使用户进入群聊(进入聊天活动)。 用户将能够返回GroupFragment并选择另一个所需的组。 (群聊名称未固定 – 它们不是可以从中调用的节点) 问题 在片段中提示后,我无法选择群聊名称,这将带我进入群聊。 集团片段 @Override public void onStart() { super.onStart(); class GroupAdapter extends RecyclerView.Adapter { ArrayList list; public GroupAdapter(ArrayList list) […]

为什么在哈希映射中使用空值或空键是有用的?

Hashtable不允许使用null键或值,而HashMap允许使用空值和1个null键。 问题: 为什么会这样? 在HashMap中使用这样的键和值有什么用?

如何在Joda-Time获得正确的当前日期和时间?

如何在Joda Time获得正确的实际日期和时间? 适当地,我指的是在我的国家的时间。 我阅读了官方网页和一些教程 – 关于Locales和时区的内容很多,但我发现它很混乱。 我没有找到任何例子如何简单地得到它。 我需要两件事: 1)在争论中获得最新信息 2)获取当前时间,我将与出生日期“比较”并计算年龄。 如何设置UTC + 1(布拉格 – 捷克共和国)时的当前时间? 谢谢

将带有网格线的jTable行复制到excel / word文档中

是否可以复制jTable行并将其粘贴到word文档或带有格式化网格的新电子邮件中(彩色水平和垂直网格线)..如果是,如何? 当我从jTable复制一行并将其粘贴到word文档中时,Word会将其识别为表格行,但我必须通过添加网格线并将其着色来设置它的样式

需要访问系统权限

我试图从data/data访问我的应用程序的文件夹,但它需要将权限更改为0777 。 所以,我使用了一些可以在运行时更改的代码,但权限没有改变。 它给我错误open failed: EACCES (Permission denied) 。 我也把这个权限放在Marshmallow下面的清单文件中我需要像root explorer那样给我们更改文件夹rwxrwxrw 这是我的代码 String[] command = new String[]{“/system/bin/ls”, “0777”, “/data/data/com.ayub.android.baba” }; process = Runtime.getRuntime().exec(command); BufferedReader reader = new BufferedReader( new InputStreamReader(process.getInputStream())); int read; String output = “”; String line; while ((line = reader.readLine()) != null) { output.concat(line + “\n”); Log.w(“myApp”, “[[output]]:” + line); process.waitFor(); } reader.close(); […]

如果jsf数据表为空,如何显示消息?

使用JSF1.2,如果我的数据表绑定没有返回任何行,我想显示一条消息。 我怎么做? 而对于额外的积分 – 如果它是空的,我如何完整地隐藏表? 谢谢。