【问题标题】:Why is my GridLayout not working? (JPanel in JFrame)为什么我的 GridLayout 不起作用? (JFrame 中的 JPanel)
【发布时间】:2015-01-20 14:06:50
【问题描述】:

所以我很无聊,想用 Java 制作一个小突击队提示符。目前,我正在从 Linux 上的 Bash-Shell 重新制作 ls-command。由于命令提示符本身只是一个小窗口,因此我必须在单独的窗口中显示 ls-command 的结果,我想在右侧弹出一个包含目录中所有文件的小列表(这是 ls 所做的)的提示会很好。我只是将其命名为 sideWindow 并将其设为 JFrame,因为当我尝试将其设为 Dialog 时失败了。正如教程所建议的,我添加了一个 JPanel 并将其布局设置为网格,只有一列,因为我希望 sideWindow 基本上显示一个目录中所有文件的列表,一个文件在另一个文件下。因此行数取决于该目录中的文件数,Frame 的大小也是如此。

但由于某种原因,该窗口根本没有显示,我什至还没有设置它会显示的位置。我敢打赌,由于我缺乏经验,这是一个非常愚蠢的错误,但我就是想不通。

我的代码可能过于混乱和愚蠢,但我希望有人能告诉我我的错误是什么。重要的部分是我猜的 ls 方法。

提前致谢!

代码如下:

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.net.URI;
import java.io.*;


public class CommandPrompt extends JFrame implements KeyListener{

/**
 * 
 */
private static final long serialVersionUID = 1231231;
JTextField eingabe = new JTextField();
Desktop desktop = Desktop.getDesktop();
JLabel path = new JLabel();
String pathName = "/";

public CommandPrompt() {
    setTitle("Colamanndo");
    setSize(402,88);
    setResizable(false);
    setLayout(null);
    setBackground(Color.black);

    eingabe.setToolTipText("Ich mag Cola");
    eingabe.setSize(399,30);
    eingabe.setLocation(1,1);
    eingabe.setBackground(Color.black);
    eingabe.setForeground(Color.green);
    eingabe.addKeyListener(this);
    add(eingabe);

    path.setText(pathName);
    path.setToolTipText("Tu ich wirklich");
    path.setSize(399,30);
    path.setLocation(3,24);
    add(path);

    setVisible(true);
 }

public static void main(String[] args) {
    new test();
}

public void keyPressed(KeyEvent e) {
    if (e.getKeyCode() == 10) {
        String comm = eingabe.getText();
        eingabe.setText("");
        idCommand(comm);
    }

    if (e.getKeyCode() == 38) {
        eingabe.setText("Es klappt");
        //Eigentlich aus .txt Datei letzten Befehl lesen
    }
//  System.out.println(e.getKeyCode());
}

@Override
public void keyReleased(KeyEvent arg0) {
    // TODO Auto-generated method stub

}

@Override
public void keyTyped(KeyEvent arg0) {
    // TODO Auto-generated method stub

}

public void idCommand(String cText) {
    try {
    StringBuilder command = new StringBuilder();
    StringBuilder parameters = new StringBuilder();
    parameters.append("");

    for(int i = 0;i<cText.length();i++) {
        command.append(cText.charAt(i));
        if (cText.charAt(i) == ' ' || i == cText.length()-1) {
            if (command.toString().charAt(i) == ' ') {
                command.deleteCharAt(i);
            }               
            if (cText.length()>i+1) {
                for (int j=i+1;j<cText.length();j++) {
                    parameters.append(cText.charAt(j));
                }
            }   
            System.out.println("Command identified: /" + command.toString() + "/");
            System.out.println("Parameters identified: /" + parameters.toString() + "/");
            //command durch liste schicken
            if (command.toString().equals("exit")) {
                System.exit(0);
            } else
            if (command.toString().equals("netflix")) {
                desktop.browse(new URI("http://www.netflix.de"));
            } else
            if (command.toString().equals("vampire")) {
                desktop.browse(new URI("http://www.netflix.com/WiPlayer?locale=de-DE&movieid=70212855"));
            } else
            if (command.toString().equals("chrome")) {
                desktop.browse(new URI("http://www.google.com"));
            } else
            if (command.toString().equals("shutdown")) {
                Runtime.getRuntime().exec("sudo shutdown -s now");
            } else
            if (command.toString().equals("gedit")) {
                Runtime.getRuntime().exec("gedit");
            } else 
            if (command.toString().equals("cd")) {
                cd(parameters);
            } else
            if (command.toString().equals("ls")) {
                ls(parameters);
            }
            break;
            }
        }
        } catch (Exception e) {
            }

}

public void ls(StringBuilder parameters) {
    try {
        File directory = new File(pathName);
        String[] files = directory.list();

        //sideWindow is the frame that shows the files
        //in that directory
        JFrame sideWindow = new JFrame();
        sideWindow.setSize(files.length*30,100);
        sideWindow.setName("Files in" + pathName);
        JPanel filePanel = new JPanel();
        sideWindow.add(filePanel);
        filePanel.setLayout(new GridLayout(files.length,1));
    //  filess.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);

        if (parameters.toString().equals("-a")) {
            for (int i = 0;i<files.length;i++) {
            filePanel.add(new JLabel(files[i]));
            }

        } else {
            for (int i = 0;i<files.length;i++) {
                if (files[i].charAt(0) != '.') {
                    filePanel.add(new JLabel(files[i]));
                }
            }
        }
    //  pack();
        add(sideWindow);
        filePanel.setVisible(true);
        sideWindow.setVisible(true);    

    } catch (Exception e) {

    }
}

public void cd(StringBuilder parameters) {
    //falls die parameter leer sind, wird pathname zurückgesetzt
    if (parameters.toString().equals("")) {
        pathName = "/";
    }
    //falls bei path name am ende ein / ist, wird es entfernt   
    if (pathName.charAt(pathName.length()-1) == '/') {
        pathName = pathName.substring(0, pathName.length()-1);
    }
    //falls am anfang vom parameter kein / ist, dann wird eins hinzugefügt
    if (parameters.toString().charAt(0) != '/') {
        pathName += "/";
    }
    //die parameter werden an pathname rangehängt
    pathName += parameters.toString();
    path.setText(pathName);
}

public void addCommand(String commandName, String commandCode, boolean isBash) {

}

}

【问题讨论】:

  • 你的主方法调用 new test();那是什么?你可能想做类似 new CommandPrompt();
  • 哦,是的,该课程首先被称为测试,因为当我开始这个程序时,我不知道该做什么。刚刚在发布之前重命名,这样你们就可以更轻松地区分窗口。忘记改主方法了,谢谢:)

标签: java swing layout grid jpanel


【解决方案1】:

我将其发布为答案,因为我无法发表评论 (

如果您可以只发布代码的相关部分,那将更有帮助,因为它使我们这些人更容易找到问题。

另外,如果您只想显示单列而不是网格布局(来自您的问题),我建议您使用 BoxLayout。

另外,由于 sideWindow 是一个 JFrame,我认为不能使用 add 方法将它添加到另一个 JFrame。为此,请将 sideWindow 设置为 JPanel 并进行必要的更改。或者,如果您希望它在新窗口中打开,请为它创建一个新类,然后调用它的构造函数来启动它。

【讨论】:

  • 谢谢,这真的很有帮助。我现在使用 BoxLayout 并创建了一个扩展 JFrame 的额外类 lsWindow。
  • 很高兴为您提供帮助 :) 查看 JFrame 和 JPanel 的 Java 文档可能会对您有所帮助。点赞也不会受到伤害:D 需要 1 个代表发表评论
  • @namsnath 这是一个答案,所以真的没有必要说你没有足够的代表来发表评论。
猜你喜欢
  • 1970-01-01
  • 2019-08-07
  • 1970-01-01
  • 2012-05-09
  • 1970-01-01
  • 2011-01-30
  • 1970-01-01
  • 1970-01-01
  • 2017-04-04
相关资源
最近更新 更多