- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个名为“配置文件”的对象列表,每个配置文件都有一个功能列表(配置文件可以执行的操作)以及与该配置文件关联的用户列表。
我想在 JTable 中显示此信息。首先,显示具有文件功能的配置文件,然后显示该配置文件中的用户。像这样的事情:
------------------------------------
|Profile | Operation1 | Operation 2|
------------------------------------
P1 | X | | <- users1 in P1 can do only Operation1
--user1 | | |
--user2 | | |
P2 | X | X |
--user2 | | |
--user3 | | |
--user4 | | |
------------------------------------
首先,我实现了一个更智能的 getRowCount() 方法,然后是一个 getValueAt 方法,该方法在 JTable 中打印配置文件以及在其行下与其关联的所有用户。事情似乎正常,但是当单击一行时,即使 isCellEditor() 始终返回 false 并且未实现方法 setValueAt(..),JTable 也会完成修改(该行会随着添加到 JTable 中的最后一个配置文件而更改) 。谁能告诉我为什么会发生这种情况?我想,也许每次单击一行时都会调用 getValueAt(...) 方法,这会给我的数据结构带来麻烦!接下来,有一种方法可以告诉 JTable 列仅包含 boolean 值,而行与配置文件相关吗?预先感谢您
接下来,代码:J框架:
import it.Profile.Operation;
import java.awt.BorderLayout;
import java.util.LinkedList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
public class JTableTest extends JFrame {
List<Profile> list_profiles = new LinkedList<Profile>();
List<User> list_users = new LinkedList<User>();
public JTableTest() {
super();
Profile admin = new Profile("P1");
admin.addOp(Operation.OPERATION1);
admin.addOp(Operation.OPERATION2);
admin.addUser(new User("User 1"));
list_profiles.add(admin);
Profile p1 = new Profile("P2");
p1.addOp(Operation.OPERATION2);
p1.addUser(new User("User 2"));
list_profiles.add(p1);
Profile p2 = new Profile("P3");
p2.addOp(Operation.OPERATION1);
p2.addOp(Operation.OPERATION3);
p2.addUser(new User("User 1"));
list_profiles.add(p2);
create_jframe();
}
private void create_jframe() {
JTable profile_jtable = new JTable(new ProfileTableModel());
DefaultTableCellRenderer renderer = (DefaultTableCellRenderer) profile_jtable
.getTableHeader().getDefaultRenderer();
renderer.setHorizontalAlignment(0);
this.getContentPane().add(new JScrollPane(profile_jtable),
BorderLayout.CENTER);
}
public static void main(String[] args) {
JFrame jframe = new JTableTest();
jframe.pack();
jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jframe.setVisible(true);
}
private class ProfileTableModel extends AbstractTableModel {
/**
*
*/
int riga = 0;
private int users_number = 0;
private Profile profilo = list_profiles.get(riga);
private boolean show_profile = true;
private static final long serialVersionUID = 7525220824319997602L;
private String[] columns_name = { "User", "OPERATION 1", "OPERATION 2",
"OPERATION 3" };
public ProfileTableModel() {
super();
}
@Override
public int getColumnCount() {
return columns_name.length;
}
@Override
public int getRowCount() {
int count = list_profiles.size();
for (int i = 0; i < list_profiles.size(); i++) {
count += list_profiles.get(i).getListUsers().size();
}
return count;
}
/*
* @Override public Class<?> getColumnClass(int c) { if (c == 0) return
* String.class; return Boolean.class; }
*/
@Override
public Object getValueAt(int row, int column) {
if (show_profile) {
if (column == 0)
return profilo.getName();
Operation f = null;
switch (column) {
case 1:
f = Operation.OPERATION1;
break;
case 2:
f = Operation.OPERATION2;
break;
case 3:
f = Operation.OPERATION3;
users_number = profilo.getListUsers().size();
if (users_number != 0)
show_profile = false;
break;
}
return list_profiles.get(riga).getOperations().contains(f);
} else {
if (column == 0) {
users_number--;
String nome = profilo.getListUsers().get(users_number)
.getName();
if (users_number == 0 && riga < list_profiles.size() - 1) {
riga++;
profilo = list_profiles.get(riga);
}
return "---" + nome;
}
if (column == 3)
show_profile = true;
}
return null;
}
@Override
public String getColumnName(int i) {
return columns_name[i];
}
@Override
public boolean isCellEditable(int row, int column) {
if (row == 0 || row == 1)
return false;
return true;
}
}
}
简介:
import java.util.LinkedList;
import java.util.List;
public class Profile {
public enum Operation {
OPERATION1, OPERATION2, OPERATION3
}
private List<Operation> list_operations;
private String name;
private List<User> list_users;
public Profile (String name) {
this.name=name;
this.list_operations=new LinkedList<Operation>();
this.list_users=new LinkedList<User>();
}
public Profile (String name, List<Operation> list_operation) {
this.name=name;
this.list_operations=list_operations;
}
public void addOp(Operation new_function) {
this.list_operations.add(new_function);
}
public void removeOp(Operation op) {
this.list_operations.remove(op);
}
public String getName() {
return name;
}
public List<Operation> getOperations() {
return this.list_operations;
}
public void setName(String name) {
this.name=name;
}
public void addUser(User user) {
this.list_users.add(user);
}
public List<User> getListUsers() {
return list_users;
}
}
用户: 公共(public)类用户{
public String getName() {
return name;
}
private String name;
public User (String name) {
this.name=name;
}
}
Upolad 图片让您了解我的问题:在点击之前,当一切似乎正常时
点击后,当我的梦想崩溃时:P
您可以看到单击后 jTable 结构已被修改。
编辑:getValueAt根据埃里克先生的提示进行修改
@Override
public Object getValueAt(int row, int column) {
int cpt = 0;
int profile = 0;
int user = 0;
for (Profile p : list_profiles) {
if (cpt++ == row) {
if (column == 0)
return list_profiles.get(profile).getName();
Operation f = null;
switch (column) {
case 1:
f = Operation.OPERATION1;
break;
case 2:
f = Operation.OPERATION2;
break;
case 3:
f = Operation.OPERATION3;
profile++;
break;
}
return list_profiles.get(profile).getOperations()
.contains(f);
} else {
String nome;
for (User u : p.getListUsers()) {
if (cpt++ == row) {
if (column == 0) {
return list_profiles.get(profile)
.getListUsers().get(user).getName();
}
}
}
}
}
return null;
}
最佳答案
问题来自于您在 getValueAt()
中所做的事情方法。基本上,您正在使用字段 riga
更改表模型的状态。 , show_profile
, profilo
和users_number
.
您假设 Swing 正在调用 getValueAt()
始终按正确的顺序(第一行、第一列,然后第一行、第二列,依此类推)。这第一次有效,但是当您单击表格后,Swing 可能需要调用 getValueAt()
再次针对特定的单元格,这会完全扰乱您的模型。 相反,您应该假设 Swing 将调用 getValueAt()
无论何时,无论什么顺序。
所以你应该摆脱这些字段,并应用无状态逻辑。例如,要知道在给定行显示什么,您可以浏览列表并停在右行:
int cpt = 0
for(Profile p : list_profiles){
if(cpt++ == row){
// return value corresponding to profile
}else{
for(User u: p.getListUsers()){
if(cpt++ == row)
// return value corresponding to user
}
}
}
And, next, there is a way to tell to JTable that the columns contain Boolean only is the row is related to a Profile?
我想如果你返回 Boolean
而不是String
在getValueAt()
,Swing 会正确显示 JTable
。您还需要覆盖 getColumnClass()
方法并返回 String.class
对于 column==0
和Boolean.class
否则。 (返回null
将显示一个空单元格,就像当前的情况一样)
注意:也许可以考虑在您的用例中使用 TreeTable(这将使您的模型更容易实现,因为您的数据自然具有树结构)。 SwingX 有一个 really good implementation .
关于java - JTable:显示包含列表的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31559803/
初学者 android 问题。好的,我已经成功写入文件。例如。 //获取文件名 String filename = getResources().getString(R.string.filename
我已经将相同的图像保存到/data/data/mypackage/img/中,现在我想显示这个全屏,我曾尝试使用 ACTION_VIEW 来显示 android 标准程序,但它不是从/data/dat
我正在使用Xcode 9,Swift 4。 我正在尝试使用以下代码从URL在ImageView中显示图像: func getImageFromUrl(sourceUrl: String) -> UII
我的 Ubuntu 安装 genymotion 有问题。主要是我无法调试我的数据库,因为通过 eclipse 中的 DBMS 和 shell 中的 adb 我无法查看/data/文件夹的内容。没有显示
我正在尝试用 PHP 发布一些 JSON 数据。但是出了点问题。 这是我的 html -- {% for x in sets %}
我观察到两种方法的结果不同。为什么是这样?我知道 lm 上发生了什么,但无法弄清楚 tslm 上发生了什么。 > library(forecast) > set.seed(2) > tts lm(t
我不确定为什么会这样!我有一个由 spring data elasticsearch 和 spring data jpa 使用的类,但是当我尝试运行我的应用程序时出现错误。 Error creatin
在 this vega 图表,如果我下载并转换 flare-dependencies.json使用以下 jq 到 csv命令, jq -r '(map(keys) | add | unique) as
我正在提交一个项目,我必须在其中创建一个带有表的 mysql 数据库。一切都在我这边进行,所以我只想检查如何将我所有的压缩文件发送给使用不同计算机的人。基本上,我如何为另一台计算机创建我的数据库文件,
我有一个应用程序可以将文本文件写入内部存储。我想仔细看看我的电脑。 我运行了 Toast.makeText 来显示路径,它说:/数据/数据/我的包 但是当我转到 Android Studio 的 An
我喜欢使用 Genymotion 模拟器以如此出色的速度加载 Android。它有非常好的速度,但仍然有一些不稳定的性能。 如何从 Eclipse 中的文件资源管理器访问 Genymotion 模拟器
我需要更改 Silverlight 中文本框的格式。数据通过 MVVM 绑定(bind)。 例如,有一个 int 属性,我将 1 添加到 setter 中的值并调用 OnPropertyChanged
我想向 Youtube Data API 提出请求,但我不需要访问任何用户信息。我只想浏览公共(public)视频并根据搜索词显示视频。 我可以在未经授权的情况下这样做吗? 最佳答案 YouTube
我已经设置了一个 Twilio 应用程序,我想向人们发送更新,但我不想回复单个文本。我只是想让他们在有问题时打电话。我一切正常,但我想在发送文本时显示传入文本,以确保我不会错过任何问题。我正在使用 p
我有一个带有表单的网站(目前它是纯 HTML,但我们正在切换到 JQuery)。流程是这样的: 接受用户的输入 --- 5 个整数 通过 REST 调用网络服务 在服务器端运行一些计算...并生成一个
假设我们有一个名为 configuration.js 的文件,当我们查看内部时,我们会看到: 'use strict'; var profile = { "project": "%Projec
这部分是对 Previous Question 的扩展我的: 我现在可以从我的 CI Controller 成功返回 JSON 数据,它返回: {"results":[{"id":"1","Sourc
有什么有效的方法可以删除 ios 中 CBL 的所有文档存储?我对此有疑问,或者,如果有人知道如何从本质上使该应用程序像刚刚安装一样,那也会非常有帮助。我们正在努力确保我们的注销实际上将应用程序设置为
我有一个 Rails 应用程序,它与其他 Rails 应用程序通信以进行数据插入。我使用 jQuery $.post 方法进行数据插入。对于插入,我的其他 Rails 应用程序显示 200 OK。但在
我正在为服务于发布请求的 API 调用运行单元测试。我正在传递请求正文,并且必须将响应作为帐户数据返回。但我只收到断言错误 注意:数据是从 Azure 中获取的 spec.js const accou
我是一名优秀的程序员,十分优秀!