Я работаю над тем, чтобы сделать Arduino IDE полностью доступной для людей, использующих программное обеспечение для доступа. Это означает добавление доступа с клавиатуры к двум диалоговым окнам, которые в настоящее время не работают с программным обеспечением доступа под окнами. Двумя диалогами являются Менеджер Совета и LibraryManager. Если вам нужен реальный пример того, что я публикую, вы можете получить Arduino IDE в Магазине Windows или загрузить его онлайн. Просто найдите Arduino IDE и загрузите версию для Windows. ,
делает для большинства из вас все, что может быть слишком много, поэтому я создал более простую таблицу, в которой показана та же проблема. Если кто-то может помочь мне понять, как добавить доступ с клавиатуры и фокуса к нижеприведенному пользовательскому JTable и его пользовательскому столбцу, который является JPanel, я могу поработать над исправлением таблиц IDE Arduino.
Я понимаю, что Arduino IDE, вероятно, следует превратить в
лучший стол, но мне еще предстоит найти более чистый способ сделать то, что они делают с этими таблицами, поэтому я пытаюсь сделать то, что у них есть, доступным.
Итак, ниже моя таблица проблем. Имеет два ряда и два столбца.
Второй столбец каждой строки представляет собой панель управления. Я одолжил
этот код из некоторых других сообщений стека и изменил его, чтобы соответствовать
вопрос. Так что, если вы думаете, что видели этот код до этого
вот почему. Проблема в том, что код работает для мыши. По крайней мере я думаю
это потому, что я слепой и не могу выбрать элементы управления на
второй столбец, потому что они не могут получить фокус клавиатуры.
Так может кто-нибудь помочь мне разобраться, как получить фокус клавиатуры
перемещаться по всей этой таблице. Я пытался использовать фокус
слушатели, клавиатурные слушатели, Focus Traversal политики, свойства
изменения и комбинации между всем вышеперечисленным. Я вынул
мои ужасные попытки. Качели действительно должны работать без необходимости
вся эта дополнительная работа, но Java - это то, что является Java.
Так что, если вы хорошо разбираетесь в Java, пожалуйста, уберите свою мышь и запустите
код и посмотрите, сможете ли вы активировать кнопки без мыши.
Если вы можете, и вы можете объяснить мне, как это сделать, многие слепые пользователи будут
быть в долгу.
Обратите внимание, что вы должны иметь возможность Shift + Control + вкладка для таблицы, если таблица не является единственным элементом управления. По моему образцу это так. После этого вы сможете перемещаться по строкам и столбцам, а также вкладке и Shift + Tab с помощью элементов управления на JPanel.
Вы можете получить zip группу этих файлов, если не хотите
Соберите все это вместе по этой ссылке:
https://www.dropbox.com/s/h4bdfu1mlo0jsvr/TableAccessTest.zip?dl=0
Вот файлы. Каждый класс имеет комментарий с именем файла перед ним. Снова получите почтовый индекс, если вы не хотите играть в блок и копировать.
//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;
}
}