JTable со сложным редактором

Я не знаю, как с обычными терминами scale_y_continuous заставить масштаб оси Y появляться на графике, а не на его краях, но его можно подделать, используя annotate для создания специального слоя. Мы также можем повернуть полярное преобразование с помощью члена start в coord_polar.

ggplot(data=df.m,  aes(x=Group, y=Percentage, group= Demographics, colour=Demographics )) + 
  annotate("text", x = 1, y = -2:2, label = -2:2, hjust = 1) +
  geom_polygon(size = 1, alpha= 0.2) + 
  ggtitle("Radar")  + 
  scale_y_continuous(labels = NULL) +
  scale_x_discrete() +
  scale_color_manual(values= c("Red", "Blue","Black"))+
  scale_fill_manual(values= c("Red", "Blue","Black"))+
  theme_light()+
  coord_polar(start = -pi/12)

enter image description here

8
задан Tom Martin 19 February 2009 в 16:49
поделиться

4 ответа

Проверьте некоторые похожие статьи здесь и здесь.

Другая хорошая статья о JTable, редактирующем в целом.

4
ответ дан 5 December 2019 в 22:20
поделиться

Если я считал Ваш вопрос правильно, Вы хотите, чтобы пользователь смог ввести в ячейку сразу, не активируя редактора ячейки сначала, т.е. Вы хотите любое нажатие клавиши, активировался, ячейка, чтобы быть первым символом ввела в текстовое поле.

Моя первая попытка состояла в том, чтобы добавить propertyChangeListener на focusOwner свойстве KeyboardFocusManager, только чтобы заметить, что фокус никогда не оставляет JTable. Вы, вероятно, столкнулись с этим также. Время для плана B.

Я получил то "первое нажатие клавиши" вещь работать путем добавления KeyListener к таблице, которая записывает последний KeyEvent для keyPressed () метод в поле экземпляра. getTableCellEditorComponent () метод читает символ оттуда. Мне также был нужен тот hacky requestFocusInWindow (), называют Вас упоминанием, если пользователь должен продолжать вводить какие-либо символы после первого.

Для моего демонстрационного приложения я создал подкласс JTable, который добавляет KeyListener к себе. Это - намного лучшая идея заставить Ваш экземпляр CellEditor реализовать KeyListener и добавить, что к регулярному JTable вместо этого, но я оставлю это Вам.

Вот Ваш фрагмент кода, когда я изменил его:

@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
    JPanel container = new JPanel();
    container.setLayout(new BorderLayout());
    container.add(field, BorderLayout.CENTER);

    // Will want to add an instanceof check as well as a check on Character.isLetterOrDigit(char).
    char keypressed = ((StickyKeypressTable)table).getLastKeyPressed();
    field.setText(String.valueOf(keypressed));

    container.add(new JButton("..."), BorderLayout.EAST);

    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            // This needs to be in an invokeLater() to work properly
            field.requestFocusInWindow();
        }
    });
    return container;
}

Насколько злобность идет, это находится где-нибудь там с Поэзией Vogon, но она должна решить Вашу непосредственную проблему.

2
ответ дан 5 December 2019 в 22:20
поделиться

Я зафиксировал что-то подобное на 2 шагах

Сначала переопределите editCellAt от своего JTable и назовите requestFocus после подготовки редактора:

public boolean editCellAt( int row, int column, EventObject e )
{
  if ( cellEditor != null && !cellEditor.stopCellEditing() )
    {
    return false;
    }

  if ( row < 0 || row >= getRowCount() ||
      column < 0 || column >= getColumnCount() )
    {
    return false;
    }

  if ( !isCellEditable(row, column) )
    return false;

  TableCellEditor editor=getCellEditor(row, column);
  if ( editor != null && editor.isCellEditable(e) )
    {
    editorComp=prepareEditor(editor, row, column);
    if ( editorComp == null )
      {
      removeEditor();
      return false;
      }
    //aangepast
    Rectangle rect=getCellRect(row, column, false);
    if ( datamodel_.useAdaptedEditorRect() )
      rect=datamodel_.changeRectangle(rect, editorComp);
    editorComp.setBounds(rect);
    add(editorComp);
    editorComp.validate();

    setCellEditor(editor);
    setEditingRow(row);
    setEditingColumn(column);
    editor.addCellEditorListener(this);
    //NEXT LINE ADDED 
    editorComp.requestFocus();
    return true;
    }
  return false;
}

Затем перегрузите requestFocus от своего JPanel и удостоверьтесь, что Ваше текстовое поле помещается как editorComponent:

public class EditorPanel extends JPanel {
   JComponent editorComponent;

   public boolean isRequestFocusEnabled()
   {
     return true;
   }

   public void requestFocus()
   {
   editorComponent.requestFocus();
   }
}

Можно всегда захватывать keyEvent и устанавливать его сами:

AWTEvent event = EventQueue.getCurrentEvent();
if ( event instanceof KeyEvent )
  {
  char newSelection = ( (KeyEvent) event).getKeyChar();
  int keyCode = ( (KeyEvent) event ).getKeyCode();
  editorComponent.requestFocus();
  if ( editorComponent instanceof JTextField )
    {
    if ( ( newSelection >= (char) FIRST_ALLOWED_CHAR ) && ( newSelection != (char) LAST_ALLOWED_CHAR ) ) //comes from DefaultKeyTypedAction
       ( (JTextField) editorComponent ).setText(Character.toString(newSelection));
    if ( keyCode == KeyEvent.VK_BACK_SPACE || keyCode == KeyEvent.VK_DELETE )
      ( (JTextField) editorComponent ).setText("");          
    }
  }
else
  editorComponent.requestFocus();
0
ответ дан 5 December 2019 в 22:20
поделиться

Я думаю, что решил его.
Чтобы сказать Вам истину, я не знаю то, что решило проблему, так как я использую пользовательского редактора, пользовательский рендерер и материал...

Когда ячейка выделяется, и я нажимаю "abc", 3 буквы идут на экран (ячейка, в этом случае).

grid.addKeyListener(new KeyAdapter() {
    public void keyTyped(KeyEvent ke) {
        int l = grid.getSelectedRow();
        int c = grid.getSelectedColumn();
        grid.editCellAt(l, c);
    }
});

Хорошо... Я попробовал... =)
(Я не знаю, является ли это то же, потому что мой JTable использует JTextField и JComboBox как редакторы).

0
ответ дан 5 December 2019 в 22:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: