【问题标题】:Java checkbox state in another class [closed]另一个类中的Java复选框状态[关闭]
【发布时间】:2017-09-13 21:28:00
【问题描述】:

如何将实际的复选框状态(真/假)从 GUI 类传递到另一个类? I want to run some part of code only if checkbox in GUI is selected.我想它必须是 if 语句(下面的高亮部分),但我无法让它工作。

public class csvtoxls {

    public static void main() throws IOException {
    //here you enter the path to your directory.
    //for example: Path workDir = Paths.get("C:\\Users\\Kamil\Desktop\\csvtoxlspython\\Nowy folder (2)")
    JFileChooser jfc = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory());
    jfc.setDialogTitle("Wybierz folder do konwersji: ");
    jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
    jfc.setAcceptAllFileFilterUsed(false);
    int returnValue = jfc.showSaveDialog(null);
    if (returnValue == JFileChooser.APPROVE_OPTION) {
        if (jfc.getSelectedFile().isDirectory()) {
            System.out.println("You selected the directory: " + jfc.getSelectedFile());

            String z;
            //@SuppressWarnings("deprecation")
            Path workDir = jfc.getSelectedFile().toPath();
            System.out.println(workDir);
            //Path workDir = FileSystems.getDefault(jfc.getCurrentDirectory()).jfc.getCurrentDirectory();

            //Path workDir = Paths.get(gui.pickPath(jfc));

            File dirg = jfc.getSelectedFile();
            //String str = dirg.getPath();

            //  *************   CODE WITH ISSUE *************
            if TextAreaLogProgram.checkbox.isSelected() {
                try {
                    Thread.sleep(5000);                 //1000 milliseconds is one second.
                } catch(InterruptedException ex) {
                    Thread.currentThread().interrupt();
                }
                String str = dirg.getPath();
                delfiles td = new delfiles();

                td.deleteFiles(str + "/", ".csv");
                System.out.println("SUCCESS!");
                msgbox.infoBox("SUCCES!", "CSVtoXLS");
            }

GUI类:

public class TextAreaLogProgram extends JFrame {
    private JTextArea textArea;
    private JButton buttonStart = new JButton("CONVERT");
    private JButton buttonClear = new JButton("CLEAR");
    private PrintStream standardOut;

    public TextAreaLogProgram() {
        super("CSVtoXLS");
        JCheckBox checkbox = new JCheckBox();
        add(checkbox);
        checkbox.setText("Delete files");
        checkbox.setSelected(true);

【问题讨论】:

  • 请改进您的问题,使其更容易回答而无需猜测。您没有显示在何处或如何运行 TextAreaLogProgram 类,没有显示在何处创建 TextAreaLogProgram 对象,并且您发布的代码格式不好,使得代码难以阅读和遵循。你真的想让人们更容易地提供帮助,所以做这些事情符合你的最大利益。此外,请浏览help center 的“如何提问”部分,了解有关如何改进问题的更多信息。
  • 但是话虽如此,问题归结为检查一个对象的状态另一个对象,而关键是references,得到一个对象在另一个对象中的引用。此外,JCheckBox 不应是局部变量,而应是 TextAreaLogProgram 类的实例字段。
  • 我已经编辑并格式化了您发布的代码。

标签: java swing class jcheckbox


【解决方案1】:

您的其他类将需要一个带有参数的方法或构造函数才能接受来自其他类的值

详情请见Passing Information to a Method or a Constructor

其他问题:

  • 您的程序结构需要完全重做。现在您的主要方法太大了,这意味着您在静态世界中做了太多事情,而没有使用 Java 来发挥其最佳 OOP 优势。
  • 在考虑创建 GUI 之前,首先创建程序需要的非 GUI“模型”类。与您的所有类一样,这些类应具有最少的静态字段和方法,并努力遵循面向对象的最佳实践
  • 您的 GUI 代码中有一个Thread.sleep,这与 Swing GUI 不能很好地配合使用,因为这有可能使整个 GUI 进入睡眠状态,使其无响应。如果您想要 Swing 延迟,请使用 Swing 计时器(谷歌关于此的优秀教程)
  • 您正在尝试检查复选框,就好像它是 TextAreaLogProgram 类的静态字段一样。它不是静态字段,实际上它甚至不是类的字段。
  • 您正在执行上述操作这一事实表明,您将从学习面向对象编程和 Java 的介绍性教程中受益匪浅——您在第一次了解 Java 基础知识之前尝试创建一个 GUI,这就是本末倒置.同样,您不会后悔为此付出的努力。
  • 无论您做什么,不要将 JCheckBox 设为静态字段并尝试以这种方式访问​​它。这将导致意大利面条式代码和增加错误的风险。
  • 改为将其设为 TextAreaLogProgram 类的非静态(实例)私有字段,并为该类提供一个 getter 方法以允许其他对象访问 JCheckgbox 的状态。
  • 关于您的代码和问题,还有很多可以提及的内容......但现在就可以了。

【讨论】:

  • 他可能需要更多,因为 JCheckBox 看起来是一个范围有限的本地字段,而不是实例字段。
  • 随意扩展 - 我只是想让 OP 研究他们自己的问题并做出某种实际尝试来回答它。根据提供的代码,他们还必须进行一些重要的重构才能使其正常工作
  • 已经做了一些扩展。随意编辑/扩展/改进/删除
  • 总是乐于扩展 ;)
  • 感谢所有回复。事实上,它的问题比我想象的要复杂得多。
猜你喜欢
  • 1970-01-01
  • 2021-02-26
  • 1970-01-01
  • 2014-02-15
  • 1970-01-01
  • 1970-01-01
  • 2013-09-30
  • 2016-09-03
  • 1970-01-01
相关资源
最近更新 更多