【问题标题】:Java Swing Layout Problems & Code OptimisationJava Swing 布局问题和代码优化
【发布时间】:2015-12-23 11:27:12
【问题描述】:

为了训练 Java,我编写了自己的程序。 我喜欢玩CSGO,我们永远无法决定玩什么地图。 所以我想写一个程序,你可以在其中选择你想要的地图,然后随机地从选择中给出每张地图,并且只给出一次。

还有更多内容,但相关代码已经在运行。

我已经使用 IntelliJ(我的 IDE)的 Swing Form 构建器尝试过一次, 但由于我并不真正了解它在那里做了什么,所以我想手动重做。所以我重写了程序,但我无法让它看起来正确。

我第一次尝试 IntelliJ Swing Builder:

没有 GUIBuilder 的帮助,它现在看起来像这样:
所以我用谷歌搜索了几个小时以获得正确的布局。目前我正在使用 GridBagLayout (似乎最适合我的需求)。但我无法正确处理。它应该看起来像第一张图片。

所以,问题1:

我在使用 GridBag 时做错了什么,因为有很多未使用的空间和东西

和问题 2:我知道在代码方面有很多需要改进的地方,您有什么建议? 我仍然无法知道何时私有和访问方法和内容, 那么有什么重要的错误吗?

这是我的代码:

它的 3 个类:

第一
第一的 主类(刚开始)

import javax.swing.*;

public class App {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new MainFrame("Map Chooser v0.1");
                frame.setSize(500, 250);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);
            }
        });
    }
}

** Swing 主机:**

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

public class MainFrame extends JFrame {

    ImageIcon dust2;

    public MainFrame(String title) {
        super(title);

        GridLayout gridMain = new GridLayout(10, 10, 5, 5);
        GridLayout gridCB = new GridLayout(3, 5, 5, 5);
        GridLayout gridButton = new GridLayout(1, 1, 10, 10);

        JPanel mainPanel = new JPanel();
        mainPanel.setLayout(gridMain);
        mainPanel.setBackground(Color.DARK_GRAY);

        JPanel checkboxPanel = new JPanel();
        checkboxPanel.setLayout(gridCB);
        checkboxPanel.setBackground(Color.DARK_GRAY);

        JPanel buttonPanel = new JPanel();
        buttonPanel.setLayout(gridButton);
        buttonPanel.setBackground(Color.DARK_GRAY);

        JPanel labelPanel = new JPanel();
        labelPanel.setBackground(Color.DARK_GRAY);

        mainPanel.add(checkboxPanel);
        mainPanel.add(buttonPanel);
        mainPanel.add(labelPanel);

        MapRound map = new MapRound();
        //GridBagConstraints gbc = new GridBagConstraints();
        GridBagConstraints gbc2 = new GridBagConstraints();
        GridBagConstraints gbc3 = new GridBagConstraints();
        gbc2.weighty = 0.5;
        gbc2.weightx = 0.5;

        gbc3.weightx = 1;
        gbc3.weighty = 1;
        gbc3.fill = GridBagConstraints.ABOVE_BASELINE;

        //Checkboxes
        JCheckBox dust2CB = new JCheckBox("Dust II");
        dust2CB.setBackground(Color.DARK_GRAY);
        dust2CB.setForeground(Color.LIGHT_GRAY);
        gbc2.gridx = 0;
        gbc2.gridy = 0;
        checkboxPanel.add(dust2CB, gbc2);
        dust2CB.setSelected(false);

        JCheckBox trainCB = new JCheckBox("Train");
        trainCB.setBackground(Color.DARK_GRAY);
        trainCB.setForeground(Color.LIGHT_GRAY);
        gbc2.gridx = 0;
        gbc2.gridy = 1;
        checkboxPanel.add(trainCB, gbc2);
        trainCB.setSelected(false);

        JCheckBox mirageCB = new JCheckBox("Mirage");
        mirageCB.setBackground(Color.DARK_GRAY);
        mirageCB.setForeground(Color.LIGHT_GRAY);
        gbc2.gridx = 0;
        gbc2.gridy = 2;
        checkboxPanel.add(mirageCB, gbc2);
        mirageCB.setSelected(false);

        JCheckBox infernoCB = new JCheckBox("Inferno");
        infernoCB.setBackground(Color.DARK_GRAY);
        infernoCB.setForeground(Color.LIGHT_GRAY);
        gbc2.gridx = 1;
        gbc2.gridy = 0;
        checkboxPanel.add(infernoCB, gbc2);
        infernoCB.setSelected(false);

        JCheckBox cobblestoneCB = new JCheckBox("Cobblestone");
        cobblestoneCB.setBackground(Color.DARK_GRAY);
        cobblestoneCB.setForeground(Color.LIGHT_GRAY);
        gbc2.gridx = 1;
        gbc2.gridy = 1;
        checkboxPanel.add(cobblestoneCB, gbc2);
        cobblestoneCB.setSelected(false);

        JCheckBox overpassCB = new JCheckBox("Overpass");
        overpassCB.setBackground(Color.DARK_GRAY);
        overpassCB.setForeground(Color.LIGHT_GRAY);
        gbc2.gridx = 1;
        gbc2.gridy = 2;
        checkboxPanel.add(overpassCB, gbc2);
        overpassCB.setSelected(false);

        JCheckBox cacheCB = new JCheckBox("Cache");
        cacheCB.setBackground(Color.DARK_GRAY);
        cacheCB.setForeground(Color.LIGHT_GRAY);
        gbc2.gridx = 2;
        gbc2.gridy = 0;
        checkboxPanel.add(cacheCB, gbc2);
        cacheCB.setSelected(false);

        JCheckBox aztecCB = new JCheckBox("Aztec");
        aztecCB.setBackground(Color.DARK_GRAY);
        aztecCB.setForeground(Color.LIGHT_GRAY);
        gbc2.gridx = 2;
        gbc2.gridy = 1;
        checkboxPanel.add(aztecCB, gbc2);
        aztecCB.setSelected(false);

        JCheckBox dustCB = new JCheckBox("Dust");
        dustCB.setBackground(Color.DARK_GRAY);
        dustCB.setForeground(Color.LIGHT_GRAY);
        gbc2.gridx = 2;
        gbc2.gridy = 2;
        checkboxPanel.add(dustCB, gbc2);
        dustCB.setSelected(false);

        JCheckBox vertigoCB = new JCheckBox("Vertigo");
        vertigoCB.setBackground(Color.DARK_GRAY);
        vertigoCB.setForeground(Color.LIGHT_GRAY);
        gbc2.gridx = 3;
        gbc2.gridy = 0;
        checkboxPanel.add(vertigoCB, gbc2);
        vertigoCB.setSelected(false);

        JCheckBox nukeCB = new JCheckBox("Nuke");
        nukeCB.setBackground(Color.DARK_GRAY);
        nukeCB.setForeground(Color.LIGHT_GRAY);
        gbc2.gridx = 3;
        gbc2.gridy = 1;
        checkboxPanel.add(nukeCB, gbc2);
        nukeCB.setSelected(false);

        JCheckBox officeCB = new JCheckBox("Office");
        officeCB.setBackground(Color.DARK_GRAY);
        officeCB.setForeground(Color.LIGHT_GRAY);
        gbc2.gridx = 3;
        gbc2.gridy = 2;
        checkboxPanel.add(officeCB, gbc2);
        officeCB.setSelected(false);

        JCheckBox italyCB = new JCheckBox("Italy");
        italyCB.setBackground(Color.DARK_GRAY);
        italyCB.setForeground(Color.LIGHT_GRAY);
        gbc2.gridx = 9;
        gbc2.gridy = 0;
        checkboxPanel.add(italyCB, gbc2);
        italyCB.setSelected(false);

        JCheckBox assaultCB = new JCheckBox("Assault");
        assaultCB.setBackground(Color.DARK_GRAY);
        assaultCB.setForeground(Color.LIGHT_GRAY);
        gbc2.gridx = 9;
        gbc2.gridy = 1;
        checkboxPanel.add(assaultCB, gbc2);
        assaultCB.setSelected(false);

        JCheckBox militiaCB = new JCheckBox("Militia");
        militiaCB.setBackground(Color.DARK_GRAY);
        militiaCB.setForeground(Color.LIGHT_GRAY);
        gbc2.gridx = 9;
        gbc2.gridy = 2;
        checkboxPanel.add(militiaCB, gbc2);
        militiaCB.setSelected(false);

        //Buttons
        JButton startButton = new JButton("Start");
        startButton.setBackground(Color.DARK_GRAY);
        startButton.setForeground(Color.LIGHT_GRAY);
        gbc3.gridx = 0;
        gbc3.gridy = 0;
        gbc3.insets = new Insets(10, 10, 10, 10);
        startButton.setPreferredSize(new Dimension(400, 400));
        buttonPanel.add(startButton, gbc3);

        JButton newmapButton = new JButton("New Map");
        newmapButton.setBackground(Color.DARK_GRAY);
        newmapButton.setForeground(Color.LIGHT_GRAY);
        gbc3.gridx = 0;
        gbc3.gridy = 1;
        gbc3.weightx = 1.0;
        gbc3.weighty = 1.0;
        gbc3.insets = new Insets(0, 0, 10, 10);
        buttonPanel.add(newmapButton, gbc3);
        newmapButton.setEnabled(false);

        JButton resetButton = new JButton("Reset");
        resetButton.setBackground(Color.DARK_GRAY);
        resetButton.setForeground(Color.LIGHT_GRAY);
        gbc3.gridx = 0;
        gbc3.gridy = 3;
        gbc3.insets = new Insets(0, 0, 10, 10);
        buttonPanel.add(resetButton, gbc3);
        resetButton.setEnabled(false);

        //Labels
        JLabel result = new JLabel("Press START to begin");
        gbc3.gridx = 0;
        gbc3.gridy = 4;
        gbc3.insets = new Insets(0, 0, 10, 10);
        labelPanel.add(result, gbc3);

        //Verhalten
        dust2CB.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {

                if (dust2CB.isSelected()) {
                    map.mList.add("DustII");
                } else {
                    map.removeMap("DustII");
                }
            }
        });

        trainCB.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                if (trainCB.isSelected()) {
                    map.mList.add("Train");
                } else {
                    map.removeMap("Train");
                }
            }
        });

        mirageCB.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                if (mirageCB.isSelected()) {
                    map.mList.add("Mirage");
                } else {
                    map.removeMap("Mirage");
                }
            }
        });

        infernoCB.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                if (infernoCB.isSelected()) {
                    map.mList.add("Inferno");
                } else {
                    map.removeMap("Inferno");
                }
            }
        });

        cobblestoneCB.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                if (cobblestoneCB.isSelected()) {
                    map.mList.add("Cobblestone");
                } else {
                    map.removeMap("Cobblestone");
                }
            }
        });

        overpassCB.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                if (overpassCB.isSelected()) {
                    map.mList.add("Overpass");
                } else {
                    map.removeMap("Overpass");
                }
            }
        });

        cacheCB.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                if (cacheCB.isSelected()) {
                    map.mList.add("Cache");
                } else {
                    map.removeMap("Cache");
                }
            }
        });

        aztecCB.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                if (aztecCB.isSelected()) {
                    map.mList.add("Aztec");
                } else {
                    map.removeMap("Aztec");
                }
            }
        });

        dustCB.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                if (dustCB.isSelected()) {
                    map.mList.add("Dust");
                } else {
                    map.removeMap("Dust");
                }
            }
        });

        vertigoCB.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                if (vertigoCB.isSelected()) {
                    map.mList.add("Vertigo");
                } else {
                    map.removeMap("Vertigo");
                }
            }
        });

        nukeCB.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                if (nukeCB.isSelected()) {
                    map.mList.add("Nuke");
                } else {
                    map.removeMap("Nuke");
                }
            }
        });

        officeCB.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                if (officeCB.isSelected()) {
                    map.mList.add("Office");
                } else {
                    map.removeMap("Office");
                }
            }
        });

        italyCB.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                if (italyCB.isSelected()) {
                    map.mList.add("Italy");
                } else {
                    map.removeMap("Italy");
                }
            }
        });

        assaultCB.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                if (assaultCB.isSelected()) {
                    map.mList.add("Assault");
                } else {
                    map.removeMap("Assault");
                }
            }
        });

        militiaCB.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                if (militiaCB.isSelected()) {
                    map.mList.add("Militia");
                } else {
                    map.removeMap("Militia");
                }
            }
        });

        startButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e2) {

                if (map.mList.size() == 0) {
                    JOptionPane.showMessageDialog
                            (null, "Please add one or more    maps to the selection pool!");
                } else {

                    map.scambleMap();
                    startButton.setEnabled(false);
                    newmapButton.setEnabled(true);
                    resetButton.setEnabled(true);

                    dust2CB.setEnabled(false);
                    trainCB.setEnabled(false);
                    mirageCB.setEnabled(false);
                    infernoCB.setEnabled(false);
                    cobblestoneCB.setEnabled(false);
                    overpassCB.setEnabled(false);
                    cacheCB.setEnabled(false);
                    aztecCB.setEnabled(false);
                    dustCB.setEnabled(false);
                    vertigoCB.setEnabled(false);
                    nukeCB.setEnabled(false);
                    officeCB.setEnabled(false);
                    italyCB.setEnabled(false);
                    assaultCB.setEnabled(false);
                    militiaCB.setEnabled(false);
                }
            }
        });

        newmapButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e2) {
                boolean preventloop = true;

                try {
                    while (preventloop) {
                        String xyz = map.nextMap();
                        result.setText("<html><font size=10><font color=green>
                                "+ xyz + </font></font></html>");
                        preventloop = false;
                    }
                } catch (Exception e) {
                    JOptionPane.showMessageDialog(null,
                            "You played all maps!\nThe game has been reset");
                    map.resetStatus();
                    result.setText("Press START to begin");
                    newmapButton.setEnabled(false);
                    startButton.setEnabled(true);
                    dust2CB.setEnabled(true);
                    trainCB.setEnabled(true);
                    mirageCB.setEnabled(true);
                    infernoCB.setEnabled(true);
                    cobblestoneCB.setEnabled(true);
                    overpassCB.setEnabled(true);
                    cacheCB.setEnabled(true);
                    aztecCB.setEnabled(true);
                    dustCB.setEnabled(true);
                    vertigoCB.setEnabled(true);
                    nukeCB.setEnabled(true);
                    officeCB.setEnabled(true);
                    italyCB.setEnabled(true);
                    assaultCB.setEnabled(true);
                    militiaCB.setEnabled(true);
                }
            }
        });

        resetButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                map.resetStatus();
                result.setText("Press START to begin");
                newmapButton.setEnabled(false);
                startButton.setEnabled(true);

                dust2CB.setEnabled(true);
                trainCB.setEnabled(true);
                mirageCB.setEnabled(true);
                infernoCB.setEnabled(true);
                cobblestoneCB.setEnabled(true);
                overpassCB.setEnabled(true);
                cacheCB.setEnabled(true);
                aztecCB.setEnabled(true);
                dustCB.setEnabled(true);
                vertigoCB.setEnabled(true);
                nukeCB.setEnabled(true);
                officeCB.setEnabled(true);
                italyCB.setEnabled(true);
                assaultCB.setEnabled(true);
                militiaCB.setEnabled(true);
            }
        });

        this.add(mainPanel);
        this.setVisible(true);
    }
}

最后一个: (包含 Arraylist 的 Map Object 的蓝图

导入 java.util.ArrayList; 导入 java.util.Collections;

公共类 MapRound { ArrayList mList = new ArrayList(); 整数计数器 = 0;

//Constructor
public MapRound() {
}

public String nextMap() {
    String result = mList.get(counter);
    counter = counter + 1;
    return result;
}

public void resetStatus() {
    counter = 0;
    Collections.shuffle(mList);
}

public String removeMap(String index) {
    mList.remove(index);
    return index;
}

public void scambleMap() {
    Collections.shuffle(mList);
}

}

如果您有任何想法或建议,我很乐意听到!

【问题讨论】:

  • 编辑按钮应该在标签下方(java swing 用户界面等),在共享和标志之间。
  • @FabianK 不要添加您的代码作为答案。请编辑您的问题。
  • 我删掉了你所有的介绍和寒暄——在这个网站的问答形式中没有他们的位置。直接解决问题。
  • “所以我用谷歌搜索了几个小时以获得正确的布局”考虑使用 combinations of layout managers 以及 white space 的布局填充和边框。

标签: java swing user-interface layout-manager gridbaglayout


【解决方案1】:

查看您的代码,我看到正在使用 GridLayout 布局管理器(而不是 GridBagLayout)。尽管名称非常相似,但它们的行为却截然不同。这也意味着您在将组件添加到其中一个面板时传递的GridBagConstraints 对象将无法正确理解。 (如果布局管理器在传递无法处理的 constraints 对象时给出错误消息,那就太好了。)

请参阅这个漂亮的Visual Guide to Layout Managers 以了解有关这两个(和其他)布局管理器的更多信息。

我认为BoxLayout 布局管理器和一些面板周围的空白边框对您的程序也很有用。您可以使用标签在 GUI 的顶部和底部显示图像。我认为所有GridBagConstraints相关的代码都可以去掉。示例截图:

您的MainFrame 类可以这样修改:

public class MainFrame extends JFrame {

    //ImageIcon dust2;
    public MainFrame(String title) {
        super(title);

        //GridLayout gridMain = new GridLayout(5, 0, 5, 5);
        GridLayout gridCB = new GridLayout(3, 5, 5, 5);
        //GridLayout gridButton = new GridLayout(4, 1, 10, 10);

        JPanel mainPanel = new JPanel();
        BoxLayout mainLayout = new BoxLayout(mainPanel, BoxLayout.PAGE_AXIS);
        mainPanel.setLayout(mainLayout);
        mainPanel.setBackground(Color.DARK_GRAY);

        JPanel checkboxPanel = new JPanel();
        checkboxPanel.setLayout(gridCB);
        checkboxPanel.setBackground(Color.DARK_GRAY);

        JPanel buttonPanel = new JPanel();
        BoxLayout buttonLayout = new BoxLayout(buttonPanel, BoxLayout.PAGE_AXIS);
        buttonPanel.setLayout(buttonLayout);
        buttonPanel.setBorder(new EmptyBorder(6, 6, 6, 6));
        buttonPanel.setBackground(Color.DARK_GRAY);

        JPanel labelPanel = new JPanel();
        labelPanel.setBackground(Color.DARK_GRAY);

        String directory = "directory/to/images/";

        JPanel topImagePanel = new JPanel();
        topImagePanel.setBackground(Color.DARK_GRAY);
        topImagePanel.setBorder(new EmptyBorder(6, 6, 6, 6));
        String topImagePath = directory + "map selector - top.png";
        topImagePanel.add(new JLabel(new ImageIcon(topImagePath)));

        JPanel bottomImagePanel = new JPanel();
        bottomImagePanel.setBackground(Color.DARK_GRAY);
        bottomImagePanel.setBorder(new EmptyBorder(6, 6, 6, 6));
        String bottomImagePath = directory + "map selector - bottom.png";
        bottomImagePanel.add(new JLabel(new ImageIcon(bottomImagePath)));

        mainPanel.add(topImagePanel);
        mainPanel.add(checkboxPanel);
        mainPanel.add(buttonPanel);
        mainPanel.add(labelPanel);
        mainPanel.add(bottomImagePanel);

        // [...]

        //Buttons
        JButton startButton = new JButton("Start");
        startButton.setBackground(Color.DARK_GRAY);
        startButton.setForeground(Color.LIGHT_GRAY);
        gbc3.gridx = 0;
        gbc3.gridy = 0;
        gbc3.insets = new Insets(10, 10, 10, 10);
        startButton.setPreferredSize(new Dimension(400, 400));
        buttonPanel.add(startButton, gbc3);
        startButton.setAlignmentX(Component.CENTER_ALIGNMENT);

        buttonPanel.add(Box.createRigidArea(new Dimension(0, 6)));

        JButton newmapButton = new JButton("New Map");
        newmapButton.setBackground(Color.DARK_GRAY);
        newmapButton.setForeground(Color.LIGHT_GRAY);
        gbc3.gridx = 0;
        gbc3.gridy = 1;
        gbc3.weightx = 1.0;
        gbc3.weighty = 1.0;
        gbc3.insets = new Insets(0,0,10,10);
        buttonPanel.add(newmapButton, gbc3);
        newmapButton.setAlignmentX(Component.CENTER_ALIGNMENT);
        newmapButton.setEnabled(false);

        buttonPanel.add(Box.createRigidArea(new Dimension(0, 6)));

        JButton resetButton = new JButton("Reset");
        resetButton.setBackground(Color.DARK_GRAY);
        resetButton.setForeground(Color.LIGHT_GRAY);
        gbc3.gridx = 0;
        gbc3.gridy = 3;
        gbc3.insets = new Insets(0,0,10,10);
        buttonPanel.add(resetButton, gbc3);
        resetButton.setAlignmentX(Component.CENTER_ALIGNMENT);
        resetButton.setEnabled(false);

        // [...]
    }
}

编辑:对您的代码的一些一般性建议

  • MainFrame 构造函数非常大。我会将其拆分为更小的方法来创建不同的面板并添加侦听器。
  • 搜索类似的代码片段,看看是否可以制作可重用的方法。例如:有三个代码块将所有复选框设置为禁用或启用。您可以创建一个带有布尔参数的方法,为所有复选框调用 setEnabled
  • 目前创建复选框需要大量代码。如果您有游戏地图列表,则可以循环创建复选框。 (这是在代码中创建 GUI 的一个很好的优势。)如果您使用每个复选框的 name 属性,它们都可以共享相同的 ItemListener。最后,如果您将所有复选框存储在一个列表中,您可以轻松禁用或启用所有复选框。

一些代码来说明这一点:

java.util.List<String> gameMaps = Arrays.asList(
        "Dust II", "Train", "Mirage", "Inferno", "Cobblestone", "Overpass",
        "Cache", "Aztec", "Dust", "Vertigo", "Nuke", "Office", "Italy",
        "Assault", "Militia"
);

ItemListener mapCheckBoxListener = new ItemListener() {
    @Override
    public void itemStateChanged(ItemEvent itemEvent) {
        JCheckBox checkBox = (JCheckBox) itemEvent.getSource();
        if (checkBox.isSelected()) {
            map.mList.add(checkBox.getName());
        } else {
            map.removeMap(checkBox.getName());
        }
    }
};

java.util.List<JCheckBox> mapCheckBoxes = new ArrayList<>();
for (String gameMap : gameMaps) {
    JCheckBox mapCheckBox = new JCheckBox(gameMap);
    mapCheckBox.setName(gameMap);
    mapCheckBox.setBackground(Color.DARK_GRAY);
    mapCheckBox.setForeground(Color.LIGHT_GRAY);
    checkboxPanel.add(mapCheckBox);
    mapCheckBox.setSelected(false);
    mapCheckBox.addItemListener(mapCheckBoxListener);
    mapCheckBoxes.add(mapCheckBox);
}

// [....]

private void setMapsEnabled(java.util.List<JCheckBox> mapCheckBoxes, boolean enabled) {
    for (JCheckBox mapCheckBox : mapCheckBoxes) {
        mapCheckBox.setEnabled(enabled);
    }
}

【讨论】:

  • 非常感谢,这真的很有帮助,我会在所有圣诞前夜的事情结束后进行调查。我会考虑你的 3 条建议,我会回复这个帖子。如果有感谢按钮或其他东西,我肯定会按下它(=我祝你圣诞快乐
猜你喜欢
  • 2016-08-26
  • 1970-01-01
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多