如何将键盘焦点赋予JTable中的“定制”面板?

时间:2019-01-15 13:59:51

标签: java windows swing

我正在努力使使用访问软件的人可以完全访问Arduino IDE。这意味着在Windows下无法使用访问软件的两个对话框中增加键盘可访问性。这两个对话框是Board Manager和LibraryManager。如果您想要我发布的真实示例,可以在Windows Store上获取Arduino IDE或在线下载。只需搜索Arduino IDE并下载Windows版本。 。

为您中的大多数人做了很多事情,所以我创建了一个更简单的表来显示相同​​的问题。如果有人可以帮助我了解如何添加键盘并集中访问下面的Custom JTable及其定制列(即JPanel),则可以修复Arduino IDE表。

我知道Arduino IDE可能应该做成一个 更好的表,但是我还没有找到一种更干净的方法来处理这些表,因此我试图使它们可以访问。

所以下面是我的问题表。它具有两行和两个列。的 每行的第二列是一组控件。我借了 此代码来自其他一些堆栈帖子,并对其进行了修改以适合我 题。因此,如果您认为之前已经看过其中一些代码 也就是为什么。问题是该代码适用于鼠标。至少我认为 这样做是因为我是盲人,无法选择 第二列,因为他们无法获得键盘焦点。

所以有人可以帮我弄清楚如何获得键盘焦点 在整个表格中移动。我尝试使用焦点 侦听器,键盘侦听器,焦点遍历策略,属性 更改,以及以上所有内容之间的组合。我拿出了 我的可怕尝试。摆动确实应该工作而不必做 所有这些额外的工作,但Java是Java。

因此,如果您擅长使用Java,请放开鼠标并运行它 代码,看看是否可以不用鼠标激活按钮。 如果可以的话,您可以向我解释如何做到这一点,许多盲人用户将 负债累累。

请注意,如果表不是唯一的控件,则应该能够按Shift + Control + Tab组合表。在我的样本上是。然后,您应该能够通过JPanel上的控件来箭头浏览行和列以及Tab和Shift + Tab。

如果不想,可以获取这些文件的zip组。 在以下Dropbox链接中将所有内容放在一起: https://www.dropbox.com/s/h4bdfu1mlo0jsvr/TableAccessTest.zip?dl=0

这是文件。每个类前面都有一个注释,并带有文件名。如果您不想玩块复制,请再次获取zip。

//TableAccessTest.java
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.TableCellEditor;

public class TableAccessTest extends JPanel
{

  TableModel customRendererEditorTableModel = new TableModel();
  JTable table;

  public TableAccessTest()
  {
    setLayout(new BorderLayout());

    table = new JTable(customRendererEditorTableModel);
    table.setPreferredScrollableViewportSize(new Dimension(500, 600));
    table.setRowSelectionAllowed(false);
    table.setRowHeight(300);
    table.getColumn("Custom JPanel").setCellRenderer(new CustomJPanelRenderer());
    table.getColumn("Custom JPanel").setCellEditor(new CustomJPanelEditor());

    JScrollPane scrollPane = new JScrollPane(table);
    add(scrollPane);

  }

  private static void createAndShowGUI()
  {
    JFrame frame = new JFrame("Custom JPanel");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JComponent newContentPane = new TableAccessTest();
    newContentPane.setOpaque(true);
    frame.setContentPane(newContentPane);
    frame.pack();
    frame.setVisible(true);
  }

  public static void main(String[] args)
  {
    javax.swing.SwingUtilities.invokeLater(new Runnable()
    {
      public void run()
      {
    createAndShowGUI();
      }
    });
  }
}

//CustomJPanel.java 

import java.awt.*;
import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.*;

public class CustomJPanel extends JPanel
{

  JPanel colorPanel = new JPanel(new BorderLayout());
  JButton jButton = new JButton("Change Color");
  JSlider jSlider = new JSlider(JSlider.VERTICAL);
JTextField jTextField = new JTextField("");


  public CustomJPanel()
  {
    jButton.setOpaque(true);
    jButton.setFocusable(true);
    jTextField.setEditable(false);
    jTextField.setFocusable(true);
    setFocusable(true);
    jButton.addActionListener(new ActionListener()
    {

      @Override
      public void actionPerformed(ActionEvent e)
{
    Random randomGenerator = new Random();
    int randomInt = randomGenerator.nextInt(4);

    switch (randomInt)
    {
      case (0):
        colorPanel.setBackground(Color.BLUE);
        jTextField.setText("blue");
        break;
      case (1):
        colorPanel.setBackground(Color.BLACK);
                jTextField.setText("black");
        break;
      case (2):
        colorPanel.setBackground(Color.CYAN);
                jTextField.setText("cyan");
        break;
      default:
        colorPanel.setBackground(Color.GREEN);
                jTextField.setText("green");
        break;
    }
      }
    });
    jSlider.setOpaque(true);
    setLayout(new BorderLayout());
    add(colorPanel, BorderLayout.CENTER);
    add(jButton, BorderLayout.SOUTH);
        add(jTextField, BorderLayout.NORTH);
    add(jSlider, BorderLayout.EAST);
  }
}






//TableModel.java 
import javax.swing.table.AbstractTableModel;

public class TableModel extends AbstractTableModel
{

  private String[] columnNames =
  {
    "First Column",
    "Custom JPanel",
  };
  private Object[][] data =
  {
    {"Foo", new CustomJPanel()},
    {"Bar", new CustomJPanel()}
  };

  public int getColumnCount()
  {
    return columnNames.length;
  }

  public int getRowCount()
  {
    return data.length;
  }

  public String getColumnName(int col)
  {
    return columnNames[col];
  }

  public Object getValueAt(int row, int col)
  {
    return data[row][col];
  }

  public Class getColumnClass(int c)
  {
    return getValueAt(0, c).getClass();
  }

  public boolean isCellEditable(int row, int col)
  {
    return col >= 1;
  }

  public void setValueAt(Object value, int row, int col)
  {
    data[row][col] = value;
    fireTableCellUpdated(row, col);
  }

}


//CustomJPanelEditor.java 

import javax.swing.AbstractCellEditor;
import javax.swing.JTable;
import javax.swing.table.TableCellEditor;

public class CustomJPanelEditor extends AbstractCellEditor implements TableCellEditor
{
  CustomJPanel customJPanel;

  public CustomJPanelEditor()
  {
    customJPanel = new CustomJPanel();
  }

  @Override
  public java.awt.Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)
  {
    customJPanel = (CustomJPanel) value;
    return customJPanel;
  }

  @Override  public Object getCellEditorValue()
  {
    return customJPanel;
  }
}


//CustomJPanelRenderer.java

import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;

public class CustomJPanelRenderer implements TableCellRenderer
  {

    CustomJPanel rendererJPanel;

  public CustomJPanelRenderer()
  {
    rendererJPanel = new CustomJPanel();
  }


    @Override
    public java.awt.Component getTableCellRendererComponent(JTable table, Object value,
        boolean isSelected, boolean hasFocus, int row, int column) 
    {
      rendererJPanel = (CustomJPanel) value;
      return rendererJPanel;
    }
  }

0 个答案:

没有答案