Курсоры изменения размера мыши не работают при использовании стеклянной панели

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

Есть ли способ сохранить то же поведение курсора мыши при использовании стеклянной панели?

Мне нужно решение, которое будет работать в Java 6.

public class Test extends JPanel
{
    public Test()
    {
        super(new GridLayout(1, 0));
        String[] columnNames = { "First Name", "Last Name", "Sport", "# of Years", "Vegetarian" };
        Object[][] data = { { "Kathy", "Smith", "Snowboarding", new Integer(5), new Boolean(false) },
                { "John", "Doe", "Rowing", new Integer(3), new Boolean(true) }, { "Sue", "Black", "Knitting", new Integer(2), new Boolean(false) },
                { "Jane", "White", "Speed reading", new Integer(20), new Boolean(true) }, { "Joe", "Brown", "Pool", new Integer(10), new Boolean(false) } };
        final JTable table = new JTable(data, columnNames);
        table.setPreferredScrollableViewportSize(new Dimension(500, 70));
        table.setFillsViewportHeight(true);
        JScrollPane scrollPane = new JScrollPane(table);
        add(scrollPane);
    }


    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("SimpleTableDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final JPanel glass = (JPanel)frame.getGlassPane();
        //glass.setVisible(true);
        Test newContentPane = new Test();
        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();
            }
        });
    }
}

1 ответ

  • GlassPane по умолчанию потреблять каждый MouseEvents, должен redispatch эти события, но потом использовать JLayer (Java7) на основе JXLayer (Java6) вместо GlassPane

  • GlassPane по умолчанию никогда не потреблять KeyEventsнужно добавить KeyListener и позвонить keyEvent.consume()

Другие вопросы по тегам