我正在尝试实现本教程中描述的自定义TableRenderer .我想让渲染器换行包装给定单元格的每个文本.这个想法是,使用TextArea作为渲染器,因为它支持换行.但是,以下代码的行为不符合预期:
public class LineWrapCellRenderer extends JTextArea implements TableCellRenderer {
@Override
public Component getTableCellRendererComponent(
JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column) {
this.setText((String)value);
this.setWrapStyleWord(true);
this.setLineWrap(true);
return this;
}
}
Run Code Online (Sandbox Code Playgroud)
我用这个渲染器设置了
table.setDefaultRenderer(String.class, new LineWrapCellRenderer());
Run Code Online (Sandbox Code Playgroud)
但是细胞条目仍未解开.如果我添加this.setBackground(Color.YELLOW)
到该getTableCellRendererComponent()
方法,所有单元格都按预期为黄色,但未包装.
有任何想法吗?
更新:正如Michael Borgwardt在评论中所述,问题不在于换行,而是行高:JTables行是固定大小的,所以如果单元格越来越高(因为文本现在是多行的),我们必须增加行高.但是多少钱?我会检查这是否值得另一个SO问题.如果没有,我会在这里添加此解决方案.
Update2:以下代码将确定行高(如果放入getTableCellRendererComponent()
):
int fontHeight = this.getFontMetrics(this.getFont()).getHeight();
int textLength = this.getText().length();
int lines = textLength / this.getColumns() +1;//+1, cause we need at least 1 row.
int height = fontHeight * …
Run Code Online (Sandbox Code Playgroud) 这个问题是在描述(和解决)问题的一个比较特殊的情况下这个问题.
我有两个方法,stopAndRemove(ServerObject服务器)和close()方法.后者应关闭所有服务器并将其从服务器列表中删除.该列表定义为
List<ServerObject> server.
Run Code Online (Sandbox Code Playgroud)
我不想在closeCurrentlyOpen中使用stopAndRemove中的几乎相同的代码,所以我想做类似的事情:
public void closeCurrentlyOpen() {
for(ServerObject server : this.servers) {
stopAndRemove(server)
}
}
Run Code Online (Sandbox Code Playgroud)
这将不起作用,因为这将导致ConcurrentModificationException.我试着复制一份清单
List<ServerObject> copyList = new ArrayList<ServerObject>(this.servers);
Run Code Online (Sandbox Code Playgroud)
并将其用作foreach循环的列表.但是当我在copyList上迭代时,另一个线程可能会将服务器附加到服务器列表,但closeCurrentlyOpen应该会产生一个emtpy列表.当addServerToList方法同步到servers-list时,执行此操作
public void closeCurrentlyOpen() {
synchronized(this.servers) {
for(ServerObject server : this.servers) {
stopAndRemove(server)
}
}
}
Run Code Online (Sandbox Code Playgroud)
将通过修改解决问题.但是我不能在stopAndRemove方法中同步代码,如果直接调用它是必需的.
在我看来,这三种方法的设计可能需要修改.任何人的想法?
您如何确保可以将代码签入Eclipse或NetBeans并在其中使用它?
编辑:如果您没有签入与ide相关的文件,则每次签出项目时都必须重新配置buildpath,includes和所有这些内容.我不知道,如果ant(特别是从eclipse创建/导出的ant构建文件)将无缝地与其他ide一起使用.
在Java中,以下是一个常见的习语:
if( null != obj && obj.getSomeNumber() > 0 ) { ... }
Run Code Online (Sandbox Code Playgroud)
如果为null!= obj为true ,则仅执行长度检查.但是,在JPA NamedQuery中,这不起作用:
@NamedQuery(
name = "query"
query = "SELECT o FROM SomeObjectList o WHERE o.someObject is not null AND o.someObject.someNumber > 0")
Run Code Online (Sandbox Code Playgroud)
(这是我所期望的,因为这在SQL中也不起作用.)
o.someObject是'null'或存储SomeObjects的表的外键.(表的每一列对应SomeObject的一个属性.)
------------------------- ----------------------------
| Table: SomeObjectList | | Table: SomeObject |
------------------------- ----------------------------
| id | someObject | | id | number | name |
------------------------- ----------------------------
| 1 | 4 | | 3 | -4 | foo |
------------------------- …
Run Code Online (Sandbox Code Playgroud)