2014-11-05 4 views
2

У меня есть JTable в приложении Swing. У меня есть JCheckBox, чтобы переключить видимость столбца. Теперь, когда я выбираю строку из таблицы и перемещаю мышь над флажком, выбор таблицы, похоже, исчезает.JCheckBox messing up Выбор JTable

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

weirdness 1

weirdness 2

Вот упрощенный пример, который производит эффект:

import java.awt.BorderLayout; 
import javax.swing.*; 
import javax.swing.table.DefaultTableModel; 

public class JTableSelection extends JFrame { 
    public JTableSelection() { 
     super("Test"); 
     try { 
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     } catch (Exception e) {} 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setLayout(new BorderLayout()); 
     JTable table = new JTable(); 
     table.setModel(new DefaultTableModel(new String[] { "item", "another", 
       "one more" }, 3)); 
     table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     add(new JCheckBox("Example"), BorderLayout.PAGE_START); 
     add(new JScrollPane(table), BorderLayout.CENTER); 
    } 
    public static void main(String[] args) { 
     new JTableSelection().setVisible(true); 
    } 
} 

Почему глюк выбор из, как это (или кто-нибудь знает)? Как я могу заставить его работать?

В случае это имеет значение, версия Java VM работает это:

java version "1.7.0_67" 
Java(TM) SE Runtime Environment (build 1.7.0_67-b01) 
Java HotSpot(TM) 64-Bit Server VM (build 24.65-b04, mixed mode) 

EDIT. Я обнаружил странное поведение этого. Эффект полностью исчезает при максимизации кадра и появляется только при перезапуске приложения.

+0

'добавить (таблица, BorderLayout.CENTER);' таблицы могут вести себя странно, если их не добавить в панель прокрутки. Попробуйте вместо этого добавить (новый JScrollPane (таблица), BorderLayout.CENTER); ' –

+0

Я получаю четыре события. - стандартные события из ListSelectionModel – mKorbel

+0

@mKorbel Почему я получаю только два события, когда отбор работает нормально? – Pietu1998

ответ

1

Может быть, вам нужно позвонить JFrame#pack() после JFrame#add(...) и перед JFrame#setVisible(true).

How to Make Frames (Main Windows) (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)
Создание и показ Frames
4. Способ пакета размеры рамы таким образом, что все ее содержимое на уровне или выше их предпочтительных размеров. Альтернативой пакету является установка размера фрейма явным путем вызова setSize или setBounds (который также устанавливает местоположение фрейма).

1.7.0_72 на Windows 7 x64
же или подобное происходит JButton + JScrollPane + JTree:

enter image description here

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class JTreeSelection extends JFrame { 
    public JTreeSelection() { 
    super("Test"); 
    try { 
     UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
    } catch (Exception e) {} 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 
    setLayout(new BorderLayout()); 
    add(new JButton("Example"), BorderLayout.PAGE_START); 
    add(new JScrollPane(new JTree()), BorderLayout.CENTER); 
    //pack(); 
    //setSize(320, 240); 
    } 
    public static void main(String[] args) { 
    //You may also need to understand the EDT 
    //EventQueue.invokeLater(new Runnable() { 
    // @Override public void run() { 
    //  new JTreeSelection().setVisible(true); 
    // } 
    //}); 
    new JTreeSelection().setVisible(true); 
    } 
} 
+0

+1 для приятного отсутствия GPU, но на моей стороне невозможно смоделировать это (сегодня, низкопрофильный, физический GPU), с или без JScrollPane содержит JList/JTree/JTable – mKorbel

+1

@mKorbel Я запускаю «Intel® Core ™ i5- 2400 CPU @ 3.10GHz'/'Intel® HD Graphics'. – aterai

+0

Хорошо. Проблема, похоже, не возникает на других компьютерах. Спасибо в любом случае, я попробую 'pack()', когда я, наконец, верну приложение на свой ноутбук. – Pietu1998

1

@not ответ Java7/Win8

the selection of the table seems to disappear. - Я не могу к моделированию (должен быть вопрос с помощью Nimbus L & F)

mouse_hover_over

enter image description here

JCheckBox .isArmed

enter image description here

JCheckBox.isSelected

enter image description here

.

.

Java1.7.0_67/Win7_64b

enter image description here

.

enter image description here

.

enter image description here

+0

Я положил его в 'JScrollPane', и теперь я получаю все виды странных эффектов, например [this] (http://imgur.com/a/HQg4i). – Pietu1998

+0

Хорошо. Проблема, похоже, не возникает на других компьютерах. Однако я попытаюсь использовать 'pack()' и заголовок. – Pietu1998

1

код прекрасно работает на Linux, с или без панели прокрутки вокруг стола

Я согласен с комментарием Андрея хотя:

  • либо поставить JTable в JScrollPane
  • или убедитесь, что вы сами добавили заголовок, как показано на странице JTable tutorial

    add(new JCheckBox("Example"), BorderLayout.PAGE_START); 
    
    JPanel tablePanel = new JPanel(new BorderLayout()); 
    tablePanel.add(table.getTableHeader(), BorderLayout.PAGE_START); 
    tablePanel.add(table, BorderLayout.CENTER); 
    
    add(tablePanel, BorderLayout.CENTER); 
    
+0

Хорошо. Проблема, похоже, не возникает на других компьютерах. Я попробую 'pack()' вещь из другого ответа, и это, однако. – Pietu1998