2016-12-10 4 views
0

У меня есть 2 класса называемые ShopFrame (JFrame) и Импортер (Имеет некоторые поля)Новичок: У меня есть 2 класса Java; JFrame и класс с важными переменными и методами. Как контролировать приоритет? (Подробнее читать)

фрейму имеет JList, и для того, чтобы быть заселена она вызывает в DefaultListModel от импортера класс, но он ВСЕГДА кажется пустым, когда я запускаю класс JFrame.

В классе Importer я объявляю пустой DefaultListModel, а ниже этого в основном методе я использую методы для заполнения его информацией о базе данных. Если я напишу петлю println внутри метода, это покажет мне, что все объекты были успешно добавлены в объявленный DefaultListModel. Задача состоит в том, что JFrame, кажется, вызывает объект, объявленный до его заполнения.

Это может быть действительно глупый вопрос о наследстве или что-то в этом роде! Но, пожалуйста, помогите мне, если сможете.

Я не думал, что для этого нужен пример, но, пожалуйста, спросите, если требуется, это похоже на более простой логический вопрос.

Спасибо!

ShopFrame Класс

public class ShopFrame extends JFrame { 

    public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       ShopFrame frame = new ShoppingFrame(); 
       frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

    public ShoppingFrame() { 
    setTitle("Shopping Application\r\n"); 
    // Adaptive window size 
    setPreferredSize(new Dimension(this.getWidth(), this.getHeight())); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setBounds(100, 100, 900, 556); 
    GridBagLayout gridBagLayout = new GridBagLayout(); 
    gridBagLayout.columnWidths = new int[]{45, 0, 20, 0, 45, 1, 45, 0, 20, 0, 45, 0}; 
    gridBagLayout.rowHeights = new int[]{45, 0, 0, 0, 0, 0, 20, 0, 0, 20, 0, 0, 20, 0, 30, 0, 45, 0}; 
    gridBagLayout.columnWeights = new double[]{0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, Double.MIN_VALUE}; 
    gridBagLayout.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE}; 
    getContentPane().setLayout(gridBagLayout); 

    JPanel panel = new JPanel(); 
    panel.setMinimumSize(new Dimension(5, 20)); 
    panel.setBackground(SystemColor.scrollbar); 
    GridBagConstraints gbc_panel = new GridBagConstraints(); 
    gbc_panel.gridheight = 17; 
    gbc_panel.insets = new Insets(0, 0, 0, 5); 
    gbc_panel.fill = GridBagConstraints.BOTH; 
    gbc_panel.gridx = 5; 
    gbc_panel.gridy = 0; 
    getContentPane().add(panel, gbc_panel); 

    //Importer.productsModel.addElement("This gets added to the empty DefaultListModel, but not the Importer Class's info."); 
    JList<String> productBox = new JList<String>(Importer.productsModel); 
    GridBagConstraints gbc_list = new GridBagConstraints(); 
    gbc_list.gridheight = 4; 
    gbc_list.gridwidth = 3; 
    gbc_list.insets = new Insets(0, 0, 5, 5); 
    gbc_list.fill = GridBagConstraints.BOTH; 
    gbc_list.gridx = 1; 
    gbc_list.gridy = 2; 
    getContentPane().add(productBox, gbc_list); 
    } 

Импортер Класс

class Importer { 

// Declarations 
public static ArrayList<Product> productList = new ArrayList<Product>(); 
public static DefaultListModel<String> productsModel = new DefaultListModel<String>(); 

// Connect to database 
private static Connection connect = null; 

// Running parts of SQL 
private static Statement statement = null; 

// Running parts of SQL that take parameters 
private static PreparedStatement preparedStatement = null; 

// Result from a SELECT CELL statement 
private static ResultSet resultSetProducts = null; 
} 

public static void main(String[] args) { 
    try { 
     connect = DriverManager.getConnection(
       "jdbc:mysql://localhost/shop?useSSL=true" 
       + "&user=root&password=Pa$$"); 

     statement = connect.createStatement(); 

     // This imports products into a collection 
     resultSetProducts = statement.executeQuery(
       "select * from shop.products"); 
     exportProductsAsCollection(resultSetProducts, productList, productsModel); 

     connect.close(); 

    } catch (Exception e) { 
     System.out.println(e); 
    } 
} 

public static void exportProductsAsCollection(ResultSet resultSetProducts, ArrayList<Product> productList, DefaultListModel<String> productModel) throws SQLException { 

    while (resultSetProducts.next()) { 
     // Adds each product object (Product) into ArrayList 
     productList.add(new Product(resultSetProducts.getString("ProductName"), resultSetProducts.getDouble("Price"))); 
    } 
     // Exports names of products for use in JList 
     String[] arr = new String[productList.size()]; 
     for (int i = 0; i < arr.length; i++) 
     { 
     arr[i] = productList.get(i).getProductName(); 
     productModel.addElement(arr[i]); 
     // To test 
    System.out.println(arr[i]); 
     } 
    } 
+2

Нам нужен код, чтобы найти ошибку, потому что ошибка указана в коде. Мы не можем достоверно знать, что ваш код, просто прочитав ваше описание. Код имеет значение. –

+0

Конечно, просто добавил. Спасибо за ваше время! –

ответ

0

Вы запустите приложение. Вызывается основной метод ShopFrame. Это вызывает конструктор ShopFrame. Этот конструктор создает JList с Importer.productsModel в качестве своей модели.

Обратите внимание, что в описанной выше последовательности основной метод импортера никогда не вызывается нигде: приложение имеет только одну точку входа, а не две. Поскольку это тот метод, который заполняет productModel, он никогда не заполняется и, таким образом, пуст.

Удалите этот основной метод и преобразуйте его в метод, который создает, заполняет и возвращает данные, необходимые в вашем фрейме. Удалите все эти статические переменные.

Вызовите этот новый метод из своего фрейма и заполните JList тем, что возвращается.

Свинг - довольно сложный API. Я бы с удовольствием ознакомился с понятиями классов, объектов, методов, прежде чем идти дальше с Swing. Также обратите внимание, что ваш вопрос не имеет ничего общего с наследованием, несмотря на то, что говорится в названии. Так что это, вероятно, еще одна концепция, которую вы должны ознакомиться.

+0

Я думал о том, что ты сказал - это так много смысла! Извиняюсь за глупые ошибки - вы можете не поверить, что я только начал программировать 9 недель назад! Все еще привык. –

+0

НАКОНЕЦ! После трех дней экспериментов я упустил такую ​​простую концепцию. Теперь он отлично работает. Моя следующая работа заключается в том, чтобы закончить это, но я думаю, что я смогу быстро закончить логику для остальных. Большое вам спасибо за совет и помощь. Я могу вернуться за дополнительной помощью в ближайшее время, но я очень ценю помощь! –

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