2016-04-28 10 views
2

Я пытаюсь сделать простой двух столбцов в определенном порядке.GridBagLayout Не хранить заказ

Он должен выглядеть следующим образом:

Два статических заголовков в верхнем ряду и 5 панелей в колонке под каждым

В результате я получаю однако это пустой стол слева и все детали выстроились горизонтально справа. Проблема заключается в том, что детали загружаются в реальном времени из Интернета и обновляются каждые 8 ​​секунд, поэтому мне необходимо обновить каждую отдельную ячейку при обновлении данных (именно поэтому я не использую GridLayout)

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

Не могли бы вы помочь мне разобраться в заказе? Благодаря

import NeuralNet.NeuralNet; 

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

public class MWindow { 

public MWindow(String[] c){ 

    JFrame mainFr = new JFrame("Current Predictions"); 
    mainFr.setSize(800, 800); 
    mainFr.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    mainFr.setVisible(true); 
    JPanel p = new JPanel(new GridBagLayout()); 
    GridBagConstraints cns = new GridBagConstraints(); 
    cns.fill = GridBagConstraints.HORIZONTAL; 
    cns.insets = new Insets(5,5,15,15); 
    mainFr.add(p); 


    JTextArea man = new JTextArea("MANUFACTURING 5"); 
    cns.gridx = 0; 
    cns.gridy = 0; 
    cns.weightx = 1.0; 
    cns.weighty = 1.0; 
    cns.fill = GridBagConstraints.BOTH; 
    p.add(man, cns); 
    JTextArea inter = new JTextArea("INTERNET 5"); 
    cns.gridx = 1; 
    cns.gridy = 0; 
    cns.weightx = 1.0; 
    cns.weighty = 1.0; 
    cns.fill = GridBagConstraints.BOTH; 
    p.add(inter, cns); 

    JPanel aapl = new JPanel(); 
    JPanel msft = new JPanel(); 
    JPanel intc = new JPanel(); 
    JPanel ibm = new JPanel(); 
    JPanel tsla = new JPanel(); 
    JPanel fb = new JPanel(); 
    JPanel goog = new JPanel(); 
    JPanel yhoo = new JPanel(); 
    JPanel twtr = new JPanel(); 
    JPanel amzn = new JPanel(); 

    p.setBackground(Color.white); 
    mainFr.setBackground(Color.white); 

    while (true) { 
     for (String cmp : c) { 
      JPanel stkPanel = new JPanel(); 
      stkPanel.setBackground(Color.white); 
      if (!(cmp.equals("INTER5") || cmp.equals("MANU5") || cmp.equals("ALL"))) { 

       Asset a = new Asset(cmp); 
       NeuralNet n = Functions.loadNN(cmp); 
       NeuralNet nA = Functions.loadNN("ALL"); 
       NeuralNet n5; 
       if (cmp.equals("MSFT") || cmp.equals("AAPL") || cmp.equals("INTC") || cmp.equals("IBM") || cmp.equals("TSLA")) { 
        n5 = Functions.loadNN("MANU5"); 
       } else if (cmp.equals("TWTR") || cmp.equals("YHOO") || cmp.equals("GOOG") || cmp.equals("FB") || cmp.equals("AMZN")) { 
        n5 = Functions.loadNN("INTER5"); 
       } else { 
        System.out.println("ERROR"); 
        n5 = n; 
       } 

       double pred = n.PredictRows(Functions.formatData(a)); 
       double pred5 = n5.PredictRows(Functions.formatData(a)); 
       double predA = nA.PredictRows(Functions.formatData(a)); 
       JTextArea stkPred = new JTextArea(); 
       stkPred.setText("Stock: " + cmp + 
         "\nCurrent Price: " + "$" + a.getCurrPrice().toString() + 
         "\nPrediction 1: " + Double.toString(pred) + 
         "\nPrediction 2: " + Double.toString(pred5) + 
         "\nPrediction 3: " + Double.toString(predA)); 
       stkPred.setFont(new Font("Helvetica", Font.BOLD, 15)); 
       int pr = Functions.calcBS(pred, pred5, predA); 
       JTextArea act = new JTextArea(); 
       if (pr == -1) { 
        act.setText("SELL"); 
        act.setForeground(Color.red); 
       } else if (pr == 1) { 
        act.setText("BUY"); 
        act.setForeground(Color.green); 
       } else { 
        act.setText("HOLD"); 
        act.setForeground(Color.orange); 

       } 
       act.setFont(new Font("Helvetica", Font.BOLD, 15)); 

       stkPanel.add(stkPred); 
       stkPanel.add(act); 

       switch (cmp) { 
        case "MSFT": 
         msft.removeAll(); 
         msft.add(stkPanel); 
         msft.revalidate(); 
         msft.repaint(); 
         cns.gridx = 0; 
         cns.gridy = 2; 
         cns.weightx = 1.0; 
         cns.weighty = 1.0; 
         cns.fill = GridBagConstraints.BOTH; 
         p.add(msft, cns); 
        case "AAPL": 
         aapl.removeAll(); 
         aapl.add(stkPanel); 
         aapl.revalidate(); 
         aapl.repaint(); 
         cns.gridx = 0; 
         cns.gridy = 1; 
         cns.weightx = 1.0; 
         cns.weighty = 1.0; 
         cns.fill = GridBagConstraints.BOTH; 
         p.add(aapl, cns); 
        case "INTC": 
         intc.removeAll(); 
         intc.add(stkPanel); 
         intc.revalidate(); 
         intc.repaint(); 
         cns.gridx = 0; 
         cns.gridy = 3; 
         p.add(intc, cns); 
        case "IBM": 
         ibm.removeAll(); 
         ibm.add(stkPanel); 
         ibm.revalidate(); 
         ibm.repaint(); 
         cns.gridx = 0; 
         cns.gridy = 4; 
         p.add(ibm, cns); 
        case "TSLA": 
         tsla.removeAll(); 
         tsla.add(stkPanel); 
         tsla.revalidate(); 
         tsla.repaint(); 
         cns.gridx = 0; 
         cns.gridy = 5; 
         p.add(tsla, cns); 
        case "TWTR": 
         twtr.removeAll(); 
         twtr.add(stkPanel); 
         twtr.revalidate(); 
         twtr.repaint(); 
         cns.gridx = 1; 
         cns.gridy = 4; 
         p.add(twtr, cns); 
        case "FB": 
         fb.removeAll(); 
         fb.add(stkPanel); 
         fb.revalidate(); 
         fb.repaint(); 
         cns.gridx = 1; 
         cns.gridy = 1; 
         p.add(fb, cns); 
        case "AMZN": 
         amzn.removeAll(); 
         amzn.add(stkPanel); 
         amzn.revalidate(); 
         amzn.repaint(); 
         cns.gridx = 1; 
         cns.gridy = 5; 
         p.add(amzn, cns); 
        case "GOOG": 
         goog.removeAll(); 
         goog.add(stkPanel); 
         goog.revalidate(); 
         goog.repaint(); 
         cns.gridx = 1; 
         cns.gridy = 2; 
         p.add(goog, cns); 
        case "YHOO": 
         yhoo.removeAll(); 
         yhoo.add(stkPanel); 
         yhoo.revalidate(); 
         yhoo.repaint(); 
         cns.gridx = 1; 
         cns.gridy = 3; 
         p.add(yhoo, cns); 
       } 
       p.add(stkPanel); 
       p.revalidate(); 
      } 
     } 

     try { 
      Thread.sleep(10000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
    } 

ответ

3

Во-первых, я настоятельно рекомендую вам взглянуть на Concurrency in Swing, как вы нарушаете однопоточный характер Swing.

Предлагаю вам обратиться к Worker Threads and SwingWorker за возможным решением.

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

Информация, которую вы обычно обновляете, не такая динамическая, данные есть, но способ ее представления не является.

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

Я бы создал ряд этих компонентов и поместил их в контейнер любым способом, возможно, используя Map, чтобы связать их (чтобы вы могли искать компонент для данного источника данных при его изменении).

Затем я просто передал данные/модель соответствующему компоненту, когда он изменится, и он может просто обновить дисплей.

Основываясь на том, что я могу сказать из своего кода, JTable бы, вероятно, пойти по пути, а также ряд JLabel с/JTextField с, что делает его гораздо проще обновить пользовательский интерфейс с.

Было бы также проще добавлять/удалять источники данных