每次在for循环中执行的代码中打开新的摆动窗口时

时间:2019-10-09 13:15:29

标签: java swing for-loop

每次在for循环中执行的代码中都会打开一个新的摆动窗口。

我有一些在for循环中运行的代码。 for循环每次都会为我的多维数组提供一个新值。

但是,每次我的for循环创建open时都会打开一个新窗口,但不会关闭旧窗口。 我该如何解决这个问题?我想关闭旧窗口并用新的实际值刷新窗口,或者只打开一个窗口,并且for循环的新值根据多维数组名称数据刷新表内的值。

因为现在已经打开了200多个窗口(每隔一秒钟就会打开一个新窗口),并且一分钟后我看不到新值出现在计算机上,所以计算机死机了。

data.results.slice(0, 4).forEach(res => {
      html.push(`<h1>${res.title}</h1>`);
      html.push(`<p>${res.url}</p>`);
      html.push(`<p>${res.abstract}</p>`);
      html.push(`<p>${res.published_date}</p>`);
      html.push(`<image>${res.multimedia[4]}</image>`);
    })

代码的第二部分已编辑:

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;

import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.Timer;

public class UAppWin {

    private static final int Status_COL = 1;

    String[][] data = new String[3][3];
    int dptr;

    String[] cols = { "Feature", "Status", "Value" };

    public UAppWin(String label, int nphases) {
        System.out.println("UApp \"" + label + "\" (" + nphases + " phases)");
    }

    void newCycle(int phasenr) {
        System.out.println("UApp =============================");
        dptr = 0;
    }

    void addEntry(int index, double tim, String label, int status, double dval) {
        System.out.println("Uapp [" + index + "] " + label + "(" + status + ") " + dval);

        data[dptr][0] = label;
        data[dptr][1] = "" + status;
        data[dptr][2] = "" + dval;
        dptr++;

    }

    void addMessage(String msg) {
        System.out.println("Uapp alert: " + msg);
        // rode balk met bericht
    }

    void deleteMessage() {

    }

    void endCycle() {
        System.out.println("UApp =============================");

        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JOptionPane.showMessageDialog(null, new JScrollPane(getNewRenderedTable(getTable())));
            }
        });

    }

    private JTable getTable() {
        DefaultTableModel model = new DefaultTableModel(data, cols);
        return new JTable(model) {
            @Override
            public Dimension getPreferredScrollableViewportSize() {
                return new Dimension(300, 150);
            }
        };
    }

    private static JTable getNewRenderedTable(final JTable table) {
        table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {
            @Override
            public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
                    boolean hasFocus, int row, int col) {
                super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
                String Status = (String) table.getModel().getValueAt(row, Status_COL);
                if ("0".equals(Status)) {
                    setBackground(Color.GREEN);
                    setForeground(Color.BLACK);
                } else if ("2".equals(Status)) {
                    setBackground(Color.RED);
                    setForeground(Color.BLACK);
                } else {
                    setBackground(Color.YELLOW);
                    setForeground(Color.BLACK);
                }
                return this;
            }
        });
        return table;
    }

}

1 个答案:

答案 0 :(得分:1)

UappWin似乎绑定到一个窗口。因此,在创建它时,还要创建一个JFrame。然后,除了run方法和声明JFrame之外,无需进行其他任何更改。

public class UAppWin {
    private JFrame frame;

    public UAppWin(String label, int nphases) {
        //System.out.println("UApp \"" + label + "\" (" + nphases + " phases)");
        JLabel label = new JLabel("UApp \"" + label + "\" (" + nphases + " phases)");


        frame = new JFrame("title");
        frame.add(label);
        frame.setVisible(true);
    }

然后在创建窗口时。

SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            //JOptionPane.showMessageDialog(null, new JScrollPane(getNewRenderedTable(getTable())));
              frame.setContentPane( new JScrollPane( getNewRenderedTable( getTable() ) );
              frame.setVisible(true);
        }
    });