【问题标题】:How to disable or able buttons depends on the number of components in Jlist如何禁用或启用按钮取决于 Jlist 中的组件数量
【发布时间】:2015-11-12 13:39:59
【问题描述】:

每个人。我正在实现拖放 GUI。 我现在想要做的是禁用或启用我的 GUI 上的按钮取决于 Jlist 的组件数量。

这是我的代码

import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.File;
import java.io.IOException;
import java.util.List;

import javax.swing.*;
import javax.swing.GroupLayout.Alignment;
import javax.swing.LayoutStyle.ComponentPlacement;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

@SuppressWarnings("serial")
public class FileDragDemo extends JPanel {
    private JList list = new JList();

public FileDragDemo() {
  list.setDragEnabled(true);
  list.setTransferHandler(new FileListTransferHandler(list));


  JScrollPane scrollPane = new JScrollPane(list);





  JButton btnCompare = new JButton("Compare");
  btnCompare.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent arg0) {

      }
  });

  JButton btnAnalyze = new JButton("Analyze");
  btnAnalyze.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {


      }
  });

  JButton btnRefresh = new JButton("Refresh");
  btnRefresh.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
          DefaultListModel listModel = (DefaultListModel) list.getModel();
          listModel.removeAllElements();

      }
  });



  if (list.getModel().getSize() > 1){
      btnAnalyze.setEnabled( false );
  }

//      if (listModel.getSize() > 1){
//          btnAnalyze.setEnabled( false );
//      }

  GroupLayout groupLayout = new GroupLayout(this);
  groupLayout.setHorizontalGroup(
      groupLayout.createParallelGroup(Alignment.LEADING)
          .addGroup(groupLayout.createSequentialGroup()
              .addComponent(scrollPane, GroupLayout.PREFERRED_SIZE, 316, GroupLayout.PREFERRED_SIZE)
              .addPreferredGap(ComponentPlacement.RELATED)
              .addGroup(groupLayout.createParallelGroup(Alignment.LEADING, false)
                  .addComponent(btnRefresh, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                  .addComponent(btnAnalyze, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                  .addComponent(btnCompare, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
              .addContainerGap())
  );
  groupLayout.setVerticalGroup(
      groupLayout.createParallelGroup(Alignment.LEADING)
          .addComponent(scrollPane, GroupLayout.PREFERRED_SIZE, 144, GroupLayout.PREFERRED_SIZE)
          .addGroup(groupLayout.createSequentialGroup()
              .addContainerGap()
              .addComponent(btnCompare)
              .addPreferredGap(ComponentPlacement.RELATED)
              .addComponent(btnAnalyze)
              .addPreferredGap(ComponentPlacement.RELATED)
              .addComponent(btnRefresh))
  );
  setLayout(groupLayout);
 }



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

  JFrame frame = new JFrame("FileDragDemo");
  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();
     }
  });
 }
}

@SuppressWarnings("serial")
class FileListTransferHandler extends TransferHandler {
private JList list;


public FileListTransferHandler(JList list) {
   this.list = list;
}

public int getSourceActions(JComponent c) {
   return COPY_OR_MOVE;
}

public boolean canImport(TransferSupport ts) {
   return ts.isDataFlavorSupported(DataFlavor.javaFileListFlavor);
}

 public boolean importData(TransferSupport ts) {
   try {
      @SuppressWarnings("rawtypes")
      List data = (List) ts.getTransferable().getTransferData(
            DataFlavor.javaFileListFlavor);
      if (data.size() < 1) {
         return false;
      }

      DefaultListModel listModel = new DefaultListModel();
      for (Object item : data) {
         File file = (File) item;
         listModel.addElement(file);

      }

      list.setModel(listModel);
      return true;

   } catch (UnsupportedFlavorException e) {
      return false;
   } catch (IOException e) {
      return false;
   }
}
}

当Jlist中的拖放元素大于1时,我想禁用btnAnalyze。 此外,当 Jlist 中的拖放元素为 1 时,我想禁用 btnCompare。

请帮帮我。谢谢

【问题讨论】:

  • 您能否澄清一下,当只有一个条目并且与比较相同时,您想禁用 btnAnalyze 吗?这很容易做到,只需要更多细节。
  • 很抱歉。我想在有 2 个条目启用 btnCompare 时禁用 btnAnalyze,并且我想在有一个条目启用 btnAnalyze 时禁用 btnCompare

标签: java drag-and-drop jbutton jlist


【解决方案1】:

好吧,所以我真正做的唯一更改是将您的 FileListTransfer 处理程序移动到实际类中,以便它实际上只是一个子类,然后全局声明按钮。试一试。基本上,我们正在使用 Rakesh 所说的内容并检查大小并在运行时启用与禁用。

将 Transfer 类移动到与 rest 相同的类中

全局声明按钮

package assistance;

import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.File;
import java.io.IOException;
import java.util.List;

import javax.swing.*;
import javax.swing.GroupLayout.Alignment;
import javax.swing.LayoutStyle.ComponentPlacement;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

@SuppressWarnings("serial")
public class FileDragDemo extends JPanel {

private JList list = new JList();
private JButton btnCompare, btnAnalyze, btnRefresh;

public FileDragDemo() {
    list.setDragEnabled(true);
    list.setTransferHandler(new FileListTransferHandler(list));

    JScrollPane scrollPane = new JScrollPane(list);

    btnCompare = new JButton("Compare");
    btnCompare.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {

        }
    });

    btnAnalyze = new JButton("Analyze");
    btnAnalyze.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {

        }
    });

    btnRefresh = new JButton("Refresh");
    btnRefresh.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            DefaultListModel listModel = (DefaultListModel) list.getModel();
            listModel.removeAllElements();

        }
    });

//      if (listModel.getSize() > 1){
//          btnAnalyze.setEnabled( false );
//      }
    GroupLayout groupLayout = new GroupLayout(this);
    groupLayout.setHorizontalGroup(
            groupLayout.createParallelGroup(Alignment.LEADING)
            .addGroup(groupLayout.createSequentialGroup()
                    .addComponent(scrollPane, GroupLayout.PREFERRED_SIZE, 316, GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(ComponentPlacement.RELATED)
                    .addGroup(groupLayout.createParallelGroup(Alignment.LEADING, false)
                            .addComponent(btnRefresh, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(btnAnalyze, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(btnCompare, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                    .addContainerGap())
    );
    groupLayout.setVerticalGroup(
            groupLayout.createParallelGroup(Alignment.LEADING)
            .addComponent(scrollPane, GroupLayout.PREFERRED_SIZE, 144, GroupLayout.PREFERRED_SIZE)
            .addGroup(groupLayout.createSequentialGroup()
                    .addContainerGap()
                    .addComponent(btnCompare)
                    .addPreferredGap(ComponentPlacement.RELATED)
                    .addComponent(btnAnalyze)
                    .addPreferredGap(ComponentPlacement.RELATED)
                    .addComponent(btnRefresh))
    );
    setLayout(groupLayout);
}

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

    JFrame frame = new JFrame("FileDragDemo");
    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();
        }
    });
}

@SuppressWarnings("serial")
class FileListTransferHandler extends TransferHandler {

    private JList list;

    public FileListTransferHandler(JList list) {
        this.list = list;
    }

    public int getSourceActions(JComponent c) {
        return COPY_OR_MOVE;
    }

    public boolean canImport(TransferSupport ts) {
        return ts.isDataFlavorSupported(DataFlavor.javaFileListFlavor);
    }

    public boolean importData(TransferSupport ts) {
        try {
            @SuppressWarnings("rawtypes")
            List data = (List) ts.getTransferable().getTransferData(
                    DataFlavor.javaFileListFlavor);
            if (data.size() < 1) {
                return false;
            }

            DefaultListModel listModel = new DefaultListModel();
            for (Object item : data) {
                File file = (File) item;
                listModel.addElement(file);

            }

            list.setModel(listModel);
            if (list.getModel().getSize() > 1) {
                btnCompare.setEnabled(true);
                btnAnalyze.setEnabled(false);
            } else if (list.getModel().getSize() == 1) {
                btnCompare.setEnabled(false);
                btnAnalyze.setEnabled(true);
            }
            return true;

        } catch (UnsupportedFlavorException e) {
            return false;
        } catch (IOException e) {
            return false;
        }
    }
  }
}

【讨论】:

  • 我是否也必须在 FileListRansferHandler 类中声明这 3 个按钮?我也尝试过在子类 FileListRansferHandler 中声明 3buttons 的方式,但它没有用
  • 不。将 FileListTransferHandler 作为子类移入 FileDragDemo 后,只需将它们声明在我拥有它们的位置,您应该可以访问这些按钮。
  • 那么 3 个按钮未在子类 FileListTransferHandler 中声明,因此无法解析。方法 importData 不在 FileDragDemo 类中。它属于 FileListTransferHandler。
  • 正如您在我的编辑(添加的图像)中看到的那样,代码可以正常工作。请确保您在其他任何地方都没有问题。
  • @user5497424 如果这有帮助,请接受作为答案:)
【解决方案2】:
myJList.getModel().getSize();

会给你JList中的组件数量。

button.setEnabled(false); 将禁用您的Button

【讨论】:

  • 谢谢,但我知道这两行但我不知道在哪里添加。我在 FileDragDemo 的构造函数中尝试过,但它不起作用,并且在执行的操作方法中也不起作用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-25
  • 1970-01-01
  • 1970-01-01
  • 2015-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多