小编sco*_*ttb的帖子

FXML load()期间的JavaFX IllegalAccessException

我有一个由以下代码调用的对话框窗口(DialogController是一个使用模式对话框窗口的辅助类;它主要将控制器引用与其窗口捆绑在一起):

void handleServicesEdit(ActionEvent event) throws IOException {

    DCServRecEditor sre = DialogController.<DCServRecEditor>loadFXML(
            CensusAssistant.RES_FXML_DIALOG_SERVEDIT,
            CensusAssistant.RES_STRING_SERVEDIT,
            this.getDialog());
    sre.setDialogMode(DB.DBEDIT_MODE_EDIT,
                      tbvService.getItems(),
                      tbvService.getSelectionModel().getSelectedIndex(),
                      m_encCal);
    sre.showAndWait();

    sre.release();
    this.updateGUI();
}
Run Code Online (Sandbox Code Playgroud)

我已确认在该FXMLLoader.load()方法期间出现异常.我还确定错误发生在我的initialize()方法中的任何代码都有机会运行之前.我得到的一些堆栈跟踪load()在这里:

java.lang.IllegalAccessException: Class sun.reflect.misc.ReflectUtil 
    can not access a member of class org.kls.md.censusassistant.DCServRecEditor 
    with modifiers ""
file:/D:/Documents/NetBeansProjects/CensusAssistant/dist/run1284250063/CensusAssistant.jar!/org/kls/md/censusassistant/fxml/GUIServRecEditor.fxml:13
  at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:738)
  at javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(FXMLLoader.java:775)
  at javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.java:180)
  at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:563)
    at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2314)
  at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2131)
  at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2028)
  at org.kls.md.censusassistant.DialogController.loadFXML(DialogController.java:63)
  at org.kls.md.censusassistant.DCMainEditor.handleServicesEdit(DCMainEditor.java:330)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

        ...

Caused by: java.lang.IllegalAccessException: Class sun.reflect.misc.ReflectUtil
    can not access a member of class …
Run Code Online (Sandbox Code Playgroud)

javafx javafx-2 illegalaccessexception fxml

13
推荐指数
1
解决办法
8641
查看次数

当时区规则发生变化时,如何在Java中映射到历史上准确的本地时间?

我有一个包含UTC(GMT + 0)时间戳的数据库.问题在于:它们指的是在印第安纳州发生的计费活动.

有些人可能知道,印第安纳......

  • 在2006年之前没有观察到夏令时(大部分州都是美国东部时间全年).
  • 2006年投票决定保留美国东部时间,但开始与美国其他地区一起观察夏令时
  • 修改了2007年的规则; 美国联邦政府修订了夏令时,以便改变开始和结束规则

由于此数据库中的时间戳是指政府计费活动,因此实际上有必要将UTC时间戳报告为历史上准确的本地时间,以便保持审计准确性.因此,有三种情况唯一适用于印第安纳州:2006年之前的时间戳使用与2006-2007之间的时区规则完全不同的时区规则,2007年之后的时间规则使用另一组完全不同的时区规则.您可以想象这个数据库包含除印第安纳州以外的语言环境的活动,因此事情变得更加复杂.

Java Calendar和TimeZone API不包含允许程序员创建具有多个时区规则集的对象的任何类,因此如果特定的适用时区,它们不能用于正确映射UTC时间戳到历史上准确的本地时间规则永远改变.

我已经考虑过如何通过改变时区规则来解决在语言环境中映射到历史上准确的本地时间的问题......

  • 可以更新数据库,以便可以将UTC时间戳与本地时间偏移和夏令时偏移一起存储.这里的问题是数据库的大小增加了一点,如果现有数据库很大,那么更新所有表可能需要扩展的离线维护周期.

  • 可以更新数据库,以便与每个时间戳一起存储适合于该特定时间戳的特定TimeZone对象.虽然我认为TimeZone对象非常轻量级,但我认为它比上面的更灵活,但仍然不太理想,因为它需要为每个时间戳保留一个对象.

  • 可以开发一个自定义API,用于从感兴趣的语言环境的历史准确规则的数据库构建适当的TimeZone对象.该解决方案取代了前两种解决方案增加的存储需求,需要额外的处理.每个需要显示的时间戳都意味着创建一个新对象......或者至少与对象池中的适当对象配对.此外,它还意味着创建和管理时区数据库.

Java时间和日历API的局限性使得找到一个优雅的解决方案来解决这个问题真的比它应该更难(例如,您不能查询现有的SimpleTimeZone对象并询问它遵循什么夏令时规则而不写一些真是凌乱的代码).

我想问一下其他人是否曾经处理过这样的情况,以及他们是如何处理的.

java time timezone calendar gregorian-calendar

8
推荐指数
1
解决办法
748
查看次数

JavaFX 2.2:如何强制重写/更新ListView

我在JavaFX 2模式对话框窗口中有一个ListView控件.

此ListView显示DXAlias实例,其列表单元由单元工厂制造.工厂对象所做的主要工作是检查ListView的UserData属性数据,并将其与ListCell对应的项进行比较.如果它们相同,则ListCell的内容将呈现为红色,否则为黑色.我这样做是为了指示ListView中的哪些项目当前被选为"默认".这是我的ListCell工厂类,所以你可以看到我的意思:

private class AliasListCellFactory implements 
    Callback<ListView<DXSynonym>, ListCell<DXSynonym>> {

@Override
public ListCell<DXSynonym> call(ListView<DXSynonym> p) {
    return new ListCell<DXSynonym>() {

    @Override
    protected void updateItem(DXSynonym item, boolean empty) {
        super.updateItem(item, empty);

        if (item != null) {
            DXSynonym dx = (DXSynonym) lsvAlias.getUserData();

            if (dx != null && dx == item) {
                this.setStyle("-fx-text-fill: crimson;");                    
            } else { this.setStyle("-fx-text-fill: black;"); }

            this.setText(item.getDxName());

        } else { this.setText(Census.FORMAT_TEXT_NULL); }
    }};
}
Run Code Online (Sandbox Code Playgroud)

我有一个名为"handleAliasDefault()"的按钮处理程序,它通过获取所选的DXAlias实例并将其存储到ListView:lsvAlias.setUserData(选定的DXAlias),使ListView中的选定项成为新的默认值.这是处理程序代码:

// Handler for Button[fx:id="btnAliasDefault"] onAction
    @FXML
    void handleAliasDefault(ActionEvent event) {

        int sel = lsvAlias.getSelectionModel().getSelectedIndex(); …
Run Code Online (Sandbox Code Playgroud)

java listview javafx-2

8
推荐指数
4
解决办法
3万
查看次数

如何在Java Calendar API中使用Julian Day Numbers?

Julian Day Numbers是一种将时间戳表示为自公元前4713年1月1日中午UTC以来连续天数(和小数天数)的方法.Java 7 SE API不包含对此格式的支持.使用过SQLite数据库的开发人员可能使用了strftime()函数提供的本机Julian Day支持.

将时间戳表示为Julian Day Numbers的优点包括:

  • 日期和时间可以表示为基本数据类型的毫秒精度(双精度)
  • 一年中的日子比一天中的几天更具体
  • 如果这种精确度不重要,可以解决"闰秒"的问题
  • 日期算术之间的天数是微不足道的; 排序优先级很容易确定
  • 很轻巧

缺点

  • Java Date/Time API没有对JDN的内置支持
  • 不适合进行非常精确的时间测量
  • 仅为UTC定义,必须从UTC映射到本地时间
  • 不适合向最终用户展示; 必须在显示之前转换/格式化

朱利安日数通常用于天文计算,其定义高度标准化并被接受.同样,修改后的朱利安日数(从1858年11月17日午夜开始计算)是标准定义并用于航空航天应用(见http://tycho.usno.navy.mil/mjd.html).

对于广泛使用日期/时间算法或按时间顺序排序的应用程序(或者如果持久化轻量级基元比持久化时间戳更具吸引力),在内部将日期和时间表示为JDN或MJD可能对您有意义.

以下代码定义了有助于将Julian Day Numbers或Modified Julian Day Numbers与Java Date/Time/Calendar API一起使用的函数.该代码基于Jean Meeus的"Astronomical Algorithms",第1版,1991年发表的算法.

public class JulianDay {

    private static final int YEAR = 0;
    private static final int MONTH = 1;
    private static final int DAY = 2;
    private static final int HOURS = 3;
    private static final int MINUTES = 4;
    private static final …
Run Code Online (Sandbox Code Playgroud)

java timestamp calendar date julian-date

7
推荐指数
2
解决办法
7021
查看次数

JavaFX 2 TextArea:如何阻止它消耗[Enter]和[Tab]

我想使用JavaFX TextArea,就好像它就像一个多行的TextField.换句话说,当我按[Tab]时,我想循环到窗体上的下一个控件,当我按下[Enter]时,我希望Key.Event转到defaultButton控件(而不是被TextArea使用).

TextArea的默认行为是[Tab]插入TextArea并且[Enter]插入换行符.

我知道我需要使用EventFilters来获取我想要的行为,但是我弄错了.我不希望TextArea使用这些事件......我只是希望它让它们"顺利进行".

textarea event-handling javafx-2

7
推荐指数
1
解决办法
6971
查看次数

如何用Spring验证密码

我已经找到了如何散列某个密码并使用SpringMVC将其保存在数据库中:

BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String pw = passwordEncoder.encode("test");
Run Code Online (Sandbox Code Playgroud)

现在的问题是,我如何验证来自请求的密码,让用户登录我的网络应用程序?经过一些研究,我看到,有很多方法可以做到这一点.一些解决方案适用于用户角色.

我的webapps应该做的是为我的用户提供一个他们可以注册的登录页面(这里我将使用上面显示的代码保存密码).注册后,他们应该能够登录,这意味着我需要从登录表单验证密码.那里有最先进的例子吗?

java authentication passwords spring

7
推荐指数
2
解决办法
6126
查看次数

Java:为什么我能够引用具体参数化类型的非null数组?

我很惊讶,但是...这个编译:

public <T extends Database> ColMetaData<T>[] getTableColumnsAsEnums() {
            Class<? extends ColMetaData> cls = this.columnsEnumToken();
            return cls.<ColMetaData<T>[]>getEnumConstants(); }
Run Code Online (Sandbox Code Playgroud)

这是columnsEnumToken的方法:

// Returns a class token for an enum class
public Class<? extends ColMetaData> columnsEnumToken()  { 
    return this.e_colsToken; 
}
Run Code Online (Sandbox Code Playgroud)

(我想我可以看到为什么下面的第二行不能编译)

一些问题:

  • 这种方法"类型安全"吗?

  • 为什么这行编译:

    Class<? extends ColMetaData> cls = this.columnsEnumToken();

    但由于类型不兼容,这个无法编译:

    Class<? extends ColMetaData<T>> cls = this.columnsEnumToken();

  • 为什么getTableColumnsAsEnums()返回一个具体参数化类型数组的方法是合法的,ColMetaData<T>[].我曾经认为这些是严格禁止的,因为没有运行时方式让它们安全地操作类型.

java arrays generics

6
推荐指数
1
解决办法
128
查看次数

Java:是枚举数组的最终引用吗?

我认为对枚举数组的最终引用应该是不可变的.

枚举的唯一性和单一性由JVM强制执行,因此我认为可以说它们是不可变的.

最终引用不能更改,因此引用是不可变的.

但是......阵列怎么样?可能仍有可能破坏包含枚举引用的数组吗?

我有一个与数据库列对应的枚举列表.这些列名称及其相关数据不会更改,因此...我希望将列表作为类变量,如下所示:

static final List<MetaData<Client>> C_COLUMNS =
        DataTables.CLIENTS.getTableColumnsAsEnums();
Run Code Online (Sandbox Code Playgroud)

其中CLIENTS是DataTable枚举,为其生成列枚举列表.执行此操作的方法如下:

public <T extends DB> List<MetaData<T>> getTableColumnsAsEnums() {
    Class<? extends MetaData> cls = this.columnsEnumToken();
    return new ArrayList(Arrays.<MetaData<T>>asList(cls.getEnumConstants())); }
Run Code Online (Sandbox Code Playgroud)

我对吗?这应该成为多线程设计的一部分,所以我担心这个关键的静态数据列表会被应用程序非常容易呈现的方式...如果它实际上是可变的.

java enums multithreading final immutability

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

Java:不会编译 - 必须兼容的不兼容类型

这段代码不会编译,我不明白为什么.错误位于指定的行:

   static <T extends DB> T createModelObjectFromCopy(T fromRow) {
            T mo = null;
            try {
   -->          mo = fromRow.getClass().newInstance();
            } catch (InstantiationException | IllegalAccessException ex) {
                Logger.getLogger(DBTypes.Table.class.getName()).log(Level.SEVERE, null, ex);
            }
            return Table.initializeFromCopy(mo, fromRow);
        }
    }
Run Code Online (Sandbox Code Playgroud)

fromRow 是一个包装不可变类型的值对象.

从声明中可以清楚地知道fromRow必须是类型T.变量mo必须是完全相同的类型T.

为什么不能将反射实例化的新实例分配给mo?我认为通过返回的类对象fromRow.getClass()Class<T>newInstance()-should-实例化的新实例T.

java generics casting

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

Connection 对象可以与构造函数之外的 JDBC RowSet 实例一起使用吗?

我知道可以使用传递给其构造函数的 Connection 对象创建 JDBC RowSet 实例,例如:

Connection con = MyDAO.getConnection();
JdbcRowSet jrs = new JdbcRowSetImpl(con);
Run Code Online (Sandbox Code Playgroud)

两个问题:

  • 每次我构建包含 JdbcRowSetImpl 任何用途的项目时,我的 Java SE 7 都会抱怨。它说 JdbcRowSetImpl 是供应商特定的实现,它可能会从 JDK 的未来版本中删除。我觉得这很奇怪,因为 Java 教程继续在其 JDBC 部分使用 JdbcRowSetImpl。Oracle 真的打算从 JDK 中逐步淘汰工厂 RowSet 实现吗?如果没有,有没有办法停止警告消息?

这是警告之一。当我尝试在代码中使用 JdbcRowSet 构造函数或尝试导入包时会发生这种情况

C:\Users\Ribose\Documents\NetBeansProjects\CensusAssistant\src\org\kls\md\censusassistant\db\DB.java:170:
 warning: JdbcRowSetImpl is internal proprietary API and may be removed in a future release
            jrs = new JdbcRowSetImpl(con);
Run Code Online (Sandbox Code Playgroud)

我正在使用 NetBeans IDE 7.3 进行构建。RDBMS 是 HSQLDB 2.2.9。我有最新的 JDK SE 7。

  • 假设我已经有一个 JdbcRowSet 实例。虽然它没有连接,但我已经有一个 Connection 对象,但无法访问身份验证凭据,即我有对象,但不需要 user_id 或密码来建立新的连接。

我可以将现有的 Connection 对象与现有的 …

java database connection jdbc

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