该HashSet的类有一个附加(对象o)方法,这是不从另一个类继承的.该方法的Javadoc说明如下:
如果指定的元素尚不存在,则将其添加到此集合中.更正式地,将指定的元素
e这套如果此集合不包含任何元素e2,使得(e==null ? e2==null : e.equals(e2)).如果此set已包含该元素,则调用将保持set不变并返回false.
换句话说,如果两个对象相等,则不会添加第二个对象,并且HashSet将保持不变.然而,我发现,这是不正确的,如果对象e和e2,有不同的哈希码尽管e.equals(e2).这是一个简单的例子:
import java.util.HashSet;
import java.util.Iterator;
import java.util.Random;
public class BadHashCodeClass {
/**
* A hashcode that will randomly return an integer, so it is unlikely to be the same
*/
@Override
public int hashCode(){
return new Random().nextInt();
}
/**
* An equal method that will always return true
*/
@Override
public boolean equals(Object o){
return true; …Run Code Online (Sandbox Code Playgroud) 在Swing中可以在JTable中创建一个JComboBox,如本指南所示.他们有一张可爱的图片,展示了这一点:

但是,未能显示的是,如果您没有单击该单元格,则下拉箭头不可见,它看起来像普通文本标签,如下所示:

您可以看到针织有下拉箭头,因为我只是点击它,但其他人没有.遗憾的是,这并不理想,因为没有视觉提示可以单击单元格来显示选项列表.换句话说,"Sport"列看起来与"Last Name"列相同.其中一个是下拉列表,另一个不是,但它们在视觉上看起来相同,除非您碰巧点击其中一个.
有什么办法可以在Swing中完成吗?
编辑:澄清一下,我想要的是"运动"栏中的所有单元格都有箭头指示下拉菜单,即使它们不是最少点击的.基本上,我希望它看起来像一个组合框,无论我是否点击它.
假设我想以这样的方式在Java中创建一个按钮,这样当你点击它时,就会出现一个JPopupMenu.它出现的相关代码是menu.show(button, button.getWidth()/2, button.getHeight()/2);,它使JPopupMenu的左上角显示在按钮的中心,如下所示:

但是,我希望它能让左下角位于按钮的中心,就像iTunes一样(左下角有一个按钮,与左边的+按钮大小相同)它):

我试图通过获取JPopupMenu的高度并将其添加到弹出菜单显示的y坐标来实现这一点,但我发现JPopupMenu在可见之前的高度为0,而不是帮助我,因为我试图告诉计算机在哪里可见.此外,不可能在偏移中进行硬编码,因为弹出窗口中的项目数量不一定相同.
如何才能使我的JPopupMenu具有未知高度,以便它的左下角坐标与给定坐标匹配?
我想为用户创建一个大文本字段来输入内容.我还希望它使用默认的系统字体来匹配预期的外观.所以我尝试使用JEditorPane和默认构造函数,它使用纯文本编码.
JEditorPane editorPane = new JEditorPane();
editorPane.setText(gettysburgAddress);
Run Code Online (Sandbox Code Playgroud)

这样做的问题在于,纯文本编码不会在每个单词的末尾换行到换行符,只有当它用完字符时才会换行.
我尝试使用HTML编码,这个词包装:
JEditorPane editorPane = new JEditorPane("text/html", "");
editorPane.setText(gettysburgAddress);
Run Code Online (Sandbox Code Playgroud)

这有自动换行,但它默认为不同于系统默认的字体(Mac OS X上的Helvetica,我不想要.
我怎样才能充分利用这两个方面:自动换行和系统默认字体?我不需要任何特殊的格式或任何东西,所以如果可能的话,纯文本编码将会做.
Java中的BufferedImage类包含一个getType()方法,该方法返回与BufferedImage常量类型变量相关的整数,该变量描述有关如何编码图像的一些信息(您可以查看BufferedImage源以确定哪个数字对应于常量类型变量).例如,如果它返回与之对应的整数BufferedImage.TYPE_3BYTE_BGR,则表示BufferedImage是8位RGB图像,没有alpha,蓝色,绿色和黄色各自用3位表示.
其中一些图像类型似乎与特定格式的某些属性相关.例如,TYPE_BYTE_INDEXED它表示它是由"256色6/6/6颜色立方体调色板"创建的.这听起来很像GIF图像,它是由256种颜色创建的.
好奇,我在硬盘上扫描了几百张照片ImageIO.read(File file),然后将BufferedImage.getType()它们转换为BufferedImage ,然后调用它们.我确定只有少数BufferedImage类型是从某些图像类型生成的.结果如下:
JPG: TYPE_3BYTE_BGR,TYPE_BYTE_GRAY
PNG: TYPE_3BYTE_BGR,TYPE_BYTE_GRAY,TYPE_4BYTE_BGRA
GIF: TYPE_BYTE_INDEXED
虽然看起来JPG和PNG共享一些类似的BufferedImage常量类型,但在我的测试中只有一个PNG导致了一个TYPE_4BYTE_BGRA并且每个GIF都产生了一个TYPE_BYTE_INDEXED.
我对图像格式不太熟悉,而且我的样本量并不是那么大.所以我想我会问:假设图像格式正确,某些图像类型是否总是导致具有某些常量类型的BufferedImages?为了提供一个具体的例子,正确格式化的GIF图像是否总是对应于TYPE_BYTE_INDEXED?或者所有格式正确的图像是否可以与所有BufferedImage常量类型相对应?
我正在创建一个桌面Java应用程序,并希望创建两个版本:免费和付费.差异主要在于包含哪些资源文件(在将来的日期,它可能涉及不同的代码,但现在不是).
我已经阅读了关于Android构建变体的内容,通过"产品风格"允许这种事情.但是,这似乎是该android插件独有的功能,显然在桌面上不可用.
是否有相当于这些产品的味道,不依赖于android插件?
如果它有帮助,我的最终目标是找到一种方法,我可以运行Gradle build任务并输出两个不同版本的应用程序,这是我对Android构建变体完成的内容的理解.
我正在尝试使用Java Dependency Analysis Tool (jdeps)。首先,我尝试在没有参数的情况下这样做:
jdeps myJar.jar
Run Code Online (Sandbox Code Playgroud)
它列出了它使用的依赖项。到现在为止还挺好。
org.example (myJar.jar)
-> java.io
-> java.lang
-> java.text
-> java.util
[...]
Run Code Online (Sandbox Code Playgroud)
然而,使用的最大原因jdeps是检测在 Java 9 中无法访问的sun.*包(例如包)的依赖关系。所以我尝试使用-jdkinternals标志来检查这些不兼容性。因此我的命令是:
jdeps -jdkinternals myJar.jar
Run Code Online (Sandbox Code Playgroud)
但是,当我运行它时没有输出。这是否意味着它无法运行?我错过了什么?
我正在使用 Gradle 并拥有我的存储库配置,这需要凭据。当我对用户名和密码进行硬编码时,一切正常。当我尝试将这些相同的凭据存储在gradle.properties其中时,却没有。
我的文件中的存储库声明build.gradle基本上如下所示:
repositories {
maven {
url 'https://artifactory.example.com/libs/'
credentials {
username "myUsername"
password "myPassword"
}
}
}
Run Code Online (Sandbox Code Playgroud)
一切都很好,我可以连接到我的存储库。
正如您在上面看到的,用户名和密码是硬编码的。我想使其可配置,因此我按照此问题中的建议将以下属性添加到gradle.properties.
storedUsername = "myUsername"
storedPassword = "myPassword"
Run Code Online (Sandbox Code Playgroud)
然后我修改该build.gradle文件以引用这些属性:
repositories {
maven {
url 'https://artifactory.example.com/libs/'
credentials {
username project.storedUsername
password project.storedPassword
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我突然无法连接到我的存储库。当我检查服务器(Artifactory)日志时,我被告知无名用户的访问被拒绝。
这两个文件作为同级文件都位于根目录中。我已添加println "Username: ${project.repoUsername}"到该repositories{}块以及configurations {}和dependencies{}块。它们都正确地返回了它们应该返回的值。
我怀疑这可能是一个范围问题,但我无法弄清楚它在哪里。我该怎么做才能将存储库放在外部文件中并将凭据放在 中gradle.properties?
假设我想运行以下 SQLite 命令来删除特定表中 Name 列为 NULL 的所有行:
DELETE FROM myTable WHERE Name IS NULL;
Run Code Online (Sandbox Code Playgroud)
现在假设我有 20 个表,它们没有以任何模式命名。我想从数据库中的每个表中删除 Name 列为 NULL 的所有行。有没有我可以一次使用的语句?或者我是否必须运行一个语句来获取表名,然后获取输出并使用每个表名运行 20 个左右的命令?
我想在Swing中创建类似下面的内容:

顶部相对容易:我可以创建一个表并显示它.我遇到的问题是底部的方形加号和减号按钮,它们分别用于添加新项目或删除所选项目.特别是,我无法制作方形,因为在Mac OS X和其他一些平台上,JButtons是带圆角的矩形,我找不到改变它的方法.此外,我想确保它是一个完美的正方形,按钮之间没有任何空间.
如何在Swing上以跨平台的方式实现这一目标?
java ×7
swing ×4
gradle ×2
artifactory ×1
hashcode ×1
hashset ×1
image ×1
java-7 ×1
jbutton ×1
jcombobox ×1
jdeps ×1
jeditorpane ×1
jpopupmenu ×1
jtable ×1
sqlite ×1