2012-02-08 2 views
0

Я потерял: У меня есть JFrame, в JFrame является JTabbedPane и JTabbedPane 4 JPanels (вкладки). На каждой вкладке() JPanel является JScrollPane с JTable (всего: 4 для JTable). Каждый JTable Я заполняю данными из БД в момент запуска приложения - отлично работает.JTable событие вид

Теперь я хотел бы заполнить данные для каждого JTable в тот момент, когда я нажимаю на JTabbedPane (табл). Я пытался: "public class MyTest1Tab extends JPanel implements FocusListener" с "this.addFocusListener(this);" в конструкторе, и я внедрил focusGained(FocusEvent e) and focusLost(FocusEvent e) методов. Но я чувствую, что это решение не является правильным.

С моей точки зрения мне нужно что-то вроде прослушивания для мыши на закладках на JTabbedPane или какое-то событие, которое срабатывает, когда JTable показано.

Кто-нибудь знает, как я могу слушать конкретные JTable показан?

+0

вы ищете ChangeListener на с закладками – xyz

+0

спасибо, делая некоторые примеры с этим слушателем. имеют небольшую проблему: он должен возвращать имя вкладки или индекс. имя вкладки не является хорошим (приложение является многоязычным). когда я буду зависеть от индекса табуляции, может ли он измениться? - например, когда я добавляю кнопку для вкладок, а затем закрываю вторую вкладку с четырех вкладок, а затем добавляю эту вкладку назад (из меню), вкладка будет последней. изменит индекс? – 1ac0

+0

ok, после некоторого уточнения окончательного (?) Решения: порядок табуляции основан на заказе запуска приложения - порядке «jTabbedPane.addTab (« закладка теста 1 », null, panelTest1, null)» в app gui init. это не изменится, даже если вкладка закрыта, а затем снова открыта во время действия приложения.поэтому, если вкладка была в позиции 0, затем закрыта, а затем программно повторно открыта в позиции 4, индекс будет равен 0. – 1ac0

ответ

2

Now I would like populate data for each JTable at the moment when I click on JTabbedPane (tab).

не делать, что этот путь, потому что свинг GUI будет un_responsive или заморозить до тех пор пока тяжелая и длинная задача закончилась, вы должны перенаправить эти Такса к задаче фона, для графического интерфейса Swing есть два способа

или

  • Runnable#Thread, обратите внимание на все выходные в GUI Качели должны быть обернуты внутри invokeLater(), example

, этот путь должен быть user_non_friendly, давайте содержание пользователя обновление JTable от JButton

+0

да, теперь это, поиск данных будет в фоновом задании, и во время разговора с базой данных будет модальный jdialog " подождите, загрузка данных ... » – 1ac0

0

я думаю, вы должны зарегистрироваться обработчик события с JTabbedPane. Он предоставит вам выбранную вкладку, а затем на основе того, что вы можете заполнить Jtable, специфичную для этого JTab.

, например:

    tabbedPane.addChangeListener(new ChangeListener() { 

     @Override 
     public void stateChanged(ChangeEvent arg0) { 
      // TODO Auto-generated method stub 
      if((((JTabbedPane)arg0.getSource()).getSelectedIndex())==0) 
          { 
           //Load Jtable associated with first JTab 
          } 

     } 
    }); 
+0

уверен, что после некоторой разработки я проверил, что если у меня есть 4 вкладки на jtabbedpane, а затем программно закрывать и открывать вкладку, индекс будет таким же, не имеет значения, изменилась ли позиция. индекс основан на первом запуске первого запуска приложения и не изменится. , поэтому каждый jpanel будет знать его индекс, а в главном классе приложения должна быть общедоступная статическая переменная, поэтому приложение знает фактическую открытую вкладку. и каждый jpanel будет проверять это свойство, чтобы он мог решить, перезагружать ли данные или нет. – 1ac0

Смежные вопросы