我有这种方法可以在名为MaterialProperties的类中打印和设置Solid Object的材料属性,该类具有printMaterial和setMaterial方法。

public void Btn3_callback ( ) throws Exception {
        Model model = session.GetCurrentModel();

        if (model == null) {
            mesg = "No Model Selected!!";
            //TextField.Area("No Model Selected!!");
            System.exit(0);
        }
        else {
            Solid solid= (Solid) model;
            String newMaterial="copper";//user input for new Material name
            printMaterial(solid);//printMaterial print the Material properties of the Solid object
            setMaterial(solid,newMaterial);//setMaterial sets the Material properties of the Solid object to the material entered
        }
    }


我需要获取newMaterial的用户输入,而不是对其进行硬编码。我需要做的是显示所有可用的物料类型,以便用户可以选择所需的物料。因此,我尝试使用JFrame进行此操作。这是我的代码:

public class MaterialWindow {

    JFrame frame = new JFrame("Material Selection");
     public MaterialWindow(){
             // Directory path here
      String path = "W:\\materials";

      JFrame frame = new JFrame("Material Selection");
      JPanel panel = new JPanel(new GridLayout(0, 4));
      ButtonGroup bg = new ButtonGroup();

      String files;
      File folder = new File(path);
      File[] listOfFiles = folder.listFiles();
      JRadioButton  button;

      for (int i = 0; i < listOfFiles.length; i++)
      {

       if (listOfFiles[i].isFile())
       {
       files = listOfFiles[i].getName();
           if (files.endsWith(".mtl") || files.endsWith(".MTL"))
           {

              button = new JRadioButton(files);
              panel.add(first,BorderLayout.CENTER);
              panel.revalidate();

              bg.add(button);

              first.addActionListener(new MyAction());


            }
         }
      }

 frame.add(panel, BorderLayout.NORTH);
 frame.getContentPane().add(new JScrollPane(panel), BorderLayout.CENTER);
 frame.setSize(1000, 400);
 frame.setVisible(true);
 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 }



public class MyAction implements ActionListener{

    public void actionPerformed(ActionEvent e){

        String newMaterial =e.getActionCommand();
        String[] split = newMaterial.split("\\.");
        newMaterial = split[0];
        newMaterial.trim();
              //set the newMaterial for btn3_callback OR call the setMaterial method of MaterialPropeties class
        frame.dispose();
    }

}


}


现在的问题是,如何在Btn3_callback()函数中使用从单选按钮选择的newMaterial字符串作为newMaterial?当我在MyAction类中为newMaterial创建getString()方法并使用它Btn3_callback时,它总是返回null;

有什么办法可以做到吗?还是我可以实施该想法的任何其他方式?
谢谢

最佳答案

使用JOptionPane代替框架。在选项窗格中放置选项列表(JList ..或JComboBox),并在返回组件(窗格关闭)后查询该组件的选定对象。

例如。使用JComboBox

应该在EDT上创建和更改GUI(不包括电池)。

import java.io.File;
import javax.swing.*;

public class QuickTest {

    public static void main(String[] args) throws Exception {
        File[] files = new File(System.getProperty("user.home")).listFiles();
        JFrame f = new JFrame("Faux J-Link");
        f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        JEditorPane jep = new JEditorPane();
        f.add(new JScrollPane(jep));
        f.setSize(600,400);
        f.setLocationByPlatform(true);
        f.setVisible(true);

        JComboBox choices = new JComboBox(files);
        int result = JOptionPane.showConfirmDialog(f, choices);
        if (result==JOptionPane.OK_OPTION) {
            System.out.println("OK");
            File file = files[choices.getSelectedIndex()];
            jep.setPage(file.toURI().toURL());
        }
    }
}

10-04 18:48