0

私はスイング中のアプリケーションに取り組んでおり、フォームに 2 つの JFileChooser を配置する必要があります。それらを特定の場所に配置できないようです(上下ではなく、隣同士に配置する必要があります)。コード:

public class ServerGUI extends JFrame implements ActionListener {
     private JPanel JPanel1 = null;
     private JButton startStopButton = null;
     private JTextField portSelect = null;
     private JLabel portLabel = null;
     private JFileChooser rootDir = null;
     private JLabel rootLabel = null;
     private JFileChooser maintenanceDir = null;
     private JLabel maintenanceLabel = null;
     private JCheckBox maintenanceMode = null;
     private JLabel serverInfo = null;

     ServerGUI() {
       /// create an instance of our server
       webserver = new WebServer();
       /// build form controls -- with default options
       JPanel1 = new JPanel();
       startStopButton = new JButton("Start Server");
       portSelect = new JTextField("10008");
       portLabel = new JLabel("Port:");
       rootDir = new RootChooser(System.getProperty("user.dir"));
       /// choose directories only
       rootDir.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
       rootLabel = new JLabel("Choose web root directory:");
       maintenanceDir = new MainChooser(System.getProperty("user.dir"));
       /// choose directories only
       maintenanceDir.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
       maintenanceLabel = new JLabel("Choose maintenance root directory:");
       maintenanceMode = new JCheckBox("Switch to maintenance mode");
       /// not selected by default
       maintenanceMode.setSelected(false);
       serverInfo = new JLabel("Start");
       /// add controls onto form 
       add(JPanel1, "Center");
       serverInfo.setBounds(0, 0, 20, 10);
       JPanel1.add(serverInfo);
       startStopButton.addActionListener(this);
       startStopButton.setBounds(35, 10, 2, 3);
       startStopButton.setLayout(null);
       JPanel1.add(startStopButton);
       JPanel1.add(maintenanceMode);
       JPanel1.add(portLabel);
       JPanel1.add(portSelect);
       /// set layout for directory choosers
       // rootDir.setBounds(0, 0, 100, 100);
       // rootDir.setLayout(null);
       JPanel1.add(rootLabel);
       JPanel1.add(rootDir);
       // maintenanceDir.setBounds(130, 20, 100, 100);
       // maintenanceDir.setLayout(null);
       JPanel1.add(maintenanceLabel);
       JPanel1.add(maintenanceDir); 
       }
     }

ラベルの setBounds()、setLocation()、ボタンの setBound() および setLayout(null) のバリエーションを試し、Dlg の場所をハードコーディングするために JFileChooser の拡張クラスを作成しました。

   static class RootChooser extends JFileChooser {
       private static final long serialVersionUID = 1L;

       protected JDialog createDialog(Component parent)
            throws HeadlessException {
          JDialog dlg = super.createDialog(parent);
          dlg.setLocation(0, 40); // new location does not apply
          return dlg;
       }

       RootChooser(String filePath) {
        super(filePath);
       }
    }

 static class MainChooser extends JFileChooser {
    private static final long serialVersionUID = 1L;

    protected JDialog createDialog(Component parent)
            throws HeadlessException {
        JDialog dlg = super.createDialog(parent);
        dlg.setLocation(200, 140); // does not work as expected
        return dlg;
    }

    MainChooser(String filePath) {
        super(filePath);
    }
 }

これらのコントロールを特定の場所に配置するにはどうすればよいですか?

4

1 に答える 1

2

これを行う

maintenanceDir = new MainChooser(System.getProperty("user.dir"));

customを default oneにダウンキャストするようになったため、maintenanceDirが宣言されている場合は役に立ちません。JFileChooserJFileChooser MainChooserJFileChooser

問題は、カスタムメソッドを持たないJFileChooser通常のインスタンスではなく、独自のカスタムのインスタンスを作成しないことです。JFileChoosercreateDialog(Component parent)

 ...
 private JFileChooser rootDir = null;
 private JLabel rootLabel = null;
 private JFileChooser maintenanceDir = null;
 ...

次のようにする必要があります。

 ...
 private RootChooser rootDir = null;
 private JLabel rootLabel = null;
 private MainChooser maintenanceDir = null;
 ...
于 2013-01-04T16:55:09.437 に答える