从 JFrame 类继承到另一个类并使用变量

dra*_*002 1 java inheritance swing jbutton actionlistener

我是 Java 新手,正在开发一个使用 GUI 的程序。我的问题是我已经达到了1000 行,这很有压力,因为我所有的代码都在一个文件中。我不喜欢这个。所以我在互联网上研究了继承。但是,我不确定这如何帮助我解决我的问题,因为我所知道的所有继承都继承了父类中的所有内容。但是,当我尝试在子类中使用变量时,我不能说我在父类中有这样的东西:

JButton getButton = new JButton("Enter");

现在当我去儿童班时。我想继承并使用这个变量,所以我可以使用它不工作的 ActionListener。

那么有人可以告诉我我在这里做错了什么,或者这不是正确的方法吗?

前后谢谢大家。

这是我的一些代码:

    public class H_Store extends JFrame {

    private JCheckBox groundMeatCheckBox;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    H_Store frame = new H_Store();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public H_Store() {
        super("Hussin Store");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 1378, 657);

        JMenuBar menuBar = new JMenuBar();
        setJMenuBar(menuBar);

        JMenu mnFile = new JMenu("File");
        menuBar.add(mnFile);

        JMenu mnHelp = new JMenu("Help");
        menuBar.add(mnHelp);
        mainPane = new JPanel();
        mainPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(mainPane);
        mainPane.setLayout(new GridLayout(0, 2, 0, 0));


        JPanel meetPanel = new JPanel();
        meetPanel.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, null, null, null, null));
        mainPane.add(meetPanel);

        JLabel meatLabel = new JLabel("*Meat*");
        meatLabel.setBounds(546, 101, 79, 77);
        meatLabel.setHorizontalAlignment(SwingConstants.LEFT);
        meatLabel.setFont(new Font("Times New Roman", Font.PLAIN, 25));

        ///////////////////

        JCheckBox groundMeatCheckBox = new JCheckBox("Ground ");

        groundMeatCheckBox.setBounds(8, 71, 113, 25);
        groundMeatCheckBox.setVerticalAlignment(SwingConstants.BOTTOM);
        groundMeatCheckBox.setHorizontalAlignment(SwingConstants.LEFT);
        meetPanel.setLayout(null);
        meetPanel.add(meatLabel);
        meetPanel.add(groundMeatCheckBox);

        JCheckBox chuckMeatCheckBox = new JCheckBox("Chuck");
        chuckMeatCheckBox.setBounds(8, 126, 113, 25);
        meetPanel.add(chuckMeatCheckBox);

        JCheckBox ribMeatCheckBox = new JCheckBox("Rib");
        ribMeatCheckBox.setBounds(8, 101, 113, 25);
        meetPanel.add(ribMeatCheckBox);

        JCheckBox steakMeatCheckBox = new JCheckBox("Steak");
        steakMeatCheckBox.setBounds(8, 153, 120, 25);
        meetPanel.add(steakMeatCheckBox);

        JCheckBox flankMeatCheckBox = new JCheckBox("Flank");
        flankMeatCheckBox.setBounds(8, 183, 113, 25);
        meetPanel.add(flankMeatCheckBox);

        JCheckBox roundMeatCheckBox = new JCheckBox("Round");
        roundMeatCheckBox.setBounds(8, 213, 113, 25);
        meetPanel.add(roundMeatCheckBox);

        ground_M_QTextField = new JTextField(10);
        ground_M_QTextField.setText("0");
        ground_M_QTextField.setBounds(155, 76, 18, 16);
        meetPanel.add(ground_M_QTextField);
        ground_M_QTextField.setColumns(10);

        chuck_M_QTextField = new JTextField();
        chuck_M_QTextField.setText("0");
        chuck_M_QTextField.setColumns(10);
        chuck_M_QTextField.setBounds(155, 105, 18, 16);
        meetPanel.add(chuck_M_QTextField);

        rib_M_QTextField = new JTextField();
        rib_M_QTextField.setText("0");
        rib_M_QTextField.setColumns(10);
        rib_M_QTextField.setBounds(155, 130, 18, 16);
        meetPanel.add(rib_M_QTextField);

        steak_M_QTextField = new JTextField();
        steak_M_QTextField.setText("0");
        steak_M_QTextField.setColumns(10);
        steak_M_QTextField.setBounds(155, 157, 18, 16);
        meetPanel.add(steak_M_QTextField);

        flank_M_QTextField = new JTextField();
        flank_M_QTextField.setText("0");
        flank_M_QTextField.setColumns(10);
        flank_M_QTextField.setBounds(155, 187, 18, 16);
        meetPanel.add(flank_M_QTextField);

        round_M_QTextField = new JTextField();
        round_M_QTextField.setText("0");
        round_M_QTextField.setColumns(10);
        round_M_QTextField.setBounds(155, 217, 18, 16);
        meetPanel.add(round_M_QTextField);

        JLabel lblType = new JLabel("Type:");
        lblType.setFont(new Font("Tahoma", Font.BOLD, 13));
        lblType.setBounds(8, 46, 44, 16);
        meetPanel.add(lblType);

        JLabel lblNewLabel = new JLabel("Quantity:");
        lblNewLabel.setFont(new Font("Tahoma", Font.BOLD, 13));
        lblNewLabel.setBounds(155, 46, 61, 16);
        meetPanel.add(lblNewLabel);

        ground_M_WTextField = new JTextField();
        ground_M_WTextField.setText("0.00");
        ground_M_WTextField.setColumns(10);
        ground_M_WTextField.setBounds(291, 73, 36, 16);
        meetPanel.add(ground_M_WTextField);

        chuck_M_WTextField = new JTextField();
        chuck_M_WTextField.setText("0.00");
        chuck_M_WTextField.setColumns(10);
        chuck_M_WTextField.setBounds(291, 105, 36, 16);
        meetPanel.add(chuck_M_WTextField);

        rib_M_WTextField = new JTextField();
        rib_M_WTextField.setText("0.00");
        rib_M_WTextField.setColumns(10);
        rib_M_WTextField.setBounds(291, 130, 36, 16);
        meetPanel.add(rib_M_WTextField);

        steak_M_WTextField = new JTextField();
        steak_M_WTextField.setText("0.00");
        steak_M_WTextField.setColumns(10);
        steak_M_WTextField.setBounds(291, 157, 36, 16);
        meetPanel.add(steak_M_WTextField);

        flank_M_WTextField = new JTextField();
        flank_M_WTextField.setText("0.00");
        flank_M_WTextField.setColumns(10);
        flank_M_WTextField.setBounds(291, 187, 36, 16);
        meetPanel.add(flank_M_WTextField);

        round_M_WTextField = new JTextField();
        round_M_WTextField.setText("0.00");
        round_M_WTextField.setColumns(10);
        round_M_WTextField.setBounds(291, 217, 36, 16);
        meetPanel.add(round_M_WTextField);

        JLabel lblWeightlp = new JLabel("(LP) Weight: ");
        lblWeightlp.setFont(new Font("Tahoma", Font.BOLD, 13));
        lblWeightlp.setBounds(291, 46, 86, 16);
        meetPanel.add(lblWeightlp);

        at_M_QTextField = new JTextField();
        at_M_QTextField.setText("0");
        at_M_QTextField.setColumns(10);
        at_M_QTextField.setBounds(155, 251, 18, 16);
        meetPanel.add(at_M_QTextField);

        at_M_WTextField = new JTextField();
        at_M_WTextField.setText("0.00");
        at_M_WTextField.setColumns(10);
        at_M_WTextField.setBounds(291, 251, 36, 16);
        meetPanel.add(at_M_WTextField);

        at_meat_TextField = new JTextField();
        at_meat_TextField.setText("Another Type..");
        at_meat_TextField.setColumns(10);
        at_meat_TextField.setBounds(8, 250, 98, 24);
        meetPanel.add(at_meat_TextField);

        lblPrice = new JLabel("(LP)Price:");
        lblPrice.setFont(new Font("Tahoma", Font.BOLD, 13));
        lblPrice.setBounds(446, 46, 73, 16);
        meetPanel.add(lblPrice);

        ground_M_PTextField = new JTextField();
        ground_M_PTextField.setText("0.00");
        ground_M_PTextField.setColumns(10);
        ground_M_PTextField.setBounds(445, 71, 36, 16);
        meetPanel.add(ground_M_PTextField);

        rib_M_PTextField = new JTextField();
        rib_M_PTextField.setText("0.00");
        rib_M_PTextField.setColumns(10);
        rib_M_PTextField.setBounds(445, 103, 36, 16);
        meetPanel.add(rib_M_PTextField);

        chuck_M_PTextField = new JTextField();
        chuck_M_PTextField.setText("0.00");
        chuck_M_PTextField.setColumns(10);
        chuck_M_PTextField.setBounds(445, 128, 36, 16);
        meetPanel.add(chuck_M_PTextField);

        steak_M_PTextField = new JTextField();
        steak_M_PTextField.setText("0.00");
        steak_M_PTextField.setColumns(10);
        steak_M_PTextField.setBounds(445, 155, 36, 16);
        meetPanel.add(steak_M_PTextField);

        flank_M_PTextField = new JTextField();
        flank_M_PTextField.setText("0.00");
        flank_M_PTextField.setColumns(10);
        flank_M_PTextField.setBounds(445, 185, 36, 16);
        meetPanel.add(flank_M_PTextField);

        round_M_PTextField = new JTextField();
        round_M_PTextField.setText("0.00");
        round_M_PTextField.setColumns(10);
        round_M_PTextField.setBounds(445, 215, 36, 16);
        meetPanel.add(round_M_PTextField);

        at_M_PTextField = new JTextField();
        at_M_PTextField.setText("0.00");
        at_M_PTextField.setColumns(10);
        at_M_PTextField.setBounds(445, 249, 36, 16);
        meetPanel.add(at_M_PTextField);

        JPanel chikenPanel = new JPanel();
        chikenPanel.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, null, Color.BLUE, null, null));
        mainPane.add(chikenPanel);
        chikenPanel.setLayout(null);

        JLabel lblChiken = new JLabel("*Chiken*");
        lblChiken.setBounds(543, 104, 120, 77);
        lblChiken.setFont(new Font("Times New Roman", Font.PLAIN, 25));
        chikenPanel.add(lblChiken);

        JCheckBox whole_C_CheckBox = new JCheckBox("Whole");
        whole_C_CheckBox.setVerticalAlignment(SwingConstants.BOTTOM);
        whole_C_CheckBox.setHorizontalAlignment(SwingConstants.LEFT);
        whole_C_CheckBox.setBounds(12, 66, 113, 25);
        chikenPanel.add(whole_C_CheckBox);

        JCheckBox half_C_CheckBox = new JCheckBox("Half");
        half_C_CheckBox.setBounds(12, 96, 113, 25);
        chikenPanel.add(half_C_CheckBox);

        JCheckBox breast_C_CheckBox = new JCheckBox("Breast");
        breast_C_CheckBox.setBounds(12, 126, 113, 25);
        chikenPanel.add(breast_C_CheckBox);

        JCheckBox wings_C_CheckBox = new JCheckBox("Wings");
        wings_C_CheckBox.setBounds(12, 156, 120, 25);
        chikenPanel.add(wings_C_CheckBox);

        JCheckBox liver_C_CheckBox = new JCheckBox("Liver");
        liver_C_CheckBox.setBounds(12, 186, 113, 25);
        chikenPanel.add(liver_C_CheckBox);

        JCheckBox heart_C_CheckBox = new JCheckBox("Heart");
        heart_C_CheckBox.setBounds(12, 216, 113, 25);
        chikenPanel.add(heart_C_CheckBox);

        textField_13 = new JTextField();
        textField_13.setText("0");
        textField_13.setColumns(10);
        textField_13.setBounds(170, 71, 25, 16);
        chikenPanel.add(textField_13);

        textField_14 = new JTextField();
        textField_14.setText("0");
        textField_14.setColumns(10);
        textField_14.setBounds(170, 97, 25, 16);
        chikenPanel.add(textField_14);

        textField_15 = new JTextField();
        textField_15.setText("0");
        textField_15.setColumns(10);
        textField_15.setBounds(170, 130, 25, 16);
        chikenPanel.add(textField_15);

        textField_16 = new JTextField();
        textField_16.setText("0");
        textField_16.setColumns(10);
        textField_16.setBounds(170, 160, 25, 16);
        chikenPanel.add(textField_16);

        textField_17 = new JTextField();
        textField_17.setText("0");
        textField_17.setColumns(10);
        textField_17.setBounds(170, 190, 25, 16);
        chikenPanel.add(textField_17);

        textField_18 = new JTextField();
        textField_18.setText("0");
        textField_18.setColumns(10);
        textField_18.setBounds(170, 220, 25, 16);
        chikenPanel.add(textField_18);

        textField_19 = new JTextField();
        textField_19.setText("0.00");
        textField_19.setColumns(10);
        textField_19.setBounds(320, 220, 38, 16);
        chikenPanel.add(textField_19);

        textField_20 = new JTextField();
        textField_20.setText("0.00");
        textField_20.setColumns(10);
        textField_20.setBounds(320, 190, 38, 16);
        chikenPanel.add(textField_20);

        textField_21 = new JTextField();
        textField_21.setText("0.00");
        textField_21.setColumns(10);
        textField_21.setBounds(320, 157, 38, 16);
        chikenPanel.add(textField_21);

        textField_22 = new JTextField();
        textField_22.setText("0.00");
        textField_22.setColumns(10);
        textField_22.setBounds(320, 130, 38, 16);
        chikenPanel.add(textField_22);

        textField_23 = new JTextField();
        textField_23.setText("0.00");
        textField_23.setColumns(10);
        textField_23.setBounds(320, 100, 38, 16);
        chikenPanel.add(textField_23);

        textField_24 = new JTextField();
        textField_24.setText("0.00");
        textField_24.setColumns(10);
        textField_24.setBounds(320, 71, 38, 16);
        chikenPanel.add(textField_24);

        JLabel label = new JLabel("Type:");
        label.setFont(new Font("Tahoma", Font.BOLD, 13));
        label.setBounds(12, 41, 56, 16);
        chikenPanel.add(label);

        JLabel label_1 = new JLabel("Quantity:");
        label_1.setFont(new Font("Tahoma", Font.BOLD, 13));
        label_1.setBounds(170, 41, 75, 16);
        chikenPanel.add(label_1);

        JLabel label_2 = new JLabel("(LP) Weight: ");
        label_2.setFont(new Font("Tahoma", Font.BOLD, 13));
        label_2.setBounds(320, 41, 92, 16);
        chikenPanel.add(label_2);

        textField_12 = new JTextField();
        textField_12.setText("Another Type..");
        textField_12.setColumns(10);
        textField_12.setBounds(12, 250, 99, 24);
        chikenPanel.add(textField_12);

        textField_34 = new JTextField();
        textField_34.setText("0");
        textField_34.setColumns(10);
        textField_34.setBounds(170, 251, 25, 16);
        chikenPanel.add(textField_34);

        textField_35 = new JTextField();
        textField_35.setText("0.00");
        textField_35.setColumns(10);
        textField_35.setBounds(320, 251, 38, 16);
        chikenPanel.add(textField_35);

        label_5 = new JLabel("Price:");
        label_5.setFont(new Font("Tahoma", Font.BOLD, 13));
        label_5.setBounds(477, 41, 43, 16);
        chikenPanel.add(label_5);

        textField_7 = new JTextField();
        textField_7.setText("0.00");
        textField_7.setColumns(10);
        textField_7.setBounds(477, 71, 36, 16);
        chikenPanel.add(textField_7);

        textField_8 = new JTextField();
        textField_8.setText("0.00");
        textField_8.setColumns(10);
        textField_8.setBounds(477, 100, 36, 16);
        chikenPanel.add(textField_8);

        textField_9 = new JTextField();
        textField_9.setText("0.00");
        textField_9.setColumns(10);
        textField_9.setBounds(476, 130, 36, 16);
        chikenPanel.add(textField_9);

        textField_10 = new JTextField();
        textField_10.setText("0.00");
        textField_10.setColumns(10);
        textField_10.setBounds(476, 160, 36, 16);
        chikenPanel.add(textField_10);

        textField_11 = new JTextField();
        textField_11.setText("0.00");
        textField_11.setColumns(10);
        textField_11.setBounds(477, 190, 36, 16);
        chikenPanel.add(textField_11);

        textField_25 = new JTextField();
        textField_25.setText("0.00");
        textField_25.setColumns(10);
        textField_25.setBounds(477, 220, 36, 16);
        chikenPanel.add(textField_25);

        textField_32 = new JTextField();
        textField_32.setText("0.00");
        textField_32.setColumns(10);
        textField_32.setBounds(477, 254, 36, 16);
        chikenPanel.add(textField_32);

        JPanel otherThingsPanel = new JPanel();
        otherThingsPanel.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, null, null, null, null));
        mainPane.add(otherThingsPanel);
        otherThingsPanel.setLayout(null);

        JLabel lblOtherThings = new JLabel("*Other Things*");
        lblOtherThings.setBounds(421, 117, 176, 42);
        lblOtherThings.setFont(new Font("Tahoma", Font.PLAIN, 25));
        otherThingsPanel.add(lblOtherThings);

        JLabel label_3 = new JLabel("Type:");
        label_3.setFont(new Font("Tahoma", Font.BOLD, 13));
        label_3.setBounds(16, 46, 65, 16);
        otherThingsPanel.add(label_3);

        JCheckBox chckbxCheese = new JCheckBox("Cheese");
        chckbxCheese.setVerticalAlignment(SwingConstants.BOTTOM);
        chckbxCheese.setHorizontalAlignment(SwingConstants.LEFT);
        chckbxCheese.setBounds(12, 71, 113, 25);
        otherThingsPanel.add(chckbxCheese);

        JCheckBox chckbxBread = new JCheckBox("Bread");
        chckbxBread.setBounds(12, 101, 113, 25);
        otherThingsPanel.add(chckbxBread);

        JCheckBox chckbxRice = new JCheckBox("Rice");
        chckbxRice.setBounds(12, 131, 113, 25);
        otherThingsPanel.add(chckbxRice);

        JCheckBox chckbxBeefBurger = new JCheckBox("Burger ");
        chckbxBeefBurger.setBounds(12, 161, 120, 25);
        otherThingsPanel.add(chckbxBeefBurger);

        JCheckBox chckbxChickenBurger = new JCheckBox("Kebab");
        chckbxChickenBurger.setBounds(12, 191, 113, 25);
        otherThingsPanel.add(chckbxChickenBurger);

        JCheckBox chckbxFalafel = new JCheckBox("Falafel");
        chckbxFalafel.setBounds(12, 221, 113, 25);
        otherThingsPanel.add(chckbxFalafel);

        textField_26 = new JTextField();
        textField_26.setText("0");
        textField_26.setColumns(10);
        textField_26.setBounds(165, 225, 25, 16);
        otherThingsPanel.add(textField_26);

        textField_27 = new JTextField();
        textField_27.setText("0");
        textField_27.setColumns(10);
        textField_27.setBounds(165, 195, 25, 16);
        otherThingsPanel.add(textField_27);

        textField_28 = new JTextField();
        textField_28.setText("0");
        textField_28.setColumns(10);
        textField_28.setBounds(165, 162, 25, 16);
        otherThingsPanel.add(textField_28);

        textField_29 = new JTextField();
        textField_29.setText("0");
        textField_29.setColumns(10);
        textField_29.setBounds(165, 132, 25, 16);
        otherThingsPanel.add(textField_29);

        textField_30 = new JTextField();
        textField_30.setText("0");
        textField_30.setColumns(10);
        textField_30.setBounds(165, 102, 25, 16);
        otherThingsPanel.add(textField_30);

        textField_31 = new JTextField();
        textField_31.setText("0");
        textField_31.setColumns(10);
        textField_31.setBounds(165, 76, 25, 16);
        otherThingsPanel.add(textField_31);

        JLabel label_4 = new JLabel("Quantity:");
        label_4.setFont(new Font("Tahoma", Font.BOLD, 13));
        label_4.setBounds(165, 46, 65, 16);
        otherThingsPanel.add(label_4);

        otherThings_AnotherTypeTextField = new JTextField();
        otherThings_AnotherTypeTextField.setText("Another Type..");
        otherThings_AnotherTypeTextField.setColumns(10);
        otherThings_AnotherTypeTextField.setBounds(16, 250, 93, 24);
        otherThingsPanel.add(otherThings_AnotherTypeTextField);

        textField_36 = new JTextField();
        textField_36.setText("0");
        textField_36.setColumns(10);
        textField_36.setBounds(165, 254, 25, 16);
        otherThingsPanel.add(textField_36);

        label_6 = new JLabel("Price:");
        label_6.setFont(new Font("Tahoma", Font.BOLD, 13));
        label_6.setBounds(310, 46, 56, 16);
        otherThingsPanel.add(label_6);

        textField_33 = new JTextField();
        textField_33.setText("0.00");
        textField_33.setColumns(10);
        textField_33.setBounds(309, 71, 36, 16);
        otherThingsPanel.add(textField_33);

        textField_37 = new JTextField();
        textField_37.setText("0.00");
        textField_37.setColumns(10);
        textField_37.setBounds(309, 103, 36, 16);
        otherThingsPanel.add(textField_37);

        textField

Hov*_*els 5

你说:

我的问题是我已经达到了 1000 行,这很有压力,因为我所有的代码都在一个文件中。我不喜欢这个。

您不喜欢这样并尝试改进此设置是完全正确的,因为这种类型的程序将是一个需要维护、调试和增强的怪物。

然后你声明:

从 JFrame 类继承到另一个类并使用变量

这不是继承的目的,因为子类的对象将是与父类的对象完全不同的实体,因此您不会想要这样做。

反而

  • 记住要努力通过组合而不是继承来增强,这意味着类包含其他类的字段。
  • 避免使用 static 修饰符来创建类似全局的变量,因为这会束缚你的代码。
  • 尝试从视觉、GUI 部分中分离出程序的逻辑部分,
  • 并将每个特定的逻辑部分和每个主要的 GUI 部分分成自己的类。
  • 确保所有类都有合适的 setter 和 getter 方法,
  • 并且这些类的编写使它们能够很好地相互交流。
  • Swing 的特定建议是避免扩展 JFrame。
  • 相反,将您的 Swing GUI 用于创建 JPanel,面板可以放置在您想要的任何位置,包括在 JFrames、JApplet、JDialogs、JOptionPanes 中,在其他 JPanel 内部,在 JTabbedPanes 中,作为 CardLayout 中的“卡片”-使用 JPanel,.. ..
  • 这将大大提高程序的灵活性和增强能力。

如需更具体的帮助,请随时提供有关您的程序及其代码的更多详细信息。


编辑

恕我直言,但您是来咨询您的代码的,我必须通知您,它存在一些重大问题,包括:

  • 它包含更多的不必要的冗余,这使得它难以跟踪和调试。
  • 您有 JTextField 网格,所有这些网格都可以而且应该由三个 JTable 替换,一个用于肉类,一个用于鸡肉,另一个用于“其他事物”。
  • 您使用空布局和绝对定位,这对新手来说似乎是创建复杂 GUI 的一种更简单的方法,但从长远来看,这是创建、维护和升级这些的最困难的方法。学习和使用布局管理器会更好,包括将 JPanel 嵌套到每个都有自己的布局。
  • 任何时候我看到变量名为 something12、something13、something14、something15、something16、something17、something18,......上面),一个 JTable,其模型基于集合。
  • 您的每个表条目都应该在自己的类中。
  • 我坚持我最初的建议,即您不应让任何类继承自主 GUI,因为这会导致代码无法运行。
  • 此外,您的 JFrame 不应启动另一个 JFrame,而 getProfitButton 应启动模态 JDialog。

编辑
例如:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;

public class TableEg extends JPanel {
   private static final String[] ROW_TITLES = { "Sunday", "Monday", "Tuesday",
         "Wednesday", "Thursday", "Friday", "Saturday" };
   MyTableModel tableModel = new MyTableModel(ROW_TITLES);
   private JTable table;

   public TableEg() {
      table = new JTable(tableModel) {
         @Override
         public TableCellRenderer getCellRenderer(int row, int column) {
            JComponent renderer = (JComponent) super.getCellRenderer(row,
                  column);
            boolean enabled = (Boolean) table.getValueAt(row, 0);
            renderer.setEnabled(enabled);
            return super.getCellRenderer(row, column);
         }
      };
      table.addMouseListener(new MouseAdapter() {
         @Override
         public void mouseReleased(MouseEvent e) {
            super.mouseReleased(e);
            SwingUtilities.invokeLater(new Runnable() {
               public void run() {
                  table.repaint();
               }
            });
         }
      });

      JScrollPane scrollpane = new JScrollPane(table);
      scrollpane.getViewport().setPreferredSize(table.getPreferredSize());

      JButton getSumButton = new JButton(new GetSumAction("Get Sum", tableModel));
      JPanel southPanel = new JPanel();
      southPanel.add(getSumButton);

      setLayout(new BorderLayout());
      add(scrollpane, BorderLayout.CENTER);
      add(southPanel, BorderLayout.SOUTH);
   }

   private static void createAndShowGui() {
      TableEg mainPanel = new TableEg();

      JFrame frame = new JFrame("TableEg");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

class MyTableModel extends DefaultTableModel {
   private static final String[] COLUMN_NAMES = { "Selected", "Name", "Number" };

   public MyTableModel(String[] rowTitles) {
      super(COLUMN_NAMES, 0);
      for (int i = 0; i < rowTitles.length; i++) {
         Object[] rowData = { Boolean.FALSE, rowTitles[i], Integer.valueOf(0) };
         addRow(rowData);
      }
      Object[] rowData = { Boolean.FALSE, "", Integer.valueOf(0) };
      addRow(rowData);
   }

   @Override
   public boolean isCellEditable(int row, int column) {
      if (column == 0) {
         return true;
      }

      if (column == 1) {
         return row >= getRowCount() - 1;
      }

      if (column > 1) {
         return ((Boolean) getValueAt(row, 0)).booleanValue();
      }
      return super.isCellEditable(row, column);
   }

   @Override
   public Class<?> getColumnClass(int columnIndex) {
      switch (columnIndex) {
      case 0:
         return Boolean.class;
      case 1:
         return String.class;
      case 2:
         return Integer.class;
      }
      return super.getColumnClass(columnIndex);
   }
}

class GetSumAction extends AbstractAction {

   private MyTableModel tableModel;

   public GetSumAction(String name, MyTableModel tableModel) {
      super(name);
      this.tableModel = tableModel;
   }

   @Override
   public void actionPerformed(ActionEvent evt) {
      int sum = 0;
      for (int i = 0; i < tableModel.getRowCount(); i++) {
         Object value = tableModel.getValueAt(i, 2);
         if (value != null) {
            sum += ((Integer) value).intValue();
         }
      }
      String text = "Number of days: " + sum;
      String title = "Number of Days";
      JOptionPane.showMessageDialog((JButton) evt.getSource(), text, title,
            JOptionPane.INFORMATION_MESSAGE);
   }
}
Run Code Online (Sandbox Code Playgroud)