2016-04-28 36 views
2

我想按特定的顺序做一个简单的两列视图。GridBagLayout不保持秩序

它应该是这样的:

两个静态头顶部排,每列5个面板下方各

但是我得到的结果是左一个空白表和所有的细节在右侧水平排列。问题是细节从互联网上实时加载和刷新每8秒,所以我需要更新每个单元格作为数据刷新(这就是为什么我不使用GridLayout

代码循环无限(不断提出最新的数据直至退出) 我无法事先初始化所有JPanels,因为每个数据点需要至少6秒才能联机。

你能帮我理清订单吗?由于

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,因为你违反了摇摆的单线程性质。

我建议你看看Worker Threads and SwingWorker寻找可能的解决方案。

你的代码有很多事情要做,很多事情都会被添加,删除和创建,这简直令人困惑。

你一般要更新的信息并不是动态的,数据是,但它呈现的方式不是。因此,我会建议做的是,创建一个封装了您想要显示的信息的自定义类,这将成为模型,然后创建一个可以以所需格式显示信息的自定义类。我会然后创建一些这些组件,并以任何你想要的方式将它们放在容器中,也许使用Map来绑定它们(这样,当它改变时,你可以查找给定数据源的组件)​​。

然后,我只是简单地将数据/模型传递给适当的组件,并且它可以更新显示。

根据我可以从您的代码中得知的信息,JTable可能会继续以及一系列JLabel s/JTextField s,从而更容易从中更新UI。

这也将使它更容易添加/删除数据源