Как придать фокус клавиатуре пользовательской панели в JTable? - PullRequest
0 голосов
/ 15 января 2019

Я работаю над тем, чтобы сделать 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;
    }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...