我有一个由以下代码调用的对话框窗口(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) 我有一个包含UTC(GMT + 0)时间戳的数据库.问题在于:它们指的是在印第安纳州发生的计费活动.
有些人可能知道,印第安纳......
由于此数据库中的时间戳是指政府计费活动,因此实际上有必要将UTC时间戳报告为历史上准确的本地时间,以便保持审计准确性.因此,有三种情况唯一适用于印第安纳州:2006年之前的时间戳使用与2006-2007之间的时区规则完全不同的时区规则,2007年之后的时间规则使用另一组完全不同的时区规则.您可以想象这个数据库包含除印第安纳州以外的语言环境的活动,因此事情变得更加复杂.
Java Calendar和TimeZone API不包含允许程序员创建具有多个时区规则集的对象的任何类,因此如果特定的适用时区,它们不能用于正确映射UTC时间戳到历史上准确的本地时间规则永远改变.
我已经考虑过如何通过改变时区规则来解决在语言环境中映射到历史上准确的本地时间的问题......
可以更新数据库,以便可以将UTC时间戳与本地时间偏移和夏令时偏移一起存储.这里的问题是数据库的大小增加了一点,如果现有数据库很大,那么更新所有表可能需要扩展的离线维护周期.
可以更新数据库,以便与每个时间戳一起存储适合于该特定时间戳的特定TimeZone对象.虽然我认为TimeZone对象非常轻量级,但我认为它比上面的更灵活,但仍然不太理想,因为它需要为每个时间戳保留一个对象.
可以开发一个自定义API,用于从感兴趣的语言环境的历史准确规则的数据库构建适当的TimeZone对象.该解决方案取代了前两种解决方案增加的存储需求,需要额外的处理.每个需要显示的时间戳都意味着创建一个新对象......或者至少与对象池中的适当对象配对.此外,它还意味着创建和管理时区数据库.
Java时间和日历API的局限性使得找到一个优雅的解决方案来解决这个问题真的比它应该更难(例如,您不能查询现有的SimpleTimeZone对象并询问它遵循什么夏令时规则而不写一些真是凌乱的代码).
我想问一下其他人是否曾经处理过这样的情况,以及他们是如何处理的.
我在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) Julian Day Numbers是一种将时间戳表示为自公元前4713年1月1日中午UTC以来连续天数(和小数天数)的方法.Java 7 SE API不包含对此格式的支持.使用过SQLite数据库的开发人员可能使用了strftime()函数提供的本机Julian Day支持.
将时间戳表示为Julian Day Numbers的优点包括:
缺点
朱利安日数通常用于天文计算,其定义高度标准化并被接受.同样,修改后的朱利安日数(从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) 我想使用JavaFX TextArea,就好像它就像一个多行的TextField.换句话说,当我按[Tab]时,我想循环到窗体上的下一个控件,当我按下[Enter]时,我希望Key.Event转到defaultButton控件(而不是被TextArea使用).
TextArea的默认行为是[Tab]插入TextArea并且[Enter]插入换行符.
我知道我需要使用EventFilters来获取我想要的行为,但是我弄错了.我不希望TextArea使用这些事件......我只是希望它让它们"顺利进行".
我已经找到了如何散列某个密码并使用SpringMVC将其保存在数据库中:
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String pw = passwordEncoder.encode("test");
Run Code Online (Sandbox Code Playgroud)
现在的问题是,我如何验证来自请求的密码,让用户登录我的网络应用程序?经过一些研究,我看到,有很多方法可以做到这一点.一些解决方案适用于用户角色.
我的webapps应该做的是为我的用户提供一个他们可以注册的登录页面(这里我将使用上面显示的代码保存密码).注册后,他们应该能够登录,这意味着我需要从登录表单验证密码.那里有最先进的例子吗?
我很惊讶,但是...这个编译:
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>[].我曾经认为这些是严格禁止的,因为没有运行时方式让它们安全地操作类型.
我认为对枚举数组的最终引用应该是不可变的.
枚举的唯一性和单一性由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)
我对吗?这应该成为多线程设计的一部分,所以我担心这个关键的静态数据列表会被应用程序非常容易呈现的方式...如果它实际上是可变的.
这段代码不会编译,我不明白为什么.错误位于指定的行:
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.
我知道可以使用传递给其构造函数的 Connection 对象创建 JDBC RowSet 实例,例如:
Connection con = MyDAO.getConnection();
JdbcRowSet jrs = new JdbcRowSetImpl(con);
Run Code Online (Sandbox Code Playgroud)
两个问题:
这是警告之一。当我尝试在代码中使用 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。
我可以将现有的 Connection 对象与现有的 …