java - 从一个单独的类(class)开始一个类(class)

标签 java swing

我正在创建一个 TCP 服务器/客户端系统。目前我已经创建了一个 ConnectionFrame.java 文件,包括一个 JFrame 和一个 JButtonJTextArea 和一个 JTextField。当启动我的客户端时,我希望这个 JFrame 出现(因此当我启动我的 client.jar 时,ConnectionFrame 也应该被执行。

我假设我可以通过将以下行放入客户端的主要方法来做到这一点:

ConnectionFrame cf = new ConnectionFrame();

但是没有运气。另一个尝试是写:

ConnectionFrame.main(argv);

出于某种原因,这似乎弄乱了我的原始代码。

编辑:为上下文添加代码

连接框架:

public class ConnectionFrame extends JFrame implements ActionListener {

    JButton buttonLayout = new JButton("Connect to server");
    JTextField textFieldLayout = new JTextField(1);
    JTextArea consoleOutput = new JTextArea(1,20);

    public void addComponentToPane(Container pane) {

        buttonLayout.addActionListener(this);
        textFieldLayout.setHorizontalAlignment(JTextField.CENTER);
        consoleOutput.setEditable(false);

        pane.add(buttonLayout, BorderLayout.PAGE_START);
        pane.add(textFieldLayout, BorderLayout.CENTER);
        pane.add(consoleOutput, BorderLayout.PAGE_END); 
    }

    public static void ConnectionFrame() {
        ConnectionFrame frame = new ConnectionFrame();
        frame.addComponentToPane(frame.getContentPane());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true); 

    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if("Connect to server".equals(e.getActionCommand())){
            consoleOutput.append("CONSOLE: Triggered");
        }
    }

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

客户:

public class TCPClient {

    public static void main(String argv[]) throws Exception {

        ConnectionFrame cf = new ConnectionFrame();

        String sentence;
        String modifiedSentence;
        BufferedReader inFromUser = new BufferedReader( new InputStreamReader(System.in));
        Socket clientSocket = new Socket("localhost", 54343);
        DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());

        CanvasFrame myFrame = new CanvasFrame();
        myFrame.setVisible(true);
        ArrayList<Point> points = myFrame.location;

        outToServer.writeInt(points.size());

        for(Point p : points)
        {
            outToServer.writeInt(p.x);
            outToServer.writeInt(p.y);
        }

        BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        sentence = inFromUser.readLine();
        outToServer.writeBytes(sentence + '\n');
        modifiedSentence = inFromServer.readLine();
        System.out.println("FROM SERVER: " + modifiedSentence);
        clientSocket.close();
    }
}

最佳答案

您需要为 event-dispatching thread 安排创建任务,如下所示:

SwingUtilities.invokeLater(
        new Runnable() {
            public void run() {
                ConnectionFrame();
            }
        }
);

在 Java 8 中它将是:

   SwingUtilities.invokeLater(ConnectionFrame::ConnectionFrame);

关于java - 从一个单独的类(class)开始一个类(class),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36694267/

相关文章:

java - 为加载到 Spring 的 Props 文件中的属性自动修剪尾随空白

java - Java 和 Spring 中文件支持的持久性选项

java - Java SWING 程序中的事件调度线程

java - 使用 Oracle SQL 结果集填充 Java swing JComboBox

java - 在 2 个或更多正则表达式中拆分字符串

java - 通过 JMX 获取进程 ID

java - 无法实现 Queue - 不覆盖抽象方法 offer(java.lang.Object)

java - 如何拥有透明模糊背景的 JFrame

java - 尝试创建多个 JLabel,但只出现一个

java - 分析软件--跟随行动--这叫什么?