小编Thu*_*rge的帖子

如果哈希码不同,为什么HashSet允许相等的项?

HashSet的类有一个附加(对象o)方法,这是不从另一个类继承的.该方法的Javadoc说明如下:

如果指定的元素尚不存在,则将其添加到此集合中.更正式地,将指定的元素e这套如果此集合不包含任何元素e2,使得(e==null ? e2==null : e.equals(e2)).如果此set已包含该元素,则调用将保持set不变并返回false.

换句话说,如果两个对象相等,则不会添加第二个对象,并且HashSet将保持不变.然而,我发现,这是不正确的,如果对象ee2,有不同的哈希码尽管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)

java hashcode hashset

5
推荐指数
2
解决办法
6913
查看次数

在JTable中创建JComboBox,下拉列表始终可见

在Swing中可以在JTable中创建一个JComboBox,如本指南所示.他们有一张可爱的图片,展示了这一点:

在此输入图像描述

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

在此输入图像描述

您可以看到针织有下拉箭头,因为我只是点击它,但其他人没有.遗憾的是,这并不理想,因为没有视觉提示可以单击单元格来显示选项列表.换句话说,"Sport"列看起来与"Last Name"列相同.其中一个是下拉列表,另一个不是,但它们在视觉上看起来相同,除非您碰巧点击其中一个.

有什么办法可以在Swing中完成吗?

编辑:澄清一下,我想要的是"运动"栏中的所有单元格都有箭头指示下拉菜单,即使它们不是最少点击的.基本上,我希望它看起来像一个组合框,无论我是否点击它.

java swing jtable jcombobox

5
推荐指数
1
解决办法
5923
查看次数

使用某个左下角坐标进行JPopupMenu显示

假设我想以这样的方式在Java中创建一个按钮,这样当你点击它时,就会出现一个JPopupMenu.它出现的相关代码是menu.show(button, button.getWidth()/2, button.getHeight()/2);,它使JPopupMenu的左上角显示在按钮的中心,如下所示:

当前Swing JPopupMenu

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

在此输入图像描述

我试图通过获取JPopupMenu的高度并将其添加到弹出菜单显示的y坐标来实现这一点,但我发现JPopupMenu在可见之前的高度为0,而不是帮助我,因为我试图告诉计算机在哪里可见.此外,不可能在偏移中进行硬编码,因为弹出窗口中的项目数量不一定相同.

如何才能使我的JPopupMenu具有未知高度,以便它的左下角坐标与给定坐标匹配?

java swing jpopupmenu

4
推荐指数
1
解决办法
3274
查看次数

JEdi​​torPane和系统字体中的自动换行

我想为用户创建一个大文本字段来输入内容.我还希望它使用默认的系统字体来匹配预期的外观.所以我尝试使用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 swing jeditorpane java-7

4
推荐指数
1
解决办法
6305
查看次数

某些图像文件类型是否始终与某些BufferedImage常量类型相对应?

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 bufferedimage image

4
推荐指数
1
解决办法
1054
查看次数

相当于非Android Gradle中的产品风味?

我正在创建一个桌面Java应用程序,并希望创建两个版本:免费和付费.差异主要在于包含哪些资源文件(在将来的日期,它可能涉及不同的代码,但现在不是).

我已经阅读了关于Android构建变体的内容,通过"产品风格"允许这种事情.但是,这似乎是该android插件独有的功能,显然在桌面上不可用.

是否有相当于这些产品的味道,不依赖于android插件?

如果它有帮助,我的最终目标是找到一种方法,我可以运行Gradle build任务并输出两个不同版本的应用程序,这是我对Android构建变体完成的内容的理解.

gradle android-gradle-plugin android-productflavors

4
推荐指数
1
解决办法
989
查看次数

使用 -jdkinternals 时没有 jdeps 输出

我正在尝试使用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)

但是,当我运行它时没有输出。这是否意味着它无法运行?我错过了什么?

java jdeps

4
推荐指数
1
解决办法
866
查看次数

如果存储库凭据是硬编码的,则它们可以工作,但如果它们来自 gradle.properties,则不行

问题

我正在使用 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

artifactory gradle

4
推荐指数
1
解决办法
6197
查看次数

如何将 SQLite 命令应用于所有表

假设我想运行以下 SQLite 命令来删除特定表中 Name 列为 NULL 的所有行:

DELETE FROM myTable WHERE Name IS NULL;
Run Code Online (Sandbox Code Playgroud)

现在假设我有 20 个表,它们没有以任何模式命名。我想从数据库中的每个表中删除 Name 列为 NULL 的所有行。有没有我可以一次使用的语句?或者我是否必须运行一个语句来获取表名,然后获取输出并使用每个表名运行 20 个左右的命令?

sqlite

3
推荐指数
1
解决办法
2520
查看次数

在Swing中创建方形按钮

我想在Swing中创建类似下面的内容:

在此输入图像描述

顶部相对容易:我可以创建一个表并显示它.我遇到的问题是底部的方形加号和减号按钮,它们分别用于添加新项目或删除所选项目.特别是,我无法制作方形,因为在Mac OS X和其他一些平台上,JButtons是带圆角的矩形,我找不到改变它的方法.此外,我想确保它是一个完美的正方形,按钮之间没有任何空间.

如何在Swing上以跨平台的方式实现这一目标?

java swing jbutton

3
推荐指数
2
解决办法
1万
查看次数