小编Arv*_*dan的帖子

如何在jtable单元格中包装行?

我正在尝试实现本教程中描述的自定义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)

java swing jtable

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

Java:如何在迭代/添加元素时从列表中删除元素

这个问题是在描述(和解决)问题的一个比较特殊的情况下这个问题.

我有两个方法,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方法中同步代码,如果直接调用它是必需的.

在我看来,这三种方法的设计可能需要修改.任何人的想法?

java algorithm collections list

18
推荐指数
2
解决办法
6万
查看次数

你如何处理不同的Java IDE和svn?

您如何确保可以将代码签入Eclipse或NetBeans并在其中使用它?

编辑:如果您没有签入与ide相关的文件,则每次签出项目时都必须重新配置buildpath,includes和所有这些内容.我不知道,如果ant(特别是从eclipse创建/导出的ant构建文件)将无缝地与其他ide一起使用.

java eclipse svn ide collaboration

8
推荐指数
2
解决办法
2419
查看次数

如果值不为null,JPA将执行查询的一部分

在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)

jpa

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

标签 统计

java ×3

algorithm ×1

collaboration ×1

collections ×1

eclipse ×1

ide ×1

jpa ×1

jtable ×1

list ×1

svn ×1

swing ×1