У меня есть много вещей, реализованных в ComponentAdapter
Java. Поскольку он загружает данные из базы данных и отображает их в JTable
, я добавил их в другой поток. Я покажу вам один метод, который вызывается таким ComponentAdapter
Приложение замораживается, когда база данных называется
private class DisplayInitialRevenue_Thread implements Runnable
{
@Override
public void run()
{
displayInitialRevenue_Method();
}
}
private void displayInitialRevenue_Method()
{
//Get the dates from the combo
String selectedCouple = revenueYearCombo.getSelectedItem().toString();
if(selectedCouple.equals("Select Year"))
{
return;
}
String[] split = selectedCouple.split("/");
//Related to DB
double totalamountInvested;
//Get data from the database
dbConnector = new DBHandler();
dbConnector.makeConnection();
DefaultTableModel model = (DefaultTableModel) initialRevenueTable.getModel();
model.setRowCount(0);
ResultSet selectAllDetails = dbConnector.selectAllDetails("SQL CODE HERE ");
try
{
if(selectAllDetails.isBeforeFirst()==false)
{
JOptionPane.showMessageDialog(null,"This table is empty");
}
else
{
while(selectAllDetails.next())
{
String clientName = selectAllDetails.getString("Client Name");
String providerName = selectAllDetails.getString("Provider Name");
Double amountInvested = selectAllDetails.getDouble("Invest_Amount");
//Get Other Data
//Update the table
Object[]row = {dateS,clientName,providerName,amountInvested};
model.addRow(row);
//Get the total
amountInvested = amountInvested+amountInvested;
}
//Add the sum
Object[]blankRow = {null,null,null,null};
model.addRow(blankRow);
Object[]row = {dateS,clientName,providerName,amountInvested};
}
}
catch(SQLException sql)
{
JOptionPane.showMessageDialog(null,sql.getLocalizedMessage());
}
}
И это выше нить можно назвать 3 способами. То есть на ItemListener
прилагается к JComboBox
, ActionListener
прилагается к JMenu
и ComponentListener
.
ComponentListener
private class DisplayInitialRevenue extends ComponentAdapter
{
public void componentShown(ComponentEvent e)
{
formMemorizer = FormMemorizer.Initial_Revenue;
//displayInitialRevenue_Method();
DisplayInitialRevenue_Thread t = new DisplayInitialRevenue_Thread();
t.run();
}
}
ItemListener
private class RevenueYearComboAction implements ItemListener
{
@Override
public void itemStateChanged(ItemEvent e)
{
if(e.getStateChange() == ItemEvent.SELECTED)
{
int selection = formMemorizer;
if(selection==-1)
{
return;
}
else if(selection==FormMemorizer.Initial_Revenue)
{
//displayInitialRevenue_Method();
DisplayInitialRevenue_Thread t = new DisplayInitialRevenue_Thread();
t.run();
}
}
}
У меня есть много такого рода методов, чтобы получить данные из базы данных и кормить JTable: и принимать данные из графического интерфейса и сохранить в базе данных.
Теперь, мой вопрос в том, что все это иногда замерзает, когда происходит вызов базы данных. Я думал, что это Bcs проблемы Thread, поэтому я сделал выше DisplayInitialRevenue_Thread
для вызова displayInitialRevenue_Method()
в качестве теста. Затем я вызывал только область, связанную с вызовом этого метода, но иногда зависает! Мои другие методы базы данных не находятся в отдельных потоках, но это метод, поэтому почему даже вызов «только» этого метода приводит к его замораживанию? Это в потоке!
Для заметки стороны, я нахожусь на Java 8, используя версию MySQL Server: 5.6.16 - Сервер сообщества MySQL (GPL), который поставляется с XAMPP.
пожалуйста, где замерзает, есть некоторый JProfiler используется, как, Что выход из, но описания говорить о блокировании EDT, :-) Oracle учебника - Event диспетчерского тему, мое предложение дон 't использовать SwingWorker для производственного кода, – mKorbel
голосование закрывается как слишком широкое – mKorbel
@mKorbel: В одном из нижеприведенных ответов говорится: «Используйте SwingWorker» –