- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我需要一个 JToggleButton(具有自定义背景),它包含一个 JPanel,其中有几个 JLabel。那部分有效。
此按钮随后放置在 JTable 单元格中,供用户按下。问题是我只能在第二次点击时按下按钮。 Apperenty 在第一次单击时焦点首先跳转到带有 JLabels 的面板,然后才跳转到实际按钮。
我尝试了几种方法来尝试解决这个问题,但同样的问题仍然存在。A) 将带有标签的 JPanel 直接放在 JToggleButton#add() 上。B) 使用 JLayeredPane 将 Button 和 JPanel 放置到不同的层上,其中 JToggleButton 接受约束 Integer(-) 以便带有 JLabels 的 JPanel 在顶部保持可见
你有什么建议吗?谢谢
下面是说明问题的示例代码。单击该按钮仅第二次有效。
public class ClickableCustomButtonInTable extends JToggleButton {
public ClickableCustomButtonInTable() {
Dimension d = new Dimension(100, 100);
JLabel lFirst = new JLabel("1st label");
lFirst.setPreferredSize(d);
JLabel lSecond = new JLabel("2nd label");
lSecond.setPreferredSize(d);
JPanel panel = new JPanel();
panel.setOpaque(true);
panel.setLayout(new BorderLayout());
panel.add(lFirst, BorderLayout.NORTH);
panel.add(lSecond, BorderLayout.SOUTH);
add(panel);
addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Button clicked");
}
});
}
private static class CustomButtonRenderer implements TableCellRenderer {
private final ClickableCustomButtonInTable button = new ClickableCustomButtonInTable();
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
return button;
}
}
private static class CustomButtonEditor extends AbstractCellEditor
implements TableCellEditor {
private final ClickableCustomButtonInTable button = new ClickableCustomButtonInTable();
@Override
public Object getCellEditorValue() {
return button.getText();
}
@Override
public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected, int row, int column) {
return button;
}
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setSize(new Dimension(200, 200));
Container content = frame.getContentPane();
TableModel model = new AbstractTableModel() {
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
return null;
}
@Override
public int getRowCount() {
return 1;
}
@Override
public int getColumnCount() {
return 1;
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return true;
}
@Override
public Class<?> getColumnClass(int columnIndex) {
return ClickableCustomButtonInTable.class;
}
};
JTable table = new JTable(model);
// table.setBounds(new Rectangle(0, 0, content.getWidth(), content
// .getHeight()));
table.setRowHeight(frame.getHeight());
table.setDefaultRenderer(ClickableCustomButtonInTable.class,
new CustomButtonRenderer());
table.setDefaultEditor(ClickableCustomButtonInTable.class,
new CustomButtonEditor());
content.add(table);
content.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
最佳答案
当表格捕获鼠标事件以选择单元格时,它会将鼠标事件传递给最深的组件,而不管该组件是否可以处理鼠标事件。在您的示例中,第一次点击结束于其中一个 JLabels
,完全绕过了 JToggleButton
。一旦 JToggleButton
成为 Activity 的单元格编辑器,鼠标点击就会正常作用于它。如果它失去焦点,它将再次需要两次单击才能激活。
如果您在演示中注意到您单击了按钮边框而不是包含的面板,您也可以看到这一点,按钮按预期工作。
解决此问题的一种方法是确保针对 JToggleButton
中的任何组件的任何鼠标事件。您可以使用此静态方法执行此操作:
static void addEventBubble(final Container target, Container container) {
for(Component comp:container.getComponents()) {
if (comp instanceof Container) {
addEventBubble(target, (Container) comp);
}
comp.addMouseListener(new MouseAdapter() {
private MouseEvent retarget(MouseEvent e) {
return new MouseEvent(target, e.getID(), e.getWhen(),
e.getModifiers(), e.getX(), e.getY(),
e.getClickCount(), e.isPopupTrigger(),
e.getButton());
}
public void mousePressed(MouseEvent e) {
MouseEvent r = retarget(e);
for(MouseListener listen:target.getMouseListeners()) {
listen.mousePressed(r);
}
}
public void mouseReleased(MouseEvent e) {
MouseEvent r = retarget(e);
for(MouseListener listen:target.getMouseListeners()) {
listen.mouseReleased(r);
}
}
public void mouseClicked(MouseEvent e) {
MouseEvent r = retarget(e);
for(MouseListener listen:target.getMouseListeners()) {
listen.mouseClicked(r);
}
}
});
}
}
然后在构造函数调用的末尾:
addEventBubble(this,this);
在此之后,按钮内任何组件上的任何鼠标事件也将到达按钮并因此改变其状态。完成此操作后,我发现该按钮对每次点击都做出了所需的 react 。
关于java - 将带有 JPanel 的 JToggleButton 放入 JTable 单元格中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9588384/
我已经多次看到我的问题被问到,但我从未看到我期望的答案。我已经在 JTable 中输入了数据库的元素,并且我希望能够通过一些 JButtons 删除/添加元素。问题是当我添加/删除时,修改在数据库
我正在使用 JTable 做一个项目,我想让我的表格单元格可编辑。我用过, public boolean isCellEditable(int row, int column) {
我正在编写一个应用程序包,其中包含一个主类,其中主方法与GUI类分开,GUI类包含一个带有jtabbedpane的jframe,它有两个选项卡,第一个选项卡包含一个jtable,称为jtable1,第
我制作了一个表格来将 Arraylist 中的数据加粗,但如果我删除该数据,我会希望该表格更新并取消对 Arraylist 中加粗的单元格的粗体显示。我该怎么做呢?或从另一个类关闭该类的实例 最佳答案
如果我的 JTable 的列未按字母顺序排列,我可以使用 getSelectedRows() 并毫无问题地获取它们的行的值。但是,如果用户单击列名并且行在该列中按字母顺序排列,则 getSelecte
我有一个 JTable,用户可以在其中在单元格中输入数据。然后有一个“保存”按钮,用于收集表格数据,将其格式化为 csv,并将其保存到文件中。 但是,如果用户将最后编辑的单元格保留在选定状态,并单击“
我编写了下面的代码,以便在当前 JTable 上进行选择时创建一个新的 JTable: makeTbale.addActionListener(new ActionListener() { pub
我正在使用 Swing 编写 Java 应用程序。我有两个表,我必须将内容从一个表复制到另一个表(复制)。问题是,如果我清除目标表行,那么我的源表行也会被删除。 如果我按 CopyAll,那么我会将
我一直致力于JTable,我的项目: 从数据库读取数据(我完成了这个任务并能够在JTable中显示)。 然后将数据按子组显示并保存到文件(文本/Excel)中。 我有 JTable 的基本知识,并且使
我有以下类(class): public class customer_master extends javax.swing.JInternalFrame { Connection con =
您好,我是 JAVA 的新手,在学习时正在开发 GUI。我创建了一个带有 ScrollPane 和 JTable 的 JFrame。当我增加 2 列以上时,第一行下方的数据不会显示。 此外,当我的 J
我正在进行项目的最后一部分,这是我遇到的最后问题之一。这部分用于编辑预订,即更改为特定预订预订的房间。我有 2 个 JTable,其中一个有可用房间,另一个有已预订的房间。两者都有单独的 Defaul
我有 2 个 JTable,我需要从表 2 中复制特定列(包括该列中的所有数据)并将其添加到表 1 中的下一个空闲列中。有人知道执行此操作的最佳方法吗? 谢谢 最佳答案 DefaultTableMod
美好的一天!我在 Jtable 方面遇到了困难。我已经阅读和浏览了各种教程,但我不太明白它的要点。我的问题是,我必须从 jtable (jTable1) 中选择包含 (ClientID、LastNam
我的 SERVER 表单上有一个 JTable,它是从 MySQL 数据库填充的,在构造函数中编码: String sql = "SELECT * from fiekorari"; t
我在我的项目上工作,我需要将一行从 JTable 复制到另一个 JTable,第二个 JTable 应该只是单行表。我为第一个 JTable 创建了 mouselistener,双击它应该复制行并将其
我有这段代码可以完全按预期工作 package com.grantbroadwater.signInAssistant.view; import java.awt.BorderLayout; impo
我有一个列表人员(在 jTable 中)并想将其导出到 excel 文件我需要每个人转到单独的工作表所以我需要拆分原始 jTable,但我不知道如何? 这就是我想做的? public void exp
我有一个包含 7 列和 2 行的 JTable。在我的 JTable 下方,我有一个 JTextField。当我在 JTextField 中输入内容时,我可以很容易地得到我输入的内容:String l
我正在尝试将一个 JTable 嵌套在另一个 JTable 的列中(使用 CellRenderer)。 示例(错误)输出: 为什么下面的例子没有输出表中表? import java.awt.Compo
我是一名优秀的程序员,十分优秀!