Как выбрать первый объект в JPopupMenu?

Я создатель TPPDF.

Во время разработки я разработал таблицы для работы, аналогичной популярным программам для обработки текстов, таким как Microsoft Office Word или LibreOffice, где вы можете изменить выравнивание для каждой ячейки.

На данный момент невозможно установить выравнивание по умолчанию, поэтому самый простой способ - сопоставить ваши данные с выравниванием (как вы делали в своем примере кода).

Если вы хотите более короткий синтаксис, я могу предложить следующее:

let tableData: [[String]] = [...] // This is your nested data
let alignments = tableData.map { [110].map { _ in PDFTableCellAlignment.right }}

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

6
задан Troyseph 25 November 2016 в 11:10
поделиться

3 ответа

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

На самом деле я утверждал бы, что это - корректное поведение, по крайней мере, в Windows. Другие не-JAVA-приложения делают это также. Я не думаю, что стоит повредить эту конвенцию, даже если существует только один объект в меню. Если Вы чувствуете иначе, можно установить индекс выбора как в ответе sean.bright.


Так, я наконец получил шанс испытать его на Java 1.6.0_11, и найденный некоторым непоследовательным поведением: Если выступы всплывающего меню из родительского кадра, объект автоматически выбран; если всплывающее меню появляется полностью в родительском кадре, ничто не выбрано. Походит на ошибку Swing, которая, по крайней мере, гарантирует RFE для последовательного поведения.

0
ответ дан 17 December 2019 в 00:15
поделиться

Это странно.

Я попробовал его Windows, и Java 1.5.0_08 и даже 1.6.0_07, первый Элемент выбран автоматически, поскольку Вы ожидали, что это будет.

Таким образом, я попробовал его 1.6.0_11, и это больше не работает, первый элемент не выбран первоначально. Выбор элемента в selectionModel, кажется, не помогает.

Одно обходное решение (что я нисколько не горжусь) должно переместить мышь автоматически после отображения всплывающего меню, с помощью координат MouseEvent. Возможно, кто-то получил лучшее представление?

import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;

public class SelectedPopupMenu extends JFrame {

    public SelectedPopupMenu() {
        addMouseListener(new MouseAdapter() {
            public void mouseClicked(final MouseEvent e) {
                JPopupMenu popupMenu = new JPopupMenu();
                popupMenu.add(new JMenuItem("Test-Item"));
                popupMenu.add(new JMenuItem("Test-Item-2"));
                // do not care to really hit the center of the popup
                popupMenu.show(SelectedPopupMenu.this, e.getX() - 30, e.getY() - 10);
                try {
                    // shake mouse, so that first element is selected even in Java 1.6.0_11
                    Robot robot = new Robot();
                    robot.mouseMove(e.getX() + 1, e.getY());
                    robot.mouseMove(e.getX(), e.getY());
                } catch (AWTException ex) {
                    ex.printStackTrace();
                }
            }
        });
    }

    public static void main(String[] args) {
        JFrame frame = new SelectedPopupMenu();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(800, 600);
        frame.setVisible(true);
    }
}
0
ответ дан 17 December 2019 в 00:15
поделиться

Секрет оказывается MenuSelectionManager.defaultManager (). SetSelectedPath (новый MenuElement [] {меню, ...});

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.MenuElement;
import javax.swing.MenuSelectionManager;
import javax.swing.SwingUtilities;

/**
 * Demonstrates programmatic {@link JMenuItem} selection;
 * specifically how to make the first item selected by default
 */
public class TestPopup extends JFrame {
  public static void main(String[] args) {
    final JFrame frame = new JFrame("TestPopup");
    frame.setSize(640, 480);
    frame.getContentPane().addMouseListener(new MouseAdapter() {
      @Override
      public void mousePressed(MouseEvent e) {
        if (e.isPopupTrigger()) {
          popupTriggered(e);
        }
      }
      private void popupTriggered(MouseEvent e) {
        final JPopupMenu menu = new JPopupMenu();
        final JMenuItem item0 = new JMenuItem("JMenuItem 0");
        final JMenuItem item1 = new JMenuItem("JMenuItem 1");
        menu.add(item0);
        menu.add(item1);
        menu.pack();
        // use invokeLater or just do this after the menu has been shown
        SwingUtilities.invokeLater(new Runnable() {
          public void run() {
            MenuSelectionManager.defaultManager().setSelectedPath(new MenuElement[]{menu, item0});
          }
        });
        int x = (int) ((int) (frame.getSize().width - (menu.getPreferredSize().width / 2.)) / 2.);
        int y = (int) ((int) (frame.getSize().height - (menu.getPreferredSize().height / 2.)) / 2.);
        menu.show(frame, x, y);
        // doesn't work:
        //item0.setSelected(true);
        // doesn't work:
        //menu.getSelectionModel().setSelectedIndex(0);
        // bingo; see also MenuKeyListener / MenuKeyEvent
//        MenuSelectionManager.defaultManager().setSelectedPath(new MenuElement[]{menu, item0});
      }
    });
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
  }
}
6
ответ дан 17 December 2019 в 00:15
поделиться
Другие вопросы по тегам:

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