【问题标题】:Importing a JLabel array into a JComponent将 JLabel 数组导入 JComponent
【发布时间】:2012-07-05 07:34:48
【问题描述】:

我环顾四周试图解决我的问题,但找不到任何解决此问题的方法。我对 java 很陌生,我正在尝试在不使用控制台的情况下完成书中的项目,但这就是我所拥有的,

import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JOptionPane;


public class FutureInvestmentValue {
public static void main(String[] args) {
    double investmentAmount = Double.parseDouble(JOptionPane.showInputDialog(null, "Enter in the investment amount as a double.", "Investment Amout",
            JOptionPane.PLAIN_MESSAGE));

    double monthlyInterestRate = Double.parseDouble(JOptionPane.showInputDialog(null, "Enter in the monthly interest rate as a double.", "Monthly Interest Rate",
            JOptionPane.PLAIN_MESSAGE));

    int years = 30;

    final JComponent[] outputHeader = new JComponent[] {
            new JLabel("The amount invested: " + investmentAmount),
            new JLabel("Annual interest Rate: " + monthlyInterestRate),
            new JLabel("Years       Future Value"),
    };


    JOptionPane.showMessageDialog(null, outputHeader + futureInvestmentValue(investmentAmount, monthlyInterestRate, years), "Future Investment Value",
            JOptionPane.INFORMATION_MESSAGE);
}

public static JComponent[] futureInvestmentValue(double investmentAmount, double monthlyInterestRate, int years) {
    final JComponent[] investmentArray = new JComponent[years];
    for (int i = 1; i <= years; i++) {
        double investmentTotal = investmentAmount + (investmentAmount * ((monthlyInterestRate / 10) * i));
        investmentArray[i] = new JLabel(i + "              " + investmentTotal);
    }

return investmentArray;
}
}

似乎我收到了要更改 futureInvestmentValue(); 的错误。到一个 Jcomponent,当我这样做时,会发生另一个错误,它只是让我绕圈子,从 JLabel 更改为 JLabel[] 到 Jcomponent 到 Jcomponent[] 等等。任何可以用不会让新手感到困惑的术语向我解释的帮助将不胜感激。

【问题讨论】:

    标签: java arrays swing jlabel jcomponent


    【解决方案1】:
    • 为什么要创建一个 JLabel 数组,来用 JTable 代替,

    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.util.Random;
    import java.util.concurrent.*;
    import javax.swing.*;
    import javax.swing.event.*;
    import javax.swing.table.DefaultTableModel;
    
    public class ChangeNotifiersOnEvent extends JFrame implements Runnable {
    
        private static final long serialVersionUID = 1L;
        private boolean runProcess = true;
        private Random random = new Random();
        private javax.swing.Timer timerRun;
        private Executor executor = Executors.newCachedThreadPool();
        private String[] columnNames = {"Source", "Hit", "Last", "Ur_Diff"};
        private JTable table;
        private Object[][] data = {{"Swing Timer", 2.99, 5, 1.01},
            {"Swing Worker", 7.10, 5, 1.010}, {"TableModelListener", 25.05, 5, 1.01}};
        private DefaultTableModel model = new DefaultTableModel(data, columnNames);
    
        public ChangeNotifiersOnEvent() {
            table = new JTable(model) {
    
                private static final long serialVersionUID = 1L;
    
                @Override
                public Class getColumnClass(int column) {
                    return getValueAt(0, column).getClass();
                }
            };
            model.addTableModelListener(new TableModelListener() {
    
                @Override
                public void tableChanged(TableModelEvent tme) {
                    if (tme.getType() == TableModelEvent.UPDATE) {
                        if (tme.getColumn() == 1 && tme.getLastRow() == 2) {
                            double dbl = ((Double) table.getModel().getValueAt(2, 1))
                                    - ((Integer) table.getModel().getValueAt(2, 2));
                            table.getModel().setValueAt(dbl, 2, 3);
                        } else if (tme.getColumn() == 1 && tme.getLastRow() == 0) {
                            prepareUpdateTableCell();
                        } else if (tme.getColumn() == 1 && tme.getLastRow() == 1) {
                            executor.execute(new MyTask(MyTask.UPDATE_TABLE_COLUMN));
                        }
                    }
                }
            });
            table.setRowHeight(30);
            table.setFont(new Font("Serif", Font.BOLD, 20));
            table.getColumnModel().getColumn(0).setPreferredWidth(180);
            table.setPreferredScrollableViewportSize(table.getPreferredSize());
            JScrollPane scrollPane = new JScrollPane(table);
            add(scrollPane, BorderLayout.CENTER);
            new Thread(this).start();
        }
    
        private void prepareUpdateTableCell() {
            timerRun = new javax.swing.Timer(10, UpdateTableCell());
            timerRun.setRepeats(false);
            timerRun.start();
        }
    
        private Action UpdateTableCell() {
            return new AbstractAction("Update Table Cell") {
    
                private static final long serialVersionUID = 1L;
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    double dbl = ((Double) table.getModel().getValueAt(0, 1))
                            - ((Integer) table.getModel().getValueAt(0, 2));
                    table.getModel().setValueAt(dbl, 0, 3);
                }
            };
        }
    
        @Override
        public void run() {
            while (runProcess) {
                try {
                    Thread.sleep(330);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                changeTableValues();
            }
        }
    
        private void changeTableValues() {
            Runnable doRun = new Runnable() {
    
                @Override
                public void run() {
                    table.getModel().setValueAt(random.nextInt(128) + random.nextDouble(), 0, 1);
                    table.getModel().setValueAt(random.nextInt(256) + random.nextDouble(), 1, 1);
                    table.getModel().setValueAt(random.nextInt(512) + random.nextDouble(), 2, 1);
    
                    table.getModel().setValueAt(random.nextInt(128), 0, 2);
                    table.getModel().setValueAt(random.nextInt(128), 1, 2);
                    table.getModel().setValueAt(random.nextInt(128), 2, 2);
                }
            };
            SwingUtilities.invokeLater(doRun);
        }
    
        private class MyTask extends SwingWorker<Void, Integer> {
    
            private static final String UPDATE_TABLE_COLUMN = "update";
            private String namePr;
            private double dbl;
    
            MyTask(String str) {
                this.namePr = str;
            }
    
            @Override
            protected Void doInBackground() throws Exception {
                dbl = ((Double) table.getModel().getValueAt(1, 1))
                        - ((Integer) table.getModel().getValueAt(1, 2));
                return null;
            }
    
            @Override
            protected void done() {
                SwingUtilities.invokeLater(new Runnable() {
    
                    @Override
                    public void run() {
                        table.getModel().setValueAt(dbl, 1, 3);
                    }
                });
            }
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    ChangeNotifiersOnEvent frame = new ChangeNotifiersOnEvent();
                    frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
                    frame.setLocation(150, 150);
                    frame.pack();
                    frame.setVisible(true);
                }
            });
        }
    }
    
    • 您可以在运行时添加/删除行,

    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.*;
    import javax.swing.table.*;
    
    public class RemoveAddRows extends JFrame {
    
        private static final long serialVersionUID = 1L;
        private Object[] columnNames = {"Type", "Company", "Shares", "Price"};
        private Object[][] data = {
            {"Buy", "IBM", new Integer(1000), new Double(80.50)},
            {"Sell", "MicroSoft", new Integer(2000), new Double(6.25)},
            {"Sell", "Apple", new Integer(3000), new Double(7.35)},
            {"Buy", "Nortel", new Integer(4000), new Double(20.00)}
        };
        private JTable table;
        private DefaultTableModel model;
    
        public RemoveAddRows() {
    
            model = new DefaultTableModel(data, columnNames) {
    
                private static final long serialVersionUID = 1L;
    
                @Override
                public Class getColumnClass(int column) {
                    return getValueAt(0, column).getClass();
                }
            };
            table = new JTable(model) {
    
                private static final long serialVersionUID = 1L;
    
                @Override
                public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
                    Component c = super.prepareRenderer(renderer, row, column);
                    int firstRow = 0;
                    int lastRow = table.getRowCount() - 1;
                    int width = 0;
                    if (row == lastRow) {
                        ((JComponent) c).setBackground(Color.red);
                    } else if (row == firstRow) {
                        ((JComponent) c).setBackground(Color.blue);
                    } else {
                        ((JComponent) c).setBackground(table.getBackground());
                    }
                    /*if (!isRowSelected(row)) {
                    String type = (String) getModel().getValueAt(row, 0);
                    c.setBackground("Buy".equals(type) ? Color.GREEN : Color.YELLOW);
                    }
                    if (isRowSelected(row) && isColumnSelected(column)) {
                    ((JComponent) c).setBorder(new LineBorder(Color.red));
                    }*/
                    return c;
                }
            };
            table.setPreferredScrollableViewportSize(table.getPreferredSize());
            JScrollPane scrollPane = new JScrollPane(table);
            add(scrollPane);
            JButton button1 = new JButton("Remove all rows");
            button1.addActionListener(new ActionListener() {
    
                public void actionPerformed(ActionEvent arg0) {
                    if (model.getRowCount() > 0) {
                        for (int i = model.getRowCount() - 1; i > -1; i--) {
                            model.removeRow(i);
                        }
                    }
                    System.out.println("model.getRowCount() --->" + model.getRowCount());
                }
            });
            JButton button2 = new JButton("Add new rows");
            button2.addActionListener(new ActionListener() {
    
                public void actionPerformed(ActionEvent arg0) {
                    Object[] data0 = {"Buy", "IBM", new Integer(1000), new Double(80.50)};
                    model.addRow(data0);
                    Object[] data1 = {"Sell", "MicroSoft", new Integer(2000), new Double(6.25)};
                    model.addRow(data1);
                    Object[] data2 = {"Sell", "Apple", new Integer(3000), new Double(7.35)};
                    model.addRow(data2);
                    Object[] data3 = {"Buy", "Nortel", new Integer(4000), new Double(20.00)};
                    model.addRow(data3);
                    System.out.println("model.getRowCount() --->" + model.getRowCount());
                }
            });
            JPanel southPanel = new JPanel();
            southPanel.add(button1);
            southPanel.add(button2);
            add(southPanel, BorderLayout.SOUTH);
        }
    
        public static void main(String[] args) {
            RemoveAddRows frame = new RemoveAddRows();
            frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    }
    

    【讨论】:

    • @user1329572:mKorbel 的解决方案是正确的 (1+),但您的解决方案也是可行的。当你删除它时,我正在投票。 :(
    • 是的 mKorbels 解决方案对于像我这样的人来说绝对是很酷的,user1329572 对于像我这样的人来说更容易理解,但我会花一些时间查看 mKorbels 代码以了解如何从中实现我的解决方案。谢谢你们。
    猜你喜欢
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 2014-09-19
    • 2021-11-01
    相关资源
    最近更新 更多